private GameObject LoadSdfPart(SdfPart sdfPart, Transform parent) { string geoFilename = sdfPart.Name + ".geo"; if (!VirtualFilesystem.Instance.FileExists(geoFilename)) { Debug.LogWarning("File does not exist: " + geoFilename); return(null); } GameObject partObj = ImportGeo(geoFilename, null, _3DObjectPrefab, 0); partObj.transform.parent = parent; partObj.transform.localPosition = sdfPart.Position; partObj.transform.localRotation = Quaternion.identity; return(partObj); }
private void LoadCarPart(SdfPart sdfPart, GameObject parent, Dictionary <string, GameObject> partDict, List <SdfPart> deferredParts, Vtf vtf, GameObject prefab, bool justChassis, bool forgetParentPosition, int textureGroup, int layerMask) { if (sdfPart == null || sdfPart.Name == "NULL") { return; } if (_bannedNames.Any(b => sdfPart.Name.EndsWithFast(b))) { return; } GameObject parentObj; if (sdfPart.ParentName == "WORLD") { parentObj = parent; } else if (!partDict.TryGetValue(sdfPart.ParentName, out parentObj)) { if (deferredParts != null) { deferredParts.Add(sdfPart); return; } Debug.Log("Cant find parent '" + sdfPart.ParentName + "' for '" + sdfPart.Name + "'"); parentObj = parent; } if (justChassis && !(sdfPart.Name.Contains("BDY") || sdfPart.Name.EndsWithFast("CHAS"))) { return; } string geoFilename = sdfPart.Name + ".geo"; if (!VirtualFilesystem.Instance.FileExists(geoFilename)) { Debug.LogWarning("File does not exist: " + geoFilename); return; } GameObject partObj = ImportGeo(geoFilename, vtf, prefab, textureGroup); Transform partTransform = partObj.transform; if (!forgetParentPosition) { partTransform.SetParent(parentObj.transform); } partTransform.right = sdfPart.Right; partTransform.up = sdfPart.Up; partTransform.forward = sdfPart.Forward; partTransform.localPosition = sdfPart.Position; partTransform.localRotation = Quaternion.identity; if (forgetParentPosition) { partTransform.parent = parentObj.transform; } partObj.SetActive(true); if (partDict.ContainsKey(sdfPart.Name)) { partDict[sdfPart.Name] = partObj; } else { partDict.Add(sdfPart.Name, partObj); } if (layerMask != 0) { partObj.layer = layerMask; } // Special case for mirrors. if (sdfPart.Name.Contains("MIRI") && TryGetMaskTexture(geoFilename, out Texture2D maskTexture)) { RenderTexture renderTexture = new RenderTexture(256, 128, 24); GameObject mirrorCameraObj = Object.Instantiate(partObj); Transform mirrorObjTransform = mirrorCameraObj.transform; mirrorObjTransform.SetParent(partObj.transform); mirrorObjTransform.localPosition = Vector3.zero; mirrorObjTransform.localRotation = Quaternion.identity; Material mirrorMaterial = Object.Instantiate(_carMirrorMaterialPrefab); MeshRenderer meshRenderer = partObj.transform.GetComponent <MeshRenderer>(); mirrorMaterial.mainTexture = meshRenderer.material.mainTexture; mirrorMaterial.SetTexture("_MaskTex", maskTexture); meshRenderer.material = mirrorMaterial; GameObject cameraPivotObj = new GameObject("Camera Pivot"); UnityEngine.Camera mirrorCamera = cameraPivotObj.AddComponent <UnityEngine.Camera>(); mirrorCamera.cullingMask = ~LayerMask.GetMask("FirstPerson"); mirrorCamera.targetTexture = renderTexture; Transform pivotTransform = cameraPivotObj.transform; pivotTransform.SetParent(mirrorObjTransform); pivotTransform.localPosition = Vector3.zero; pivotTransform.localRotation = Quaternion.Euler(0f, 180f, 0f); Material cameraMaterial = Object.Instantiate(_carMirrorMaterialPrefab); cameraMaterial.mainTexture = renderTexture; MeshRenderer mirrorRenderer = mirrorCameraObj.GetComponent <MeshRenderer>(); cameraMaterial.SetTexture("_MaskTex", maskTexture); mirrorRenderer.material = cameraMaterial; } }