X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fchunk.hpp;h=4addb56d7a9bf9b87935664dba54fdfe266756f7;hb=15ff5ed48855c6bd09bc8f5152f46065484c1e94;hp=0b1e5bdec20f79f65971e23234a5d77e04cd2dfd;hpb=e74f1ad236429f05db90c0ace825277e2a3fbc05;p=blank.git diff --git a/src/chunk.hpp b/src/chunk.hpp index 0b1e5bd..4addb56 100644 --- a/src/chunk.hpp +++ b/src/chunk.hpp @@ -91,7 +91,6 @@ public: // check if block at given index is completely enclosed (and therefore invisible) bool Obstructed(int idx) const; - void Allocate(); void Invalidate() { dirty = true; } void SetBlock(int index, const Block &); @@ -102,10 +101,6 @@ public: const Block &BlockAt(const Block::Pos &pos) const { return BlockAt(ToIndex(pos)); } const Block &BlockAt(const Pos &pos) const { return BlockAt(ToIndex(pos)); } - const Block *FindNext(const Pos &pos, Block::Face face) const; - const Block *FindNext(const Block::Pos &pos, Block::Face face) const { return FindNext(Pos(pos), face); } - const Block *FindNext(int index, Block::Face face) const { return FindNext(ToPos(index), face); } - const BlockType &Type(const Block &b) const { return *types->Get(b.type); } void SetLight(int index, int level); @@ -116,7 +111,7 @@ public: int GetLight(const Pos &pos) const { return GetLight(ToIndex(pos)); } int GetLight(const Block::Pos &pos) const { return GetLight(ToIndex(pos)); } - float GetVertexLight(int index, const BlockModel::Position &, const BlockModel::Normal &) const; + float GetVertexLight(int index, const BlockModel::Position &, const Model::Normal &) const; bool Intersection( const Ray &ray, @@ -146,8 +141,8 @@ private: private: const BlockTypeRegistry *types; Chunk *neighbor[Block::FACE_COUNT]; - std::vector blocks; - std::vector light; + Block blocks[16 * 16 * 16]; + unsigned char light[16 * 16 * 16]; BlockModel model; Pos position; bool dirty; @@ -155,20 +150,29 @@ private: }; -struct BlockLookup { - - Chunk *chunk; - Chunk::Pos pos; - const Block *result; +class BlockLookup { - // resolve chunk/position/block from oob coordinates - // result will be nullptr if unsuccessful +public: + // resolve chunk/position from oob coordinates BlockLookup(Chunk *c, const Chunk::Pos &p); - // resolve chunk/position/block from ib coordinates and direction - // result will be nullptr if unsuccessful + // resolve chunk/position from ib coordinates and direction BlockLookup(Chunk *c, const Chunk::Pos &p, Block::Face dir); + // check if lookup was successful + operator bool() const { return chunk; } + + // only valid if lookup was successful + Chunk &GetChunk() const { return *chunk; } + const Chunk::Pos &GetBlockPos() const { return pos; } + const Block &GetBlock() const { return GetChunk().BlockAt(GetBlockPos()); } + const BlockType &GetType() const { return GetChunk().Type(GetBlock()); } + int GetLight() const { return GetChunk().GetLight(GetBlockPos()); } + +private: + Chunk *chunk; + Chunk::Pos pos; + };