private void ClearVoxel(int x, int y, int z, int brushX, int brushY, int brushZ) { for (int i = 0; i < faces.Count; i++) { WallVolumeFace wallVolumeFace = faces[i]; if (((wallVolumeFace.posX >= x && wallVolumeFace.posX <= x + brushX - 1) || (wallVolumeFace.posX == x - 1 && wallVolumeFace.orientation == WallVolumeOrientaion.Right) || (wallVolumeFace.posX == x + brushX && wallVolumeFace.orientation == WallVolumeOrientaion.Left)) && ((wallVolumeFace.posY >= y && wallVolumeFace.posY <= y + brushY - 1) || (wallVolumeFace.posY == y - 1 && wallVolumeFace.orientation == WallVolumeOrientaion.Up) || (wallVolumeFace.posY == y + brushY && wallVolumeFace.orientation == WallVolumeOrientaion.Down)) && ((wallVolumeFace.posZ >= z && wallVolumeFace.posZ <= z + brushZ - 1) || (wallVolumeFace.posZ == z - 1 && wallVolumeFace.orientation == WallVolumeOrientaion.Forward) || (wallVolumeFace.posZ == z + brushZ && wallVolumeFace.orientation == WallVolumeOrientaion.Back))) { faces.RemoveAt(i); i--; } } }
public void FillMesh(Mesh mesh, bool forceExact) { if (forceExact) { vertices = new Vector3[faces.Count * 4]; normals = new Vector3[faces.Count * 4]; tris = new int[faces.Count * 2 * 6]; } else { Resize(ref vertices, 64, faces.Count * 4); Resize(ref normals, 64, faces.Count * 4); Resize(ref tris, 96, faces.Count * 6); } for (int i = 0; i < faces.Count; i++) { WallVolumeFace wallVolumeFace = faces[i]; Vector3 a; Vector3 vector; Vector3 b; Vector3 b2; switch (wallVolumeFace.orientation) { case WallVolumeOrientaion.Back: a = new Vector3(wallVolumeFace.posX, wallVolumeFace.posY, wallVolumeFace.posZ); vector = Vector3.back; b = Vector3.up; b2 = Vector3.right; break; case WallVolumeOrientaion.Right: a = new Vector3(wallVolumeFace.posX + 1, wallVolumeFace.posY, wallVolumeFace.posZ); vector = Vector3.right; b = Vector3.up; b2 = Vector3.forward; break; case WallVolumeOrientaion.Forward: a = new Vector3(wallVolumeFace.posX + 1, wallVolumeFace.posY, wallVolumeFace.posZ + 1); vector = Vector3.forward; b = Vector3.up; b2 = Vector3.left; break; case WallVolumeOrientaion.Left: a = new Vector3(wallVolumeFace.posX, wallVolumeFace.posY, wallVolumeFace.posZ + 1); vector = Vector3.left; b = Vector3.up; b2 = Vector3.back; break; case WallVolumeOrientaion.Down: a = new Vector3(wallVolumeFace.posX, wallVolumeFace.posY, wallVolumeFace.posZ + 1); vector = Vector3.down; b = Vector3.back; b2 = Vector3.right; break; case WallVolumeOrientaion.Up: a = new Vector3(wallVolumeFace.posX, wallVolumeFace.posY + 1, wallVolumeFace.posZ); vector = Vector3.up; b = Vector3.forward; b2 = Vector3.right; break; default: throw new InvalidOperationException(); } vertices[i * 4] = a * gridSize; vertices[i * 4 + 1] = (a + b) * gridSize; vertices[i * 4 + 2] = (a + b2 + b) * gridSize; vertices[i * 4 + 3] = (a + b2) * gridSize; normals[i * 4] = vector; normals[i * 4 + 1] = vector; normals[i * 4 + 2] = vector; normals[i * 4 + 3] = vector; tris[i * 6] = i * 4; tris[i * 6 + 1] = i * 4 + 1; tris[i * 6 + 2] = i * 4 + 2; tris[i * 6 + 3] = i * 4; tris[i * 6 + 4] = i * 4 + 2; tris[i * 6 + 5] = i * 4 + 3; } for (int j = faces.Count * 6; j < tris.Length; j++) { tris[j] = 0; } mesh.name = base.name; mesh.vertices = vertices; mesh.normals = normals; mesh.triangles = tris; mesh.RecalculateBounds(); }
private bool IsOpen(int x, int y, int z, WallVolumeOrientaion orientation) { bool flag = false; switch (orientation) { case WallVolumeOrientaion.Up: { for (int l = 0; l < faces.Count; l++) { WallVolumeFace wallVolumeFace16 = faces[l]; if (wallVolumeFace16.posX != x) { continue; } WallVolumeFace wallVolumeFace17 = faces[l]; if (wallVolumeFace17.posZ != z) { continue; } WallVolumeFace wallVolumeFace18 = faces[l]; if (wallVolumeFace18.posY <= y) { continue; } WallVolumeFace wallVolumeFace19 = faces[l]; if (wallVolumeFace19.orientation != 0) { WallVolumeFace wallVolumeFace20 = faces[l]; if (wallVolumeFace20.orientation != WallVolumeOrientaion.Down) { continue; } } flag = !flag; } break; } case WallVolumeOrientaion.Down: { for (int n = 0; n < faces.Count; n++) { WallVolumeFace wallVolumeFace26 = faces[n]; if (wallVolumeFace26.posX != x) { continue; } WallVolumeFace wallVolumeFace27 = faces[n]; if (wallVolumeFace27.posZ != z) { continue; } WallVolumeFace wallVolumeFace28 = faces[n]; if (wallVolumeFace28.posY >= y) { continue; } WallVolumeFace wallVolumeFace29 = faces[n]; if (wallVolumeFace29.orientation != 0) { WallVolumeFace wallVolumeFace30 = faces[n]; if (wallVolumeFace30.orientation != WallVolumeOrientaion.Down) { continue; } } flag = !flag; } break; } case WallVolumeOrientaion.Left: { for (int j = 0; j < faces.Count; j++) { WallVolumeFace wallVolumeFace6 = faces[j]; if (wallVolumeFace6.posY != y) { continue; } WallVolumeFace wallVolumeFace7 = faces[j]; if (wallVolumeFace7.posZ != z) { continue; } WallVolumeFace wallVolumeFace8 = faces[j]; if (wallVolumeFace8.posX >= x) { continue; } WallVolumeFace wallVolumeFace9 = faces[j]; if (wallVolumeFace9.orientation != WallVolumeOrientaion.Left) { WallVolumeFace wallVolumeFace10 = faces[j]; if (wallVolumeFace10.orientation != WallVolumeOrientaion.Right) { continue; } } flag = !flag; } break; } case WallVolumeOrientaion.Right: { for (int m = 0; m < faces.Count; m++) { WallVolumeFace wallVolumeFace21 = faces[m]; if (wallVolumeFace21.posY != y) { continue; } WallVolumeFace wallVolumeFace22 = faces[m]; if (wallVolumeFace22.posZ != z) { continue; } WallVolumeFace wallVolumeFace23 = faces[m]; if (wallVolumeFace23.posX <= x) { continue; } WallVolumeFace wallVolumeFace24 = faces[m]; if (wallVolumeFace24.orientation != WallVolumeOrientaion.Left) { WallVolumeFace wallVolumeFace25 = faces[m]; if (wallVolumeFace25.orientation != WallVolumeOrientaion.Right) { continue; } } flag = !flag; } break; } case WallVolumeOrientaion.Forward: { for (int k = 0; k < faces.Count; k++) { WallVolumeFace wallVolumeFace11 = faces[k]; if (wallVolumeFace11.posX != x) { continue; } WallVolumeFace wallVolumeFace12 = faces[k]; if (wallVolumeFace12.posY != y) { continue; } WallVolumeFace wallVolumeFace13 = faces[k]; if (wallVolumeFace13.posZ <= z) { continue; } WallVolumeFace wallVolumeFace14 = faces[k]; if (wallVolumeFace14.orientation != WallVolumeOrientaion.Forward) { WallVolumeFace wallVolumeFace15 = faces[k]; if (wallVolumeFace15.orientation != WallVolumeOrientaion.Back) { continue; } } flag = !flag; } break; } case WallVolumeOrientaion.Back: { for (int i = 0; i < faces.Count; i++) { WallVolumeFace wallVolumeFace = faces[i]; if (wallVolumeFace.posX != x) { continue; } WallVolumeFace wallVolumeFace2 = faces[i]; if (wallVolumeFace2.posY != y) { continue; } WallVolumeFace wallVolumeFace3 = faces[i]; if (wallVolumeFace3.posZ >= z) { continue; } WallVolumeFace wallVolumeFace4 = faces[i]; if (wallVolumeFace4.orientation != WallVolumeOrientaion.Forward) { WallVolumeFace wallVolumeFace5 = faces[i]; if (wallVolumeFace5.orientation != WallVolumeOrientaion.Back) { continue; } } flag = !flag; } break; } default: throw new InvalidOperationException(); } return(flag); }