]> git.localhorst.tv Git - blank.git/blobdiff - src/world/EntityController.hpp
reorder world update
[blank.git] / src / world / EntityController.hpp
index 8b14ca8a3d9606c687ba9c35da1107fa4682bb6d..ce3d0cf00998fbccf7826aa052766aca7a66cbe1 100644 (file)
@@ -1,13 +1,14 @@
 #ifndef BLANK_WORLD_ENTITYCONTROLLER_HPP_
 #define BLANK_WORLD_ENTITYCONTROLLER_HPP_
 
+#include "EntityState.hpp"
+
 #include <glm/glm.hpp>
 
 
 namespace blank {
 
 class Entity;
-class EntityState;
 
 struct EntityController {
 
@@ -15,7 +16,51 @@ struct EntityController {
 
        virtual void Update(Entity &, float dt) = 0;
 
-       virtual glm::vec3 ControlForce(const EntityState &) const = 0;
+       virtual glm::vec3 ControlForce(const Entity &, const EntityState &) const = 0;
+
+
+       /// try to add as much of add to out so it doesn't exceed max
+       /// returns true if it's maxed out
+       static bool MaxOutForce(
+               glm::vec3 &out,
+               const glm::vec3 &add,
+               float max
+       ) noexcept;
+       /// give a force that makes state come to a halt over 1/n seconds
+       static inline glm::vec3 Halt(
+               const EntityState &state,
+               float n
+       ) noexcept {
+               return state.velocity * -n;
+       }
+       /// give a force that makes state's velocity converge with given
+       /// target velocity over 1/n seconds
+       static inline glm::vec3 TargetVelocity(
+               const glm::vec3 &target,
+               const EntityState &state,
+               float n
+       ) noexcept {
+               return (target - state.velocity) * n;
+       }
+       /// give a force that makes state go after target with an attempted
+       /// acceleration over 1/n seconds and a speed of s
+       static inline glm::vec3 Seek(
+               const EntityState &state,
+               const EntityState &target,
+               float s,
+               float n
+       ) noexcept {
+               return TargetVelocity(normalize(target.Diff(state)) * s, state, n);
+       }
+       /// opposite of seek
+       static inline glm::vec3 Flee(
+               const EntityState &state,
+               const EntityState &target,
+               float s,
+               float n
+       ) noexcept {
+               return TargetVelocity(normalize(state.Diff(target)) * s, state, n);
+       }
 
 };