+glm::vec3 AIController::ControlForce(const Entity &entity, const EntityState &state) const {
+ glm::vec3 force(0.0f);
+ if (IsFleeing()) {
+ glm::vec3 diff(GetFleeTarget().GetState().Diff(state));
+ if (MaxOutForce(force, TargetVelocity(normalize(diff) * flee_speed, state, 0.5f), entity.MaxControlForce())) {
+ return force;
+ }
+ }
+ if (IsSeeking()) {
+ glm::vec3 diff(state.Diff(GetSeekTarget().GetState()));
+ if (MaxOutForce(force, TargetVelocity(normalize(diff) * seek_speed, state, 0.5f), entity.MaxControlForce())) {
+ return force;
+ }
+ }
+ if (wandering) {
+ glm::vec3 wander_target(normalize(Heading(state) * wander_dist + wander_pos) * wander_speed);
+ if (MaxOutForce(force, TargetVelocity(wander_target, state, 2.0f), entity.MaxControlForce())) {
+ return force;
+ }
+ }
+ return force;
+}