Beispiel #1
0
        /// <summary>
        /// Looks for all visual mesh tasks and writes the generated meshes to the chunk.
        /// </summary>
        /// <param name="taskStack">The task stack.</param>
        /// <param name="chunk">The chunk to update.</param>
        private void UpdateVisualMesh(RemeshTaskStack taskStack, BlockChunk chunk)
        {
            var meshFilter   = chunk.GetComponent <MeshFilter>();
            var meshRenderer = chunk.GetComponent <MeshRenderer>();
            var visualMesh   = meshFilter.sharedMesh;

            ApplyVertexData <VisualRemeshTask>(taskStack, visualMesh);

            var materials = new Material[visualMesh.subMeshCount];

            int baseVertex   = 0;
            int submeshIndex = 0;

            for (int i = 0; i < taskStack.TaskCount; i++)
            {
                var task = taskStack.GetTask(i);

                if (task is VisualRemeshTask vis)
                {
                    var newMesh = vis.Finish();
                    visualMesh.SetTriangles(newMesh.Triangles, submeshIndex, true, baseVertex);
                    materials[submeshIndex] = m_BlockList.GetMaterial(vis.MaterialID);

                    submeshIndex++;
                    baseVertex += newMesh.Vertices.Count;
                }
            }

            meshFilter.sharedMesh        = visualMesh;
            meshRenderer.sharedMaterials = materials;
        }
Beispiel #2
0
        /// <summary>
        /// Updates mesh data for the given chunk.
        /// </summary>
        /// <param name="taskStack">The set of remesh tasks.</param>
        /// <param name="chunk">The chunk to update.</param>
        internal void UpdateMesh(RemeshTaskStack taskStack, BlockChunk chunk)
        {
            UpdateVisualMesh(taskStack, chunk);
            UpdateCollisionMesh(taskStack, chunk);

            m_ProcMesh.Clear();
        }
Beispiel #3
0
        /// <summary>
        /// Looks for all collision mesh tasks and writes the generated meshes to the chunk.
        /// </summary>
        /// <param name="taskStack">The task stack.</param>
        /// <param name="chunk">The chunk to update.</param>
        private void UpdateCollisionMesh(RemeshTaskStack taskStack, BlockChunk chunk)
        {
            var meshCollider  = chunk.GetComponent <MeshCollider>();
            var collisionMesh = meshCollider.sharedMesh;

            ApplyVertexData <CollisionRemeshTask>(taskStack, collisionMesh);

            int baseVertex   = 0;
            int submeshIndex = 0;

            for (int i = 0; i < taskStack.TaskCount; i++)
            {
                var task = taskStack.GetTask(i);

                if (task is CollisionRemeshTask vis)
                {
                    var newMesh = vis.Finish();
                    collisionMesh.SetTriangles(newMesh.Triangles, submeshIndex, true, baseVertex);

                    submeshIndex++;
                    baseVertex += newMesh.Vertices.Count;
                }
            }

            meshCollider.sharedMesh = collisionMesh;
        }
Beispiel #4
0
        /// <summary>
        /// Applied the given visual and collision meshes to the chunk object.
        /// </summary>
        /// <param name="chunk">The chunk to refresh.</param>
        /// <param name="visualMesh">The new visual mesh data.</param>
        /// <param name="collisionMesh">The new collision mesh data.</param>
        public void RefreshMeshes(BlockChunk chunk, RemeshFinishEvent ev, Bones3TextureAtlasList atlasList)
        {
            var visualMesh    = ev.Report.VisualMesh;
            var collisionMesh = ev.Report.CollisionMesh;
            var atlases       = ev.Report.Atlases;

            var meshFilter   = chunk.GetComponent <MeshFilter>();
            var meshCollider = chunk.GetComponent <MeshCollider>();
            var meshRenderer = chunk.GetComponent <MeshRenderer>();

            UpdateMesh(visualMesh, meshFilter.sharedMesh);
            UpdateMesh(collisionMesh, meshCollider.sharedMesh);

            var materials = new Material[visualMesh.TotalLayers];

            for (int i = 0; i < materials.Length; i++)
            {
                materials[i] = atlasList.GetAtlas(atlases[i]).Material;
            }

            meshRenderer.sharedMaterials = materials;

            // To trigger a refresh.
            meshFilter.sharedMesh   = meshFilter.sharedMesh;
            meshCollider.sharedMesh = meshCollider.sharedMesh;
        }
Beispiel #5
0
        /// <summary>
        /// Destroys a chunk game object and attached resources.
        /// </summary>
        /// <param name="chunk">The chunk to destroy.</param>
        internal void DestroyChunk(BlockChunk chunk)
        {
#if UNITY_EDITOR
            if (Application.isPlaying)
            {
                Object.Destroy(chunk.GetComponent <MeshFilter>().sharedMesh);
                Object.Destroy(chunk.GetComponent <MeshCollider>().sharedMesh);
                Object.Destroy(chunk.gameObject);
            }
            else
            {
                Object.DestroyImmediate(chunk.GetComponent <MeshFilter>().sharedMesh);
                Object.DestroyImmediate(chunk.GetComponent <MeshCollider>().sharedMesh);
                Object.DestroyImmediate(chunk.gameObject);
            }
#else
            Object.Destroy(chunk.GetComponent <MeshFilter>().sharedMesh);
            Object.Destroy(chunk.GetComponent <MeshCollider>().sharedMesh);
            Object.Destroy(chunk.gameObject);
#endif
        }
Beispiel #6
0
 /// <summary>
 /// Destroys a chunk game object and attached resources.
 /// </summary>
 /// <param name="chunk">The chunk to destroy.</param>
 public void DestroyChunk(BlockChunk chunk)
 {
     Object.DestroyImmediate(chunk.GetComponent <MeshFilter>().sharedMesh);
     Object.DestroyImmediate(chunk.GetComponent <MeshCollider>().sharedMesh);
     Object.DestroyImmediate(chunk.gameObject);
 }