]> git.localhorst.tv Git - blobs.git/blobdiff - src/creature/Creature.hpp
make texture part of genome
[blobs.git] / src / creature / Creature.hpp
index b8171ed73070a8baac5573b8c0d1c561c2427ba7..59bfcb77396dc569c3e0c480c05da729e0de7ffe 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:
@@ -101,6 +103,12 @@ public:
        void HighlightColor(const glm::dvec3 &c) noexcept;
        glm::dvec4 HighlightColor() const noexcept { return highlight_color; }
 
+       void BackSkin(double s) noexcept { skin_back = s; }
+       double BackSkin() const noexcept { return skin_back; }
+
+       void SideSkin(double s) noexcept { skin_side = s; }
+       double SideSkin() const noexcept { return skin_side; }
+
        void Mass(double m) noexcept { mass = m; }
        double Mass() const noexcept { return mass; }
        void Ingest(int res, double amount) noexcept;
@@ -163,8 +171,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 +185,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 +199,7 @@ public:
        void Draw(graphics::Viewport &);
 
 private:
+       void Cache() noexcept;
        void TickState(double dt);
        void TickStats(double dt);
        void TickBrain(double dt);
@@ -202,6 +215,8 @@ private:
 
        glm::dvec3 base_color;
        glm::dvec4 highlight_color;
+       double skin_back;
+       double skin_side;
 
        double mass;
        double size;
@@ -221,6 +236,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;