public BaseBlock GetBlock(Vector3Int pos) { if (ChunkUtils.IsInChunkBounds(pos, ChunkSize)) { return(Blocks[pos.x, pos.y, pos.z]); } else { throw new Exception("Position out of chunk bounds: " + pos.ToString()); } }
public static bool IsBlockVisible(Vector3Int vec, BaseBlock[,,] blocks, int chunkSize) { Vector3Int right = new Vector3Int(vec.x + 1, vec.y, vec.z); Vector3Int left = new Vector3Int(vec.x - 1, vec.y, vec.z); Vector3Int above = new Vector3Int(vec.x, vec.y + 1, vec.z); Vector3Int below = new Vector3Int(vec.x, vec.y - 1, vec.z); Vector3Int front = new Vector3Int(vec.x, vec.y, vec.z + 1); Vector3Int back = new Vector3Int(vec.x, vec.y, vec.z - 1); if (!ChunkUtils.IsInChunkBounds(vec, chunkSize)) { throw new Exception("Position out of chunk bounds: " + vec.ToString()); } else { if (!ChunkUtils.IsInChunkBounds(right, chunkSize) || !ChunkUtils.IsInChunkBounds(left, chunkSize) || !ChunkUtils.IsInChunkBounds(above, chunkSize) || !ChunkUtils.IsInChunkBounds(below, chunkSize) || !ChunkUtils.IsInChunkBounds(front, chunkSize) || !ChunkUtils.IsInChunkBounds(back, chunkSize)) { return(true); } else if (blocks[right.x, right.y, right.z].Transparent || blocks[left.x, left.y, left.z].Transparent || blocks[above.x, above.y, above.z].Transparent || blocks[below.x, below.y, below.z].Transparent || blocks[front.x, front.y, front.z].Transparent || blocks[back.x, back.y, back.z].Transparent) { return(true); } else { return(false); } } }
public RawMesh GenerateMesh(Chunk chunk) { BaseBlock[,,] blocks = chunk.Blocks; List <Vector3Int> visibleBlockPositions = terrainCuller.cull(chunk); var mesh = initRawMesh(chunk); //process visible faces for (int a = 0; a < visibleBlockPositions.Count; a++) { int x = visibleBlockPositions[a].x; int y = visibleBlockPositions[a].y; int z = visibleBlockPositions[a].z; BaseBlock block = blocks[x, y, z]; if (ChunkUtils.IsInsideOfChunk(x, y, z, chunk.ChunkSize)) { //front if (blocks[x, y, z - 1].Transparent) { AppendFace(mesh, block, Face.Front, x, y, z); } //back if (blocks[x, y, z + 1].Transparent) { AppendFace(mesh, block, Face.Back, x, y, z); } //left if (blocks[x - 1, y, z].Transparent) { AppendFace(mesh, block, Face.Left, x, y, z); } //right if (blocks[x + 1, y, z].Transparent) { AppendFace(mesh, block, Face.Right, x, y, z); } //top if (blocks[x, y + 1, z].Transparent) { AppendFace(mesh, block, Face.Top, x, y, z); } //bottom if (blocks[x, y - 1, z].Transparent) { AppendFace(mesh, block, Face.Bottom, x, y, z); } } else { //front if (!ChunkUtils.IsInChunkBounds(x, y, z - 1, chunk.ChunkSize) || blocks[x, y, z - 1].Transparent) { AppendFace(mesh, block, Face.Front, x, y, z); } //back if (!ChunkUtils.IsInChunkBounds(x, y, z + 1, chunk.ChunkSize) || blocks[x, y, z + 1].Transparent) { AppendFace(mesh, block, Face.Back, x, y, z); } //left if (!ChunkUtils.IsInChunkBounds(x - 1, y, z, chunk.ChunkSize) || blocks[x - 1, y, z].Transparent) { AppendFace(mesh, block, Face.Left, x, y, z); } //right if (!ChunkUtils.IsInChunkBounds(x + 1, y, z, chunk.ChunkSize) || blocks[x + 1, y, z].Transparent) { AppendFace(mesh, block, Face.Right, x, y, z); } //top if (!ChunkUtils.IsInChunkBounds(x, y + 1, z, chunk.ChunkSize) || blocks[x, y + 1, z].Transparent) { AppendFace(mesh, block, Face.Top, x, y, z); } //bottom if (!ChunkUtils.IsInChunkBounds(x, y - 1, z, chunk.ChunkSize) || blocks[x, y - 1, z].Transparent) { AppendFace(mesh, block, Face.Bottom, x, y, z); } } } return(mesh); }