]> git.localhorst.tv Git - blank.git/blobdiff - src/world/Chunk.hpp
launch xvfb on travis
[blank.git] / src / world / Chunk.hpp
index d0dcf9404219ba063f91fb9b2e5dced933df40e9..97765677e021be36cc0f863af7ca882b973c6820 100644 (file)
@@ -5,9 +5,10 @@
 #include "BlockTypeRegistry.hpp"
 #include "../geometry/Location.hpp"
 #include "../geometry/primitive.hpp"
+#include "../graphics/glm.hpp"
 
+#include <set>
 #include <vector>
-#include <glm/glm.hpp>
 #include <glm/gtx/transform.hpp>
 
 
@@ -34,6 +35,14 @@ public:
        static glm::vec3 Center() noexcept { return glm::vec3(8.0f); }
        static float Radius() noexcept { return 27.71281292110203669632f; /* 16 * √3 */ }
 
+       /// get bounding box relative to given reference chunk
+       AABB RelativeBounds(const ExactLocation::Coarse &ref) const noexcept {
+               AABB bounds;
+               bounds.min = (position - ref) * ExactLocation::Extent();
+               bounds.max = bounds.min + ExactLocation::FExtent();
+               return bounds;
+       }
+
        static constexpr bool InBounds(const ExactLocation::Fine &pos) noexcept {
                return
                        pos.x >= 0.0f && pos.x < fside &&
@@ -46,6 +55,9 @@ public:
                        pos.y >= 0 && pos.y < side &&
                        pos.z >= 0 && pos.z < side;
        }
+       static int ToIndex(const ExactLocation::Fine &pos) noexcept {
+               return ToIndex(RoughLocation::Fine(pos));
+       }
        static constexpr int ToIndex(const RoughLocation::Fine &pos) noexcept {
                return pos.x + pos.y * side + pos.z * side * side;
        }
@@ -132,21 +144,27 @@ public:
 
        float GetVertexLight(const RoughLocation::Fine &, const BlockMesh::Position &, const EntityMesh::Normal &) const noexcept;
 
+       /// get gravity for one unit mass at given point
+       glm::vec3 GravityAt(const ExactLocation &) const noexcept;
+
+       /// check if given ray passes this chunk at all
+       /// given reference indicates the chunk offset of the ray in world space
        bool Intersection(
                const Ray &ray,
                const ExactLocation::Coarse &reference,
                float &dist
        ) const noexcept {
-               return blank::Intersection(ray, Bounds(), Transform(reference), &dist);
+               return blank::Intersection(ray, RelativeBounds(reference), dist);
        }
 
        /// check if given ray intersects any block of this chunk
-       /// given reference indicated the chunk offset of the ray in world space
+       /// given reference indicates the chunk offset of the ray in world space
        bool Intersection(
                const Ray &,
                const ExactLocation::Coarse &reference,
                WorldCollision &) noexcept;
 
+       /// get all blocks intersecting given box
        bool Intersection(
                const AABB &box,
                const glm::mat4 &Mbox,
@@ -163,7 +181,7 @@ public:
        const ExactLocation::Coarse &Position() const noexcept { return position; }
 
        glm::mat4 Transform(const ExactLocation::Coarse &offset) const noexcept {
-               return glm::translate((position - offset) * ExactLocation::Extent());
+               return glm::translate(ExactLocation::Fine((position - offset) * ExactLocation::Extent()));
        }
 
        void *BlockData() noexcept { return &blocks[0]; }
@@ -175,6 +193,10 @@ public:
        bool Lighted() const noexcept { return lighted; }
        void ScanLights();
 
+       /// check for active blocks, should be called after
+       /// block data was modified by means other than SetBlock()
+       void ScanActive();
+
        void Ref() noexcept { ++ref_count; }
        void UnRef() noexcept { --ref_count; }
        bool Referenced() const noexcept { return ref_count > 0; }
@@ -192,6 +214,8 @@ private:
        const BlockTypeRegistry *types;
        Chunk *neighbor[Block::FACE_COUNT];
 
+       std::set<int> gravity;
+
        Block blocks[size];
        unsigned char light[size];
        bool generated;