X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fworld%2FEntityController.hpp;h=ce3d0cf00998fbccf7826aa052766aca7a66cbe1;hb=da21395e4900bf283ece7364c67d9bad27dca279;hp=8b14ca8a3d9606c687ba9c35da1107fa4682bb6d;hpb=150d065f431d665326fd8028748c48a74ad956bb;p=blank.git diff --git a/src/world/EntityController.hpp b/src/world/EntityController.hpp index 8b14ca8..ce3d0cf 100644 --- a/src/world/EntityController.hpp +++ b/src/world/EntityController.hpp @@ -1,13 +1,14 @@ #ifndef BLANK_WORLD_ENTITYCONTROLLER_HPP_ #define BLANK_WORLD_ENTITYCONTROLLER_HPP_ +#include "EntityState.hpp" + #include 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); + } };