]> git.localhorst.tv Git - blobs.git/blobdiff - src/creature/Creature.hpp
better heading implementation
[blobs.git] / src / creature / Creature.hpp
index b8171ed73070a8baac5573b8c0d1c561c2427ba7..db0aa5212dc92e52014446331912b6ce5e275052 100644 (file)
@@ -3,7 +3,6 @@
 
 #include "Composition.hpp"
 #include "Genome.hpp"
-#include "Goal.hpp"
 #include "Memory.hpp"
 #include "Situation.hpp"
 #include "Steering.hpp"
@@ -11,6 +10,7 @@
 #include "../math/geometry.hpp"
 #include "../math/glm.hpp"
 
+#include <functional>
 #include <memory>
 #include <string>
 #include <vector>
@@ -30,6 +30,8 @@ namespace world {
 }
 namespace creature {
 
+class Goal;
+
 class Creature {
 
 public:
@@ -163,8 +165,8 @@ public:
        const Memory &GetMemory() const noexcept { return memory; }
 
        /// constantly active goal. every creature in the simulation is required to have one
-       void SetBackgroundTask(std::unique_ptr<Goal> &&g) { bg_task = std::move(g); }
-       Goal &BackgroundTask() { return *bg_task; }
+       void SetBackgroundTask(std::unique_ptr<Goal> &&g);
+       Goal &BackgroundTask();
 
        void AddGoal(std::unique_ptr<Goal> &&);
        const std::vector<std::unique_ptr<Goal>> &Goals() const noexcept { return goals; }
@@ -177,9 +179,13 @@ public:
        Steering &GetSteering() noexcept { return steering; }
        const Steering &GetSteering() const noexcept { return steering; }
 
+       void HeadingTarget(const glm::dvec3 &t) noexcept { heading_target = t; heading_manual = true; }
+
        math::AABB CollisionBounds() const noexcept;
        glm::dmat4 CollisionTransform() const noexcept;
 
+       void OnCollide(Creature &other);
+
        glm::dmat4 LocalTransform() noexcept;
 
        void BuildVAO();
@@ -187,6 +193,7 @@ public:
        void Draw(graphics::Viewport &);
 
 private:
+       void Cache() noexcept;
        void TickState(double dt);
        void TickStats(double dt);
        void TickBrain(double dt);
@@ -221,6 +228,15 @@ private:
 
        Situation situation;
        Steering steering;
+       glm::dvec3 heading_target;
+       bool heading_manual;
+
+       // cached because steering makes heavy use of this
+       double perception_range;
+       double perception_range_squared;
+       double perception_omni_range;
+       double perception_omni_range_squared;
+       double perception_field;
 
        struct Attributes {
                glm::vec3 position;