X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fchunk.hpp;h=e442e4e289107ee735417c9677ffa6157b42396d;hb=2d5671c2ef977defae9ce0ce7248582ab3e8f011;hp=3c301803495038beeb99f59db847db5ffa6d1498;hpb=eca1fdcc8e34a4918418b2de122c6200aeb7ceaf;p=blank.git diff --git a/src/chunk.hpp b/src/chunk.hpp index 3c30180..e442e4e 100644 --- a/src/chunk.hpp +++ b/src/chunk.hpp @@ -5,6 +5,7 @@ #include "geometry.hpp" #include "model.hpp" +#include #include #include @@ -18,7 +19,7 @@ public: using Pos = glm::tvec3; public: - Chunk(); + explicit Chunk(const BlockTypeRegistry &); Chunk(Chunk &&); Chunk &operator =(Chunk &&); @@ -59,6 +60,8 @@ public: Block &BlockAt(const Block::Pos &pos) { return BlockAt(ToIndex(pos)); } const Block &BlockAt(const Block::Pos &pos) const { return BlockAt(ToIndex(pos)); } + const BlockType &Type(const Block &b) const { return *types->Get(b.type); } + bool Intersection( const Ray &, const glm::mat4 &M, @@ -70,13 +73,14 @@ public: const Pos &Position() const { return position; } glm::mat4 Transform(const Pos &offset) const; + void CheckUpdate(); void Draw(); private: - int VertexCount() const; void Update(); private: + const BlockTypeRegistry *types; std::vector blocks; Model model; Pos position; @@ -84,6 +88,41 @@ private: }; + +class Generator; + +class ChunkLoader { + +public: + ChunkLoader(const BlockTypeRegistry &, const Generator &); + + void Generate(const Chunk::Pos &from, const Chunk::Pos &to); + + std::list &Loaded() { return loaded; } + + Chunk *Loaded(const Chunk::Pos &); + bool Queued(const Chunk::Pos &); + bool Known(const Chunk::Pos &); + Chunk &ForceLoad(const Chunk::Pos &); + + void Rebase(const Chunk::Pos &); + void Update(); + +private: + Chunk::Pos base; + + const BlockTypeRegistry ® + const Generator &gen; + + std::list loaded; + std::list to_generate; + std::list to_free; + + int load_dist; + int unload_dist; + +}; + } #endif