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);
        }
        private ChiselColliderComponents CreateColliderComponents(ChiselModel model, GeneratedMeshDescription meshDescription)
        {
            var gameObject         = CreateComponentGameObject(model, GeneratedMeshColliderName, typeof(MeshCollider));
            var colliderComponents = new ChiselColliderComponents
            {
                meshCollider = gameObject.GetComponent <MeshCollider>(),
                gameObject   = gameObject,
                transform    = gameObject.transform
            };

            return(colliderComponents);
        }
Example #3
0
        private CSGRenderComponents CreateRenderComponents(CSGModel model, GeneratedMeshDescription meshDescription)
        {
            var gameObject       = CreateComponentGameObject(model, GeneratedMeshRendererName, typeof(MeshFilter), typeof(MeshRenderer));
            var renderComponents = new CSGRenderComponents
            {
                meshFilter   = gameObject.GetComponent <MeshFilter>(),
                meshRenderer = gameObject.GetComponent <MeshRenderer>(),
                gameObject   = gameObject,
                transform    = gameObject.transform
            };

            return(renderComponents);
        }
Example #4
0
        public bool RetrieveUnityMesh(ChiselModel model, GeneratedMeshDescription meshDescription, UnityEngine.Mesh sharedMesh)
        {
            // Retrieve the generatedMesh, and store it in the Unity Mesh
            model.generatedMeshContents = model.Node.GetGeneratedMesh(meshDescription, model.generatedMeshContents);
            if (model.generatedMeshContents == null)
            {
                return(false);
            }

            model.generatedMeshContents.CopyTo(sharedMesh);
            SetHasLightmapUVs(sharedMesh, false);
            return(true);
        }
        private static bool ValidateMesh(GeneratedMeshDescription meshDescription)
        {
            var indexCount  = meshDescription.indexCount;
            var vertexCount = meshDescription.vertexCount;

            if ((vertexCount <= 0 || vertexCount > MaxVertexCount) || (indexCount <= 0))
            {
                if (vertexCount > 0 && indexCount > 0)
                {
                    Debug.LogError("Mesh has too many vertices (vertexCount > " + MaxVertexCount + ")");
                }
                return(false);
            }
            return(true);
        }
        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);
        }
Example #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);
        }
 static int MeshDescriptionSorter(GeneratedMeshDescription x, GeneratedMeshDescription y)
 {
     if (x.meshQuery.LayerParameterIndex != y.meshQuery.LayerParameterIndex)
     {
         return(((int)x.meshQuery.LayerParameterIndex) - ((int)y.meshQuery.LayerParameterIndex));
     }
     if (x.meshQuery.LayerQuery != y.meshQuery.LayerQuery)
     {
         return(((int)x.meshQuery.LayerQuery) - ((int)y.meshQuery.LayerQuery));
     }
     if (x.surfaceParameter != y.surfaceParameter)
     {
         return(((int)x.surfaceParameter) - ((int)y.surfaceParameter));
     }
     if (x.geometryHashValue != y.geometryHashValue)
     {
         return(((int)x.geometryHashValue) - ((int)y.geometryHashValue));
     }
     return(0);
 }
Example #9
0
        public void Update(ChiselModel model, GeneratedMeshDescription meshDescription)
        {
            // Retrieve the generatedMesh, and store it in the Unity Mesh
            var generatedMeshContents = model.Node.GetGeneratedMesh(meshDescription);

            if (generatedMeshContents == null || generatedMeshContents.indices.Length == 0)
            {
                if (sharedMesh.vertexCount > 0)
                {
                    sharedMesh.Clear(keepVertexLayout: true);
                }
            }
            else
            {
                sharedMesh.CopyFromPositionOnly(generatedMeshContents);
            }
            if (meshCollider.sharedMesh != sharedMesh)
            {
                meshCollider.sharedMesh = sharedMesh;
            }
            meshCollider.enabled = sharedMesh.vertexCount > 0;
            generatedMeshContents?.Dispose();
        }
Example #10
0
        private void UpdateRenderComponents(CSGModel model, ModelState modelState, GeneratedMeshDescription meshDescription, CSGRenderComponents renderComponents)
        {
            var meshRenderer = renderComponents.meshRenderer;

#if UNITY_EDITOR
            updateMeshRenderers.Add(meshRenderer);
#endif

            var query = meshDescription.meshQuery.LayerQuery;
            meshRenderer.receiveShadows = ((query & LayerUsageFlags.ReceiveShadows) == LayerUsageFlags.ReceiveShadows);
            switch (query & (LayerUsageFlags.Renderable | LayerUsageFlags.CastShadows))
            {
            case LayerUsageFlags.None:                              meshRenderer.enabled = false; break;

            case LayerUsageFlags.Renderable:                meshRenderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;                   meshRenderer.enabled = true; break;

            case LayerUsageFlags.CastShadows:               meshRenderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.ShadowsOnly;   meshRenderer.enabled = true; break;

            case LayerUsageFlags.RenderCastShadows: meshRenderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.On;                    meshRenderer.enabled = true; break;
            }
#if UNITY_EDITOR
            UnityEditor.EditorUtility.SetSelectedRenderState(meshRenderer, UnityEditor.EditorSelectedRenderState.Hidden);
#endif
        }
        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);
        }
Example #15
0
        // NOTE: assumes that if a renderComponents are passed to this, they are -valid-
        //		 do any checking outside of this method, and make sure everything that
        //		 needs to be cleaned up, IS cleaned up
        private bool UpdateOrCreateRenderComponents(CSGModel model, ModelState modelState, GeneratedMeshDescription meshDescription, ref CSGRenderComponents renderComponents)
        {
            bool updated = false;

            if (renderComponents == null)
            {
                renderComponents = CreateRenderComponents(model, meshDescription);
                updated          = true;
            }

            UpdateRenderComponents(model, modelState, meshDescription, renderComponents);
            UpdateComponentFlags(model, modelState, renderComponents.meshRenderer, renderComponents.gameObject, renderComponents.transform, GeneratedMeshRendererName, notEditable: true);
            if (!renderComponents.meshRenderer.enabled)
            {
                renderComponents.meshRenderer.enabled = true;
            }
            return(updated);
        }
        private void UpdateColliderComponents(ChiselModel model, ModelState modelState, GeneratedMeshDescription meshDescription, ChiselColliderComponents colliderComponents)
        {
            var meshCollider = colliderComponents.meshCollider;

            updateMeshColliders.Add(meshCollider);
        }
        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);
        }
        // NOTE: assumes that if a meshCollider is passed to this, it is -valid-
        //		 do any checking outside of this method, and make sure everything that
        //		 needs to be cleaned up, IS cleaned up
        private bool UpdateOrCreateColliderComponents(ChiselModel model, ModelState modelState, GeneratedMeshDescription meshDescription, ref ChiselColliderComponents colliderComponents)
        {
            bool updated = false;

            if (colliderComponents == null)
            {
                colliderComponents = CreateColliderComponents(model, meshDescription);
                updated            = true;
            }
            UpdateColliderComponents(model, modelState, meshDescription, colliderComponents);
            UpdateComponentFlags(model, modelState, colliderComponents.meshCollider, colliderComponents.gameObject, colliderComponents.transform, GeneratedMeshColliderName, notEditable: true);
            if (!colliderComponents.meshCollider.enabled)
            {
                colliderComponents.meshCollider.enabled = true;
            }
            return(updated);
        }