]> git.localhorst.tv Git - blobs.git/commitdiff
avoid others when steering
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Wed, 29 Nov 2017 22:43:15 +0000 (23:43 +0100)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Wed, 29 Nov 2017 22:43:15 +0000 (23:43 +0100)
src/app/states.cpp
src/creature/Steering.hpp
src/creature/creature.cpp
src/creature/goal.cpp

index ecba340312dd84a6fbca76c791c8cd7531c575e2..8afd7ef6b35a9159099e5254e00ed5c9f5b46039 100644 (file)
@@ -21,7 +21,7 @@ MasterState::MasterState(Assets &assets, world::Simulation &sim) noexcept
 , cam(sim.Root())
 , cam_dist(5.0)
 , cam_tgt_dist(5.0)
-, cam_orient(PI * 0.125, 0.0, 0.0)
+, cam_orient(PI * 0.375, PI * 0.25, 0.0)
 , cam_dragging(false)
 , cp(assets)
 , remain(0)
index cca757ee0b72763ec8b4f6558b8259d45ceedca2..470031dd170a4ec16e201068265e9ad8807a68e8 100644 (file)
@@ -8,10 +8,12 @@
 namespace blobs {
 namespace creature {
 
+class Creature;
+
 class Steering {
 
 public:
-       Steering();
+       explicit Steering(const Creature &);
        ~Steering();
 
 public:
@@ -22,6 +24,8 @@ public:
        double MaxSpeed() const noexcept { return max_speed; }
 
 public:
+       void Separate(double min_distance, double max_lookaround) noexcept;
+       void DontSeparate() noexcept;
        void Halt() noexcept;
        void Pass(const glm::dvec3 &) noexcept;
        void GoTo(const glm::dvec3 &) noexcept;
@@ -33,11 +37,15 @@ private:
        glm::dvec3 TargetVelocity(const Situation::State &, const glm::dvec3 &) const noexcept;
 
 private:
+       const Creature &c;
        glm::dvec3 target;
 
-       double max_accel = 1.0;
-       double max_speed = 1.0;
+       double max_accel;
+       double max_speed;
+       double min_dist;
+       double max_look;
 
+       bool separating;
        bool halting;
        bool seeking;
        bool arriving;
index 3066331b13b76db3019a4ca59afe5da44cb2f3b8..5bfac3cf91939e3be417a2147657391534ff337c 100644 (file)
@@ -47,8 +47,10 @@ Creature::Creature(world::Simulation &sim)
 , needs()
 , goals()
 , situation()
-, steering()
+, steering(*this)
 , vao() {
+       // all creatures avoid each other for now
+       steering.Separate(0.1, 1.5);
 }
 
 Creature::~Creature() {
@@ -78,7 +80,7 @@ void Creature::Hurt(double dt) noexcept {
        health = std::max(0.0, health - dt);
        if (health == 0.0) {
                std::cout << "[" << int(sim.Time()) << "s] "
-               << name << " died" << std::endl;
+                       << name << " died" << std::endl;
                Die();
        }
 }
@@ -129,7 +131,6 @@ double Creature::Fertility() const noexcept {
 }
 
 void Creature::AddGoal(std::unique_ptr<Goal> &&g) {
-       std::cout << "[" << int(sim.Time()) << "s] " << name << " new goal: " << g->Describe() << std::endl;
        g->Enable();
        goals.emplace_back(std::move(g));
 }
@@ -149,6 +150,9 @@ void Creature::Tick(double dt) {
                        std::cout << "[" << int(sim.Time()) << "s] "
                                << name << " died of old age" << std::endl;
                        Die();
+               } else {
+                       std::cout << "[" << int(sim.Time()) << "s] "
+                               << name << " grew up to " << AgeName() << std::endl;
                }
        }
 
@@ -166,6 +170,7 @@ void Creature::Tick(double dt) {
                state.pos += f.vel * dt;
                state.vel += f.acc * dt;
                constexpr double turn_speed = 10.0;
+               // TODO: this is crap
                state.dir = glm::normalize(state.dir + f.turn * turn_speed * dt);
                situation.SetState(state);
        }
@@ -494,6 +499,8 @@ void Split(Creature &c) {
                s.GetPlanet(), s.Surface(),
                s.Position() + glm::dvec3(0.0, a->Size() * 0.51, 0.0));
        a->BuildVAO();
+       std::cout << "[" << int(c.GetSimulation().Time()) << "s] "
+               << a->Name() << " was born" << std::endl;
 
        Creature *b = new Creature(c.GetSimulation());
        b->Name(c.GetSimulation().Assets().name.Sequential());
@@ -503,6 +510,8 @@ void Split(Creature &c) {
                s.GetPlanet(), s.Surface(),
                s.Position() + glm::dvec3(0.0, b->Size() * -0.51, 0.0));
        b->BuildVAO();
+       std::cout << "[" << int(c.GetSimulation().Time()) << "s] "
+               << b->Name() << " was born" << std::endl;
 
        c.Die();
 }
@@ -614,11 +623,15 @@ void Situation::SetPlanetSurface(world::Planet &p, int srf, const glm::dvec3 &po
 }
 
 
-Steering::Steering()
-: target(0.0)
+Steering::Steering(const Creature &c)
+: c(c)
+, target(0.0)
 , max_accel(1.0)
 , max_speed(1.0)
-, halting(false)
+, min_dist(0.0)
+, max_look(0.0)
+, separating(false)
+, halting(true)
 , seeking(false)
 , arriving(false) {
 }
@@ -626,6 +639,16 @@ Steering::Steering()
 Steering::~Steering() {
 }
 
+void Steering::Separate(double min_distance, double max_lookaround) noexcept {
+       separating = true;
+       min_dist = min_distance;
+       max_look = max_lookaround;
+}
+
+void Steering::DontSeparate() noexcept {
+       separating = false;
+}
+
 void Steering::Halt() noexcept {
        halting = true;
        seeking = false;
@@ -648,6 +671,21 @@ void Steering::GoTo(const glm::dvec3 &t) noexcept {
 
 glm::dvec3 Steering::Acceleration(const Situation::State &s) const noexcept {
        glm::dvec3 acc(0.0);
+       if (separating) {
+               // TODO: off surface situation
+               glm::dvec3 repulse(0.0);
+               const Situation &s = c.GetSituation();
+               for (auto &other : s.GetPlanet().Creatures()) {
+                       if (&*other == &c) continue;
+                       glm::dvec3 diff = s.Position() - other->GetSituation().Position();
+                       if (length2(diff) > max_look * max_look) continue;
+                       double sep = length(diff) - other->Size() * 0.707 - c.Size() * 0.707;
+                       if (sep < min_dist) {
+                               repulse += normalize(diff) * (1.0 - sep / min_dist);
+                       }
+               }
+               SumForce(acc, repulse);
+       }
        if (halting) {
                SumForce(acc, s.vel * -max_accel);
        }
index 9c45a344f22a1fe9b1f55498d8e7caa5d00ec09b..77a0dece1a261b55cdf9318529ea6682d947accf 100644 (file)
@@ -92,8 +92,7 @@ void IdleGoal::Action() {
        double rand = Assets().random.UNorm();
        if (fert > rand) {
                std::cout << "[" << int(GetCreature().GetSimulation().Time())
-                       << "s] splitting " << GetCreature().Name()
-                       << " because " << fert << " > " << rand << std::endl;
+                       << "s] " << GetCreature().Name() << " split" << std::endl;
                Split(GetCreature());
        }
 }