]> git.localhorst.tv Git - blank.git/blobdiff - src/chunk.hpp
optimize chunk intersection tests a little
[blank.git] / src / chunk.hpp
index e442e4e289107ee735417c9677ffa6157b42396d..19f5c07ea31f453b0b10573342c8bebe7f44dc04 100644 (file)
@@ -51,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; }
@@ -62,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; }