]> git.localhorst.tv Git - blank.git/blobdiff - src/chunk.hpp
optimize chunk intersection tests a little
[blank.git] / src / chunk.hpp
index d996deefc23088876598b6fb486c5a43e91591e5..19f5c07ea31f453b0b10573342c8bebe7f44dc04 100644 (file)
@@ -5,6 +5,7 @@
 #include "geometry.hpp"
 #include "model.hpp"
 
+#include <list>
 #include <vector>
 #include <glm/glm.hpp>
 
@@ -50,6 +51,18 @@ public:
                        0.5f + (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;
+       }
+
+       // check if block at given index is completely enclosed (and therefore invisible)
+       bool Obstructed(int idx) const;
 
        void Allocate();
        void Invalidate() { dirty = true; }
@@ -61,12 +74,20 @@ public:
 
        const BlockType &Type(const Block &b) const { return *types->Get(b.type); }
 
+       bool Intersection(
+               const Ray &ray,
+               const glm::mat4 &M,
+               float &dist
+       ) const {
+               return blank::Intersection(ray, Bounds(), M, &dist);
+       }
+
        bool Intersection(
                const Ray &,
                const glm::mat4 &M,
-               int *blkid = nullptr,
-               float *dist = nullptr,
-               glm::vec3 *normal = nullptr) const;
+               int &blkid,
+               float &dist,
+               glm::vec3 &normal) const;
 
        void Position(const Pos &);
        const Pos &Position() const { return position; }
@@ -87,6 +108,41 @@ private:
 
 };
 
+
+class Generator;
+
+class ChunkLoader {
+
+public:
+       ChunkLoader(const BlockTypeRegistry &, const Generator &);
+
+       void Generate(const Chunk::Pos &from, const Chunk::Pos &to);
+
+       std::list<Chunk> &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 &reg;
+       const Generator &gen;
+
+       std::list<Chunk> loaded;
+       std::list<Chunk::Pos> to_generate;
+       std::list<Chunk> to_free;
+
+       int load_dist;
+       int unload_dist;
+
+};
+
 }
 
 #endif