- if (!line_of_sight) {
- Controlled().Velocity(glm::vec3(0.0f));
- } else if (dist > stop_dist) {
- Controlled().Velocity(norm_diff * chase_speed);
- } else if (dist < flee_dist) {
- Controlled().Velocity(norm_diff * flee_speed);
+glm::vec3 AIController::ControlForce(const EntityState &state) const {
+ glm::vec3 force(0.0f);
+ if (IsFleeing()) {
+ glm::vec3 diff(GetFleeTarget().GetState().Diff(state));
+ if (dot(diff, diff) > std::numeric_limits<float>::epsilon()) {
+ force += normalize(diff) * flee_speed;
+ }
+ }
+ if (IsSeeking()) {
+ glm::vec3 diff(state.Diff(GetSeekTarget().GetState()));
+ if (dot(diff, diff) > std::numeric_limits<float>::epsilon()) {
+ force += normalize(diff) * seek_speed;
+ }
+ }
+ if (wandering) {
+ force += (Heading(state) * wander_dist + wander_pos) * wander_speed;
+ }
+ return force;
+}
+
+glm::vec3 AIController::Heading(const EntityState &state) noexcept {
+ if (dot(state.velocity, state.velocity) > std::numeric_limits<float>::epsilon()) {
+ return normalize(state.velocity);