From 35c09fc00094a3d390732fd533b2bd03413d90c7 Mon Sep 17 00:00:00 2001 From: Daniel Karbach Date: Wed, 27 May 2015 18:50:52 +0200 Subject: [PATCH] added ability to get seperate information about block face obstruction --- src/block.hpp | 37 +++++++++++++++++++++++++++++++++++++ src/chunk.cpp | 11 ++++++----- src/chunk.hpp | 4 ++-- 3 files changed, 45 insertions(+), 7 deletions(-) diff --git a/src/block.hpp b/src/block.hpp index 4fcee4c..3af80a8 100644 --- a/src/block.hpp +++ b/src/block.hpp @@ -87,6 +87,43 @@ struct Block { } } + struct FaceSet { + + explicit FaceSet(unsigned char v = 0) + : value(v) { } + + bool IsSet(Face f) const { + return value & Mask(f); + } + void Set(Face f) { + value |= Mask(f); + } + void Unset(Face f) { + value |= ~Mask(f); + } + + void Clear() { + value = 0; + } + void Fill() { + value = Mask(FACE_COUNT) - 1; + } + + bool Empty() const { + return value == 0; + } + bool All() const { + return value == Mask(FACE_COUNT) - 1; + } + + unsigned char Mask(Face f) const { + return 1 << f; + } + + unsigned char value; + + }; + }; diff --git a/src/chunk.cpp b/src/chunk.cpp index 74ca1bc..23d5a13 100644 --- a/src/chunk.cpp +++ b/src/chunk.cpp @@ -445,7 +445,7 @@ void Chunk::Update() { for (size_t i = 0; i < Size(); ++i) { const BlockType &type = Type(blocks[i]); - if (!type.visible || Obstructed(i)) continue; + if (!type.visible || Obstructed(i).All()) continue; type.FillBlockModel(buf, ToTransform(i), vtx_counter); size_t vtx_begin = vtx_counter; @@ -464,18 +464,19 @@ void Chunk::Update() { dirty = false; } -bool Chunk::Obstructed(int idx) const { +Block::FaceSet Chunk::Obstructed(int idx) const { Chunk::Pos pos(ToPos(idx)); + Block::FaceSet result; for (int f = 0; f < Block::FACE_COUNT; ++f) { Block::Face face = Block::Face(f); BlockLookup next(const_cast(this), pos, face); - if (!next || !next.GetType().FaceFilled(next.GetBlock(), Block::Opposite(face))) { - return false; + if (next && next.GetType().FaceFilled(next.GetBlock(), Block::Opposite(face))) { + result.Set(face); } } - return true; + return result; } glm::mat4 Chunk::ToTransform(int idx) const { diff --git a/src/chunk.hpp b/src/chunk.hpp index 4addb56..06dc98b 100644 --- a/src/chunk.hpp +++ b/src/chunk.hpp @@ -88,8 +88,8 @@ public: void Unlink(); void Relink(); - // check if block at given index is completely enclosed (and therefore invisible) - bool Obstructed(int idx) const; + // check which faces of a block at given index are obstructed (and therefore invisible) + Block::FaceSet Obstructed(int idx) const; void Invalidate() { dirty = true; } -- 2.39.2