summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2022-10-18 19:09:36 +0200
committerMel <einebeere@gmail.com>2022-10-18 19:09:36 +0200
commit0464a83dfaebaa75d6e2d3b7431e84ebd83fccfd (patch)
treeccc0cce73cd94d7990a1f45c3e213ea1e8cd61f8 /src
parentebad1227aaafbd962756155732f0ec39085f7d51 (diff)
downloadmeowcraft-0464a83dfaebaa75d6e2d3b7431e84ebd83fccfd.tar.zst
meowcraft-0464a83dfaebaa75d6e2d3b7431e84ebd83fccfd.zip
Hide inward-facing block faces
Diffstat (limited to 'src')
-rw-r--r--src/World/Chunk.cpp50
-rw-r--r--src/World/Chunk.hpp6
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<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 {};
- }}
+ }
+}
}
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<Vector<2>, 4> face_tex_coords(BlockType type, BlockSide side);
struct BlockData {