X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fchunk.hpp;h=6c9eeff5da4b7fc4bc68f84eccb713aaeb859bac;hb=5868f740c492a924cb865644b6201db1632b7376;hp=19f5c07ea31f453b0b10573342c8bebe7f44dc04;hpb=950adaa5bdb9bf758400f2c00df623865b6bff1d;p=blank.git diff --git a/src/chunk.hpp b/src/chunk.hpp index 19f5c07..6c9eeff 100644 --- a/src/chunk.hpp +++ b/src/chunk.hpp @@ -32,14 +32,20 @@ public: static AABB Bounds() { return AABB{ { 0, 0, 0 }, Extent() }; } - static constexpr bool InBounds(const glm::vec3 &pos) { + static constexpr bool InBounds(const Block::Pos &pos) { return pos.x >= 0 && pos.x < Width() && pos.y >= 0 && pos.y < Height() && pos.z >= 0 && pos.z < Depth(); } - static constexpr int ToIndex(const glm::vec3 &pos) { - return int(pos.x) + int(pos.y) * Width() + int(pos.z) * Width() * Height(); + static constexpr bool InBounds(const Chunk::Pos &pos) { + return + pos.x >= 0 && pos.x < Width() && + pos.y >= 0 && pos.y < Height() && + pos.z >= 0 && pos.z < Depth(); + } + static constexpr int ToIndex(const Chunk::Pos &pos) { + return pos.x + pos.y * Width() + pos.z * Width() * Height(); } static constexpr bool InBounds(int idx) { return idx >= 0 && idx < Size(); @@ -51,16 +57,33 @@ public: 0.5f + (idx / (Width() * Height())) ); } + static Chunk::Pos ToPos(int idx) { + return Chunk::Pos( + (idx % Width()), + ((idx / Width()) % Height()), + (idx / (Width() * Height())) + ); + } glm::mat4 ToTransform(int idx) const; static constexpr bool IsBorder(int idx) { return - idx < Width() * Height() || - (idx / Width()) % Height() == 0 || - (idx / Width()) % Height() == Height() - 1 || - (idx / (Width() * Height())) == Depth() - 1; + idx < Width() * Height() || // low Z plane + idx % Width() == 0 || // low X plane + (idx / (Width() * Height())) == Depth() - 1 || // high Z plane + idx % Width() == Width() - 1 || // high X plane + (idx / Width()) % Height() == 0 || // low Y plane + (idx / Width()) % Height() == Height() - 1; // high Y plane } + void SetNeighbor(Chunk &); + bool HasNeighbor(Block::Face f) const { return neighbor[f]; } + Chunk &GetNeighbor(Block::Face f) { return *neighbor[f]; } + const Chunk &GetNeighbor(Block::Face f) const { return *neighbor[f]; } + void ClearNeighbors(); + void Unlink(); + void Relink(); + // check if block at given index is completely enclosed (and therefore invisible) bool Obstructed(int idx) const; @@ -71,6 +94,8 @@ public: const Block &BlockAt(int index) const { return blocks[index]; } Block &BlockAt(const Block::Pos &pos) { return BlockAt(ToIndex(pos)); } const Block &BlockAt(const Block::Pos &pos) const { return BlockAt(ToIndex(pos)); } + Block &BlockAt(const Chunk::Pos &pos) { return BlockAt(ToIndex(pos)); } + const Block &BlockAt(const Chunk::Pos &pos) const { return BlockAt(ToIndex(pos)); } const BlockType &Type(const Block &b) const { return *types->Get(b.type); } @@ -101,6 +126,7 @@ private: private: const BlockTypeRegistry *types; + Chunk *neighbor[Block::FACE_COUNT]; std::vector blocks; Model model; Pos position; @@ -128,6 +154,11 @@ public: void Rebase(const Chunk::Pos &); void Update(); +private: + Chunk &Generate(const Chunk::Pos &pos); + void Insert(Chunk &); + void Remove(Chunk &); + private: Chunk::Pos base;