private SliceMeshData FaceDataWest(Slice slice, int x, float y, int z, SliceMeshData meshData) { int sliceXOffset = -(Map.XZOffset * Map.VoxelsInXZ); int sliceYOffset = -Map.YOffset; int sliceZOffset = -(Map.XZOffset * Map.VoxelsInXZ); meshData.AddVertex(new Vector3(x - 0.5f + sliceXOffset, y - 0.5f + sliceYOffset, z + 0.5f + sliceZOffset)); meshData.AddVertex(new Vector3(x - 0.5f + sliceXOffset, y + 0.5f + Map.VoxelFloorHeight + sliceYOffset, z + 0.5f + sliceZOffset)); meshData.AddVertex(new Vector3(x - 0.5f + sliceXOffset, y + 0.5f + Map.VoxelFloorHeight + sliceYOffset, z - 0.5f + sliceZOffset)); meshData.AddVertex(new Vector3(x - 0.5f + sliceXOffset, y - 0.5f + sliceYOffset, z - 0.5f + sliceZOffset)); meshData.AddQuadTris(); meshData.uvs.AddRange(FaceUVs()); return(meshData); }
// ----- Rendering private SliceMeshData FaceDataUp(Slice slice, int x, float y, int z, SliceMeshData meshData, bool IsUndiscovered = false) { int sliceXOffset = -(Map.XZOffset * Map.VoxelsInXZ); int sliceYOffset = -Map.YOffset; int sliceZOffset = -(Map.XZOffset * Map.VoxelsInXZ); meshData.AddVertex(new Vector3(x - 0.5f + sliceXOffset, y + 0.5f + Map.VoxelFloorHeight + sliceYOffset, z + 0.5f + sliceZOffset)); meshData.AddVertex(new Vector3(x + 0.5f + sliceXOffset, y + 0.5f + Map.VoxelFloorHeight + sliceYOffset, z + 0.5f + sliceZOffset)); meshData.AddVertex(new Vector3(x + 0.5f + sliceXOffset, y + 0.5f + Map.VoxelFloorHeight + sliceYOffset, z - 0.5f + sliceZOffset)); meshData.AddVertex(new Vector3(x - 0.5f + sliceXOffset, y + 0.5f + Map.VoxelFloorHeight + sliceYOffset, z - 0.5f + sliceZOffset)); meshData.AddQuadTris(); meshData.uvs.AddRange(FaceUVs(IsUndiscovered, true)); // true == IsTop return(meshData); }
public SliceMeshData BuildMesh(SliceMeshData.Type meshType) { SliceMeshData sliceMeshData = new SliceMeshData(); for (int x = 0; x < Map.VoxelsInXZ; x++) { for (int z = 0; z < Map.VoxelsInXZ; z++) { sliceMeshData = Voxels[x, z].AddToSliceMeshData(this, x, z, sliceMeshData, meshType); } } return(sliceMeshData); }
// Visualize the mesh handed to it by Map public void RenderMesh(SliceMeshData meshData) { MeshFilter.mesh.Clear(); MeshFilter.mesh.vertices = meshData.verts.ToArray(); MeshFilter.mesh.triangles = meshData.tris.ToArray(); MeshFilter.mesh.uv = meshData.uvs.ToArray(); MeshFilter.mesh.RecalculateNormals(); MeshCollider.sharedMesh = null; Mesh mesh = new Mesh(); mesh.vertices = meshData.cVerts.ToArray(); mesh.triangles = meshData.cTris.ToArray(); mesh.RecalculateNormals(); MeshCollider.sharedMesh = mesh; }
public SliceMeshData AddToSliceMeshData(Slice slice, int x, int z, SliceMeshData sliceMeshData, SliceMeshData.Type meshType, bool colliderToo = true) { if (IsTransparent()) { return(sliceMeshData); // Transparent, don't draw faces. Later modify for gas/liquid. } sliceMeshData.useRenderDataForCollider = colliderToo; float y = slice.Y * Map.VoxelFloorHeight; Voxel neighborVoxel = null; if (meshType == SliceMeshData.Type.Sides) { neighborVoxel = slice.GetVoxel(slice.X + x, slice.Y, slice.Z + z + 1); if (neighborVoxel == null || neighborVoxel.IsTransparent()) { sliceMeshData = FaceDataNorth(slice, x, y, z, sliceMeshData); } neighborVoxel = slice.GetVoxel(slice.X + x, slice.Y, slice.Z + z - 1); if (neighborVoxel == null || neighborVoxel.IsTransparent()) { sliceMeshData = FaceDataSouth(slice, x, y, z, sliceMeshData); } neighborVoxel = slice.GetVoxel(slice.X + x + 1, slice.Y, slice.Z + z); if (neighborVoxel == null || neighborVoxel.IsTransparent()) { sliceMeshData = FaceDataEast(slice, x, y, z, sliceMeshData); } neighborVoxel = slice.GetVoxel(slice.X + x - 1, slice.Y, slice.Z + z); if (neighborVoxel == null || neighborVoxel.IsTransparent()) { sliceMeshData = FaceDataWest(slice, x, y, z, sliceMeshData); } if (Map.DrawSliceBottoms) // Default: false - never seen by player. { neighborVoxel = slice.GetVoxel(slice.X + x, slice.Y - 1, slice.Z + z); if (neighborVoxel == null || neighborVoxel.IsTransparent()) { sliceMeshData = FaceDataDown(slice, x, y, z, sliceMeshData); } } } if (meshType == SliceMeshData.Type.Top) { neighborVoxel = slice.GetVoxel(slice.X + x, slice.Y + 1, slice.Z + z); if (neighborVoxel == null || neighborVoxel.IsTransparent() || Map.InDebugMode) { sliceMeshData = FaceDataUp(slice, x, y, z, sliceMeshData); } else if (neighborVoxel != null && !neighborVoxel.IsTransparent()) { sliceMeshData = FaceDataUp(slice, x, y, z, sliceMeshData, true); } } if (meshType == SliceMeshData.Type.Liquids) { // Not much to do here yet... } return(sliceMeshData); }