(idx / Width()) % Height() == Height() - 1; // high Y plane
}
+ bool IsSurface(int index) const { return IsSurface(ToPos(index)); }
+ bool IsSurface(const Block::Pos &pos) const { return IsSurface(Pos(pos)); }
+ bool IsSurface(const Pos &pos) const;
+
void SetNeighbor(Chunk &);
bool HasNeighbor(Block::Face f) const { return neighbor[f]; }
Chunk &GetNeighbor(Block::Face f) { return *neighbor[f]; }
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 Allocate();
void Invalidate() { dirty = true; }
void SetBlock(int index, const Block &);
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);
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 Model::Normal &) const;
+
bool Intersection(
const Ray &ray,
const glm::mat4 &M,
private:
const BlockTypeRegistry *types;
Chunk *neighbor[Block::FACE_COUNT];
- std::vector<Block> blocks;
- std::vector<unsigned char> light;
- Model model;
+ Block blocks[16 * 16 * 16];
+ unsigned char light[16 * 16 * 16];
+ BlockModel model;
Pos position;
bool dirty;
};
+class BlockLookup {
+
+public:
+ // resolve chunk/position from oob coordinates
+ BlockLookup(Chunk *c, const Chunk::Pos &p);
+
+ // 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;
+
+};
+
+
class Generator;
class ChunkLoader {
public:
- ChunkLoader(const BlockTypeRegistry &, const Generator &);
+ struct Config {
+ int load_dist = 6;
+ int unload_dist = 8;
+ };
+
+ ChunkLoader(const Config &, const BlockTypeRegistry &, const Generator &);
void Generate(const Chunk::Pos &from, const Chunk::Pos &to);
+ void GenerateSurrounding(const Chunk::Pos &);
std::list<Chunk> &Loaded() { return loaded; }