Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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;
            }
        }