]> git.localhorst.tv Git - blank.git/blobdiff - src/world/Chunk.hpp
try to cleanly destruct world
[blank.git] / src / world / Chunk.hpp
index 6e87a0907d15059cea8b15e5255022b333b4c12b..d0dcf9404219ba063f91fb9b2e5dced933df40e9 100644 (file)
@@ -14,6 +14,7 @@
 namespace blank {
 
 class BlockType;
+class Entity;
 class WorldCollision;
 
 /// cube of size 16 (256 tiles, 4096 blocks)
@@ -30,6 +31,8 @@ public:
        static constexpr int size = side * side * side;
 
        static AABB Bounds() noexcept { return AABB{ { 0.0f, 0.0f, 0.0f }, ExactLocation::FExtent() }; }
+       static glm::vec3 Center() noexcept { return glm::vec3(8.0f); }
+       static float Radius() noexcept { return 27.71281292110203669632f; /* 16 * √3 */ }
 
        static constexpr bool InBounds(const ExactLocation::Fine &pos) noexcept {
                return
@@ -66,7 +69,11 @@ public:
                        (idx / (side * side))
                );
        }
-       glm::mat4 ToTransform(const RoughLocation::Fine &pos, int idx) const noexcept;
+       /// get a chunk-local transform for block at given position and index
+       /// (position and index are redundant)
+       glm::mat4 ToTransform(const RoughLocation::Fine &position, int index) const noexcept;
+       /// same as above, but also apply offset to given reference
+       glm::mat4 ToTransform(const ExactLocation::Coarse &ref, const RoughLocation::Fine &pos, int idx) const noexcept;
 
        ExactLocation::Fine ToSceneCoords(const ExactLocation::Coarse &base, const ExactLocation::Fine &pos) const noexcept {
                return ExactLocation::Fine((position - base) * ExactLocation::Extent()) + pos;
@@ -127,15 +134,17 @@ public:
 
        bool Intersection(
                const Ray &ray,
-               const glm::mat4 &M,
+               const ExactLocation::Coarse &reference,
                float &dist
        ) const noexcept {
-               return blank::Intersection(ray, Bounds(), M, &dist);
+               return blank::Intersection(ray, Bounds(), Transform(reference), &dist);
        }
 
+       /// check if given ray intersects any block of this chunk
+       /// given reference indicated the chunk offset of the ray in world space
        bool Intersection(
                const Ray &,
-               const glm::mat4 &M,
+               const ExactLocation::Coarse &reference,
                WorldCollision &) noexcept;
 
        bool Intersection(
@@ -144,8 +153,15 @@ public:
                const glm::mat4 &Mchunk,
                std::vector<WorldCollision> &) noexcept;
 
+       bool Intersection(
+               const Entity &entity,
+               const glm::mat4 &Mentity,
+               const glm::mat4 &Mchunk,
+               std::vector<WorldCollision> &) noexcept;
+
        void Position(const ExactLocation::Coarse &pos) noexcept { position = pos; }
        const ExactLocation::Coarse &Position() const noexcept { return position; }
+
        glm::mat4 Transform(const ExactLocation::Coarse &offset) const noexcept {
                return glm::translate((position - offset) * ExactLocation::Extent());
        }