public WixelChunkMeshData BlockData(WixelChunk chunk, int x, int y, int z, WixelChunkMeshData meshData) { if (FaceInformation.Count == 0) { return(meshData); } // Programmer's Note // ----------------- // int x/y/z is fine due to how this is being used. Vector3 worldPosition = new Vector3(x, y, z); meshData.useRenderDataForCol = true; if (!chunk.GetBlock(x, y + 1, z).IsSolid(WixelDirection.Down)) { meshData = FaceData(WixelDirection.Up, chunk, worldPosition, meshData); } if (!chunk.GetBlock(x, y - 1, z).IsSolid(WixelDirection.Up)) { meshData = FaceData(WixelDirection.Down, chunk, worldPosition, meshData); } if (!chunk.GetBlock(x, y, z + 1).IsSolid(WixelDirection.South)) { meshData = FaceData(WixelDirection.North, chunk, worldPosition, meshData); } if (!chunk.GetBlock(x, y, z - 1).IsSolid(WixelDirection.North)) { meshData = FaceData(WixelDirection.South, chunk, worldPosition, meshData); } if (!chunk.GetBlock(x + 1, y, z).IsSolid(WixelDirection.West)) { meshData = FaceData(WixelDirection.East, chunk, worldPosition, meshData); } if (!chunk.GetBlock(x - 1, y, z).IsSolid(WixelDirection.East)) { meshData = FaceData(WixelDirection.West, chunk, worldPosition, meshData); } return(meshData); }
// Sends the calculated mesh information // to the mesh and collision components private void RenderMesh(WixelChunkMeshData meshData) { Filter.mesh.Clear(); Filter.mesh.vertices = meshData.vertices.ToArray(); Filter.mesh.triangles = meshData.triangles.ToArray(); Filter.mesh.uv = meshData.uv.ToArray(); Filter.mesh.RecalculateNormals(); Collider.sharedMesh = null; Mesh mesh = new Mesh(); mesh.vertices = meshData.colVertices.ToArray(); mesh.triangles = meshData.colTriangles.ToArray(); mesh.RecalculateNormals(); Collider.sharedMesh = mesh; }
private void UpdateChunk() { IsRendered = true; WixelChunkMeshData meshData = new WixelChunkMeshData(); for (int x = 0; x < chunkSize; x++) { for (int y = 0; y < chunkSize; y++) { for (int z = 0; z < chunkSize; z++) { var block = _blocks[x, y, z]; meshData = block.BlockData(this, x, y, z, meshData); } } } RenderMesh(meshData); }
private WixelChunkMeshData FaceData(WixelDirection direction, WixelChunk chunk, Vector3 worldPosition, WixelChunkMeshData meshData) { if (FaceInformation.Count == 0) { return(meshData); } WixelDirectionInformation faceInfo = GetInformationByDirection(direction); for (int i = 0; i < faceInfo.Vertices.Count; i++) { Vector3 vertexPosition = faceInfo.Vertices[i] * blockScale; Vector3 actualPosition = vertexPosition + worldPosition; meshData.AddVertex(actualPosition); } meshData.AddQuadTriangles(); meshData.uv.AddRange(FaceUVs(direction)); return(meshData); }