From 0464a83dfaebaa75d6e2d3b7431e84ebd83fccfd Mon Sep 17 00:00:00 2001 From: Mel Date: Tue, 18 Oct 2022 19:09:36 +0200 Subject: Hide inward-facing block faces --- src/World/Chunk.cpp | 50 +++++++++++++++++++++++++++++++++++++++++++++++++- src/World/Chunk.hpp | 6 ++++-- 2 files changed, 53 insertions(+), 3 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, 4> Chunk::face_tex_coords(BlockType type, BlockSide side) { switch (type) { case BlockType::Dirt: @@ -67,6 +114,7 @@ std::array, 4> Chunk::face_tex_coords(BlockType type, BlockSide side) } default: return {}; - }} + } +} } diff --git a/src/World/Chunk.hpp b/src/World/Chunk.hpp index eafc613..0a5f269 100644 --- a/src/World/Chunk.hpp +++ b/src/World/Chunk.hpp @@ -5,8 +5,8 @@ #include "../Mesh.hpp" #include "BlockSide.hpp" -#define CHUNK_WIDTH 8 -#define CHUNK_HEIGHT 8 +#define CHUNK_WIDTH 16 +#define CHUNK_HEIGHT 32 namespace MC { @@ -18,6 +18,8 @@ public: Mesh mesh(); private: + bool is_face_visible(uint32_t x, uint32_t y, uint32_t z, BlockSide side); + static std::array, 4> face_tex_coords(BlockType type, BlockSide side); struct BlockData { -- cgit 1.4.1