Exemplo n.º 1
0
 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());
     }
 }
Exemplo n.º 2
0
    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);
            }
        }
    }
Exemplo n.º 3
0
        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);
        }