/// <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; }
/// <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(); }
/// <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; }
/// <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; }
/// <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 }
/// <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); }