private static bool UpdateMesh(CSGModel model,
                                       string baseName,
                                       GeneratedMeshDescription meshDescription,
                                       RenderSurfaceType renderSurfaceType,
                                       ref bool outputHasGeneratedNormals,
                                       ref Mesh sharedMesh,
                                       bool editorOnly = false)
        {
            // create our arrays on the C# side with the correct size
            GeneratedMeshContents generatedMesh;
            var startGetModelMeshesTime = EditorApplication.timeSinceStartup;

            {
                generatedMesh = External.GetModelMesh(model.modelNodeID, meshDescription);
                if (generatedMesh == null)
                {
                    return(false);
                }
            }
            getModelMeshesTime += EditorApplication.timeSinceStartup - startGetModelMeshesTime;

            UpdateMesh(baseName,
                       generatedMesh,
                       meshDescription,
                       renderSurfaceType,
                       ref outputHasGeneratedNormals,
                       ref sharedMesh,
                       editorOnly);
            return(true);
        }
示例#2
0
 private MeshInstanceKey(RenderSurfaceType renderSurfaceType, int subMeshIndex, int meshType, int renderMaterialInstanceID, int physicsMaterialInstanceID)
 {
     RenderSurfaceType         = renderSurfaceType;
     SubMeshIndex              = subMeshIndex;
     MeshType                  = meshType;
     RenderMaterialInstanceID  = renderMaterialInstanceID;
     PhysicsMaterialInstanceID = physicsMaterialInstanceID;
 }
        public static MeshInstanceKey GenerateKey(RenderSurfaceType renderSurfaceType, Material renderMaterial, PhysicMaterial physicsMaterial)
        {
            var realRenderMaterial = renderMaterial;

            if (renderSurfaceType != RenderSurfaceType.Normal)
            {
                realRenderMaterial = null;
            }

            return(new MeshInstanceKey(renderSurfaceType, (!realRenderMaterial) ? 1 : realRenderMaterial.GetInstanceID(),
                                       (!physicsMaterial) ? 1 : physicsMaterial.GetInstanceID()));
        }
示例#4
0
        public void Reset()
        {
            RenderMaterial    = null;
            PhysicsMaterial   = null;
            RenderSurfaceType = (RenderSurfaceType)999;

            HasGeneratedNormals = false;
            HasUV2            = false;
            ResetUVTime       = float.PositiveInfinity;
            LightingHashValue = 0;

            Dirty = true;

            CachedMeshCollider   = null;
            CachedMeshFilter     = null;
            CachedMeshRenderer   = null;
            CachedMeshRendererSO = null;
        }
示例#5
0
        internal static Material GetSurfaceMaterial(RenderSurfaceType renderSurfaceType)
        {
            switch (renderSurfaceType)
            {
            case RenderSurfaceType.Discarded:       return(DiscardedMaterial);

            case RenderSurfaceType.Invisible:       return(InvisibleMaterial);

            case RenderSurfaceType.Collider:        return(ColliderMaterial);

            case RenderSurfaceType.Trigger:         return(TriggerMaterial);

            case RenderSurfaceType.ShadowOnly:      return(ShadowOnlyMaterial);

            case RenderSurfaceType.Normal:          return(null);

            default:                                                        return(null);
            }
        }
        public static bool UpdateMesh(string baseName,
                                      GeneratedMeshContents generatedMesh,
                                      GeneratedMeshDescription inputMeshDescription,
                                      RenderSurfaceType renderSurfaceType,
                                      ref bool outputHasGeneratedNormals,
                                      ref Mesh sharedMesh,
                                      bool editorOnly)
        {
            var startUpdateMeshTime = EditorApplication.timeSinceStartup;

            {
                MeshInstanceManager.ClearOrCreateMesh(baseName, editorOnly, ref outputHasGeneratedNormals, ref sharedMesh);

                // finally, we start filling our (sub)meshes using the C# arrays
                sharedMesh.vertices = generatedMesh.positions;
                if (generatedMesh.normals != null)
                {
                    sharedMesh.normals = generatedMesh.normals;
                }
                if (generatedMesh.tangents != null)
                {
                    sharedMesh.tangents = generatedMesh.tangents;
                }
//				if (generatedMesh.colors   != null) sharedMesh.colors	= generatedMesh.colors;
                if (generatedMesh.uv0 != null)
                {
                    sharedMesh.uv = generatedMesh.uv0;
                }

                // fill the mesh with the given indices
                sharedMesh.SetTriangles(generatedMesh.indices, 0, calculateBounds: true);
                //sharedMesh.RecalculateBounds();
                //sharedMesh.bounds = generatedMesh.bounds; // why doesn't this work?
            }
            updateMeshTime += EditorApplication.timeSinceStartup - startUpdateMeshTime;

            if (renderSurfaceType != RenderSurfaceType.Normal)
            {
                outputHasGeneratedNormals = ((inputMeshDescription.meshQuery.UsedVertexChannels & VertexChannelFlags.Normal) != 0);
            }
            return(true);
        }
示例#7
0
        private static bool UpdateMesh(CSGModel model,
                                       GeneratedMeshDescription meshDescription,
                                       RenderSurfaceType renderSurfaceType,
                                       ref GeneratedMeshContents outputGeneratedMeshContents,
                                       ref bool outputHasGeneratedNormals,
                                       ref Mesh sharedMesh)
        {
            // create our arrays on the C# side with the correct size
            GeneratedMeshContents generatedMesh;
            var startGetModelMeshesTime = EditorApplication.timeSinceStartup;

            {
                generatedMesh = External.GetModelMesh(model.modelNodeID, meshDescription);
                if (generatedMesh == null)
                {
                    return(false);
                }
            }
            getModelMeshesTime += EditorApplication.timeSinceStartup - startGetModelMeshesTime;

            UpdateMesh(generatedMesh,
                       meshDescription,
                       renderSurfaceType,
                       ref outputHasGeneratedNormals,
                       ref sharedMesh);

            /*
             #if UNITY_2018_3_OR_NEWER
             * var modelGameObject = model.gameObject;
             * var prefabStage = UnityEditor.Experimental.SceneManagement.PrefabStageUtility.GetPrefabStage(modelGameObject);
             * if (prefabStage != null && string.IsNullOrEmpty(AssetDatabase.GetAssetPath(sharedMesh)))
             * {
             *      var prefabAssetPath = prefabStage.prefabAssetPath;
             *      if (!string.IsNullOrEmpty(prefabAssetPath))
             *              AssetDatabase.AddObjectToAsset(sharedMesh, prefabAssetPath);
             *      UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(modelGameObject.scene);
             * }
             #endif
             */
            outputGeneratedMeshContents = generatedMesh;
            return(true);
        }
示例#8
0
        internal static Material GetSurfaceMaterial(RenderSurfaceType renderSurfaceType)
        {
            switch (renderSurfaceType)
            {
            case RenderSurfaceType.Hidden:                  return(HiddenMaterial);

            case RenderSurfaceType.Culled:                  return(CulledMaterial);

            case RenderSurfaceType.Collider:                return(ColliderMaterial);

            case RenderSurfaceType.Trigger:                 return(TriggerMaterial);

            case RenderSurfaceType.ShadowOnly:              return(ShadowOnlyMaterial);

            case RenderSurfaceType.CastShadows:             return(CastShadowsMaterial);

            case RenderSurfaceType.ReceiveShadows:  return(ReceiveShadowsMaterial);

            case RenderSurfaceType.Normal:                  return(null);

            default:                                                                return(null);
            }
        }
        private static HelperSurfaceDescription GenerateHelperSurfaceDescription(GeneratedMeshes meshContainer, CSGModel model, ModelSettingsFlags modelSettings, GeneratedMeshDescription meshDescription, RenderSurfaceType renderSurfaceType)
        {
            HelperSurfaceDescription helperSurfaceDescription = MeshInstanceManager.CreateHelperSurfaceDescription(meshContainer, modelSettings, meshDescription, renderSurfaceType);

            helperSurfaceDescription.MeshDescription = meshDescription;
            if (!UpdateMesh(model, renderSurfaceMeshNames[(int)renderSurfaceType],
                            helperSurfaceDescription.MeshDescription,
                            helperSurfaceDescription.RenderSurfaceType,
                            ref helperSurfaceDescription.HasGeneratedNormals,
                            ref helperSurfaceDescription.SharedMesh,
                            editorOnly: true))
            {
                return(null);
            }
            return(helperSurfaceDescription);
        }
        private static bool TryGetHelperSurfaceDescription(GeneratedMeshes meshContainer, CSGModel model, ModelSettingsFlags modelSettings, GeneratedMeshDescription meshDescription, RenderSurfaceType renderSurfaceType, out HelperSurfaceDescription helperSurfaceDescription)
        {
            var startGetMeshInstanceTime = EditorApplication.timeSinceStartup;

            helperSurfaceDescription = MeshInstanceManager.GetHelperSurfaceDescription(meshContainer, modelSettings, meshDescription, renderSurfaceType);
            getMeshInstanceTime     += EditorApplication.timeSinceStartup - startGetMeshInstanceTime;
            if (helperSurfaceDescription != null &&
                meshDescription == helperSurfaceDescription.MeshDescription &&
                helperSurfaceDescription.SharedMesh &&
                helperSurfaceDescription.IsValid())
            {
                return(true);
            }
            helperSurfaceDescription = null;
            return(true);
        }
        private static GeneratedMeshInstance GenerateMeshInstance(GeneratedMeshes meshContainer, CSGModel model, ModelSettingsFlags modelSettings, GeneratedMeshDescription meshDescription, RenderSurfaceType renderSurfaceType, List <GameObject> unusedInstances)
        {
            GeneratedMeshInstance meshInstance = MeshInstanceManager.CreateMeshInstance(meshContainer, meshDescription, modelSettings, renderSurfaceType, unusedInstances);

            string baseName;

            switch (renderSurfaceType)
            {
            case RenderSurfaceType.Collider:    baseName = "Collider"; break;

            case RenderSurfaceType.Normal:      baseName = "Renderable"; break;

            default:                            baseName = "Unknown"; break;
            }

            meshInstance.MeshDescription = meshDescription;
            if (!UpdateMesh(model, baseName,
                            meshInstance.MeshDescription,
                            meshInstance.RenderSurfaceType,
                            ref meshInstance.HasGeneratedNormals,
                            ref meshInstance.SharedMesh))
            {
                return(null);
            }

            return(meshInstance);
        }
        private static bool TryGetMeshInstance(GeneratedMeshes meshContainer, CSGModel model, ModelSettingsFlags modelSettings, GeneratedMeshDescription meshDescription, RenderSurfaceType renderSurfaceType, out GeneratedMeshInstance meshInstance)
        {
            var startGetMeshInstanceTime = EditorApplication.timeSinceStartup;

            meshInstance         = MeshInstanceManager.GetMeshInstance(meshContainer, meshDescription, modelSettings, renderSurfaceType);
            getMeshInstanceTime += EditorApplication.timeSinceStartup - startGetMeshInstanceTime;
            if (meshInstance &&
                meshDescription == meshInstance.MeshDescription &&
                meshInstance.SharedMesh &&
                meshInstance.IsValid())
            {
                return(true);
            }

            meshInstance = null;
            return(true);
        }
        private static HelperSurfaceDescription GenerateHelperSurfaceDescription(GeneratedMeshes meshContainer, CSGModel model, ModelSettingsFlags modelSettings, GeneratedMeshDescription meshDescription, RenderSurfaceType renderSurfaceType)
        {
            HelperSurfaceDescription helperSurfaceDescription;

            var startGetMeshInstanceTime = EditorApplication.timeSinceStartup;

            {
                helperSurfaceDescription = MeshInstanceManager.GetHelperSurfaceDescription(meshContainer, modelSettings, meshDescription, renderSurfaceType);
            }
            getMeshInstanceTime += EditorApplication.timeSinceStartup - startGetMeshInstanceTime;
            if (meshDescription == helperSurfaceDescription.MeshDescription &&
                helperSurfaceDescription.SharedMesh &&
                helperSurfaceDescription.IsValid())
            {
                return(helperSurfaceDescription);
            }

            helperSurfaceDescription.MeshDescription = meshDescription;
            if (!UpdateMesh(model,
                            helperSurfaceDescription.MeshDescription,
                            helperSurfaceDescription.RenderSurfaceType,
                            ref helperSurfaceDescription.HasGeneratedNormals,
                            ref helperSurfaceDescription.SharedMesh))
            {
                return(null);
            }

            return(helperSurfaceDescription);
        }
        private static GeneratedMeshInstance GenerateMeshInstance(GeneratedMeshes meshContainer, CSGModel model, ModelSettingsFlags modelSettings, GeneratedMeshDescription meshDescription, RenderSurfaceType renderSurfaceType)
        {
            GeneratedMeshInstance meshInstance;

            var startGetMeshInstanceTime = EditorApplication.timeSinceStartup;

            {
                meshInstance = MeshInstanceManager.GetMeshInstance(meshContainer, meshDescription, modelSettings, renderSurfaceType);
                if (!meshInstance)
                {
                    return(null);
                }
            }

            getMeshInstanceTime += EditorApplication.timeSinceStartup - startGetMeshInstanceTime;
            if (meshDescription == meshInstance.MeshDescription &&
                meshInstance.SharedMesh &&
                meshInstance.IsValid())
            {
                return(meshInstance);
            }

            meshInstance.MeshDescription = meshDescription;
            if (!UpdateMesh(model,
                            meshInstance.MeshDescription,
                            meshInstance.RenderSurfaceType,
                            ref meshInstance.HasGeneratedNormals,
                            ref meshInstance.SharedMesh))
            {
                return(null);
            }

            return(meshInstance);
        }
 private MeshInstanceKey(RenderSurfaceType renderSurfaceType, int renderMaterialInstanceID, int physicsMaterialInstanceID)
 {
     RenderSurfaceType         = renderSurfaceType;
     RenderMaterialInstanceID  = renderMaterialInstanceID;
     PhysicsMaterialInstanceID = physicsMaterialInstanceID;
 }