/// <summary> /// Instantiates a chunk to <paramref name="chunkCoordinate"/>, initializes it and generates its mesh /// </summary> /// <param name="chunkCoordinate">The coordinate of the chunk to create</param> /// <returns>The new chunk</returns> public ChunkProperties CreateLoadedChunkToCoordinateImmediate(int3 chunkCoordinate) { ChunkProperties chunkProperties = CreateUnloadedChunkToCoordinate(chunkCoordinate); VoxelWorld.ChunkUpdater.GenerateVoxelDataAndMeshImmediate(chunkProperties); return(chunkProperties); }
/// <summary> /// Forces the regeneration of the mesh /// </summary> public void GenerateMeshImmediate(ChunkProperties chunkProperties) { JobHandleWithData <IMesherJob> jobHandleWithData = VoxelWorld.VoxelMesher.CreateMesh(VoxelWorld.VoxelDataStore, VoxelWorld.VoxelColorStore, chunkProperties.ChunkCoordinate); if (jobHandleWithData == null) { return; } IMesherJob job = jobHandleWithData.JobData; Mesh mesh = new Mesh(); SubMeshDescriptor subMesh = new SubMeshDescriptor(0, 0); jobHandleWithData.JobHandle.Complete(); int vertexCount = job.VertexCountCounter.Count * 3; job.VertexCountCounter.Dispose(); mesh.SetVertexBufferParams(vertexCount, MeshingVertexData.VertexBufferMemoryLayout); mesh.SetIndexBufferParams(vertexCount, IndexFormat.UInt16); mesh.SetVertexBufferData(job.OutputVertices, 0, 0, vertexCount, 0, MeshUpdateFlags.DontValidateIndices); mesh.SetIndexBufferData(job.OutputTriangles, 0, 0, vertexCount, MeshUpdateFlags.DontValidateIndices); job.OutputVertices.Dispose(); job.OutputTriangles.Dispose(); mesh.subMeshCount = 1; subMesh.indexCount = vertexCount; mesh.SetSubMesh(0, subMesh); mesh.RecalculateBounds(); chunkProperties.MeshFilter.sharedMesh = mesh; chunkProperties.MeshCollider.sharedMesh = mesh; chunkProperties.MeshCollider.enabled = true; chunkProperties.MeshRenderer.enabled = true; chunkProperties.HasChanges = false; chunkProperties.IsMeshGenerated = true; }
/// <summary> /// Instantiates a chunk to <paramref name="chunkCoordinate"/> and initializes it, but does not generate its mesh /// </summary> /// <param name="chunkCoordinate">The chunk's coordinate</param> /// <returns>The new chunk</returns> protected ChunkProperties CreateUnloadedChunkToCoordinate(int3 chunkCoordinate) { int3 worldPosition = chunkCoordinate * VoxelWorld.WorldSettings.ChunkSize; GameObject chunkGameObject = Instantiate(VoxelWorld.WorldSettings.ChunkPrefab, worldPosition.ToVectorInt(), Quaternion.identity); ChunkProperties chunkProperties = new ChunkProperties { ChunkGameObject = chunkGameObject, MeshCollider = chunkGameObject.GetComponent <MeshCollider>(), MeshFilter = chunkGameObject.GetComponent <MeshFilter>(), MeshRenderer = chunkGameObject.GetComponent <MeshRenderer>() }; chunkProperties.Initialize(chunkCoordinate, VoxelWorld.WorldSettings.ChunkSize); VoxelWorld.ChunkStore.AddChunk(chunkCoordinate, chunkProperties); return(chunkProperties); }
/// <summary> /// Generates the voxel data and colors for this chunk and generates the mesh /// </summary> public void GenerateVoxelDataAndMeshImmediate(ChunkProperties chunkProperties) { VoxelWorld.VoxelDataStore.GenerateDataForChunk(chunkProperties.ChunkCoordinate); VoxelWorld.VoxelColorStore.GenerateDataForChunk(chunkProperties.ChunkCoordinate); GenerateMeshImmediate(chunkProperties); }