]> git.localhorst.tv Git - blank.git/blobdiff - src/chunk.hpp
don't push block normals to GPU
[blank.git] / src / chunk.hpp
index 0b1e5bdec20f79f65971e23234a5d77e04cd2dfd..4addb56d7a9bf9b87935664dba54fdfe266756f7 100644 (file)
@@ -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<Block> blocks;
-       std::vector<unsigned char> 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;
+
 };