diff options
Diffstat (limited to 'src/World/Chunk.cpp')
| -rw-r--r-- | src/World/Chunk.cpp | 50 |
1 files changed, 49 insertions, 1 deletions
diff --git a/src/World/Chunk.cpp b/src/World/Chunk.cpp index 73aab3d..1d541f7 100644 --- a/src/World/Chunk.cpp +++ b/src/World/Chunk.cpp @@ -21,6 +21,10 @@ Mesh Chunk::mesh() { } for (auto side: BlockSide::all()) { + if (!is_face_visible(x, y, z, side)) { + continue; + } + auto side_tex_coords = Chunk::face_tex_coords(type, side); auto side_positions = side.face(); @@ -41,6 +45,49 @@ Mesh Chunk::mesh() { return {positions, tex_coords, indices}; } +bool Chunk::is_face_visible(uint32_t x, uint32_t y, uint32_t z, BlockSide side) { + Vector<3, int32_t> offset{}; + switch (side) { + case BlockSide::Front: + offset[2] = 1; + break; + case BlockSide::Back: + offset[2] = -1; + break; + case BlockSide::Top: + offset[1] = 1; + break; + case BlockSide::Bottom: + offset[1] = -1; + break; + case BlockSide::Left: + offset[0] = -1; + break; + case BlockSide::Right: + offset[0] = 1; + break; + } + + Vector<3, uint32_t> neighbor_pos{ + x + offset.x(), y + offset.y(), z + offset.z(), + }; + + if ( + neighbor_pos.x() >= CHUNK_WIDTH || neighbor_pos.x() < 0 || + neighbor_pos.y() >= CHUNK_HEIGHT || neighbor_pos.y() < 0 || + neighbor_pos.z() >= CHUNK_WIDTH || neighbor_pos.z() < 0 + ) { + return true; + } + + auto neighbor = m_blocks[neighbor_pos.x()][neighbor_pos.y()][neighbor_pos.z()]; + if (neighbor.type == BlockType::Air) { + return true; + } + + return false; +} + std::array<Vector<2>, 4> Chunk::face_tex_coords(BlockType type, BlockSide side) { switch (type) { case BlockType::Dirt: @@ -67,6 +114,7 @@ std::array<Vector<2>, 4> Chunk::face_tex_coords(BlockType type, BlockSide side) } default: return {}; - }} + } +} } |
