X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fworld%2FEntityController.hpp;h=ce3d0cf00998fbccf7826aa052766aca7a66cbe1;hb=e4a1425dccd0ba9b106e415dd02809f4308a85ee;hp=526a3222fa4d985fc53094ab7e2c649376dfdd2e;hpb=0ab149c70b3f984b2cc0c7a122b4aa347bc5fd79;p=blank.git diff --git a/src/world/EntityController.hpp b/src/world/EntityController.hpp index 526a322..ce3d0cf 100644 --- a/src/world/EntityController.hpp +++ b/src/world/EntityController.hpp @@ -26,8 +26,15 @@ struct EntityController { const glm::vec3 &add, float max ) noexcept; - /// give a force that makes state's velocity converge with given target velocity - /// over 1/n seconds + /// 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, @@ -35,6 +42,25 @@ struct EntityController { ) 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); + } };