#define BLANK_AI_AICONTROLLER_HPP_
#include "../app/IntervalTimer.hpp"
+#include "../geometry/primitive.hpp"
#include "../world/EntityController.hpp"
#include <glm/glm.hpp>
glm::vec3 ControlForce(const Entity &, const EntityState &) const override;
- static glm::vec3 Heading(const EntityState &) noexcept;
-
/// get the closest player that given entity can see
/// returns nullptr if none are in sight
Player *ClosestVisiblePlayer(const Entity &) noexcept;
void ExitHalt() noexcept;
bool IsHalted() const noexcept;
void SetHaltSpeed(float) noexcept;
- glm::vec3 GetHaltForce(const EntityState &) const noexcept;
+ glm::vec3 GetHaltForce(const Entity &, const EntityState &) const noexcept;
+
+ void StartAvoidingObstacles() noexcept;
+ void StopAvoidingObstacles() noexcept;
+ bool IsAvoidingObstacles() const noexcept;
+ glm::vec3 GetObstacleAvoidanceForce(const Entity &, const EntityState &) const noexcept;
void StartFleeing() noexcept;
void StopFleeing() noexcept;
void SetFleeSpeed(float) noexcept;
Entity &GetFleeTarget() noexcept;
const Entity &GetFleeTarget() const noexcept;
- glm::vec3 GetFleeForce(const EntityState &) const noexcept;
+ glm::vec3 GetFleeForce(const Entity &, const EntityState &) const noexcept;
void StartSeeking() noexcept;
void StopSeeking() noexcept;
void SetSeekSpeed(float) noexcept;
Entity &GetSeekTarget() noexcept;
const Entity &GetSeekTarget() const noexcept;
- glm::vec3 GetSeekForce(const EntityState &) const noexcept;
+ glm::vec3 GetSeekForce(const Entity &, const EntityState &) const noexcept;
void StartEvading() noexcept;
void StopEvading() noexcept;
void SetEvadeSpeed(float) noexcept;
Entity &GetEvadeTarget() noexcept;
const Entity &GetEvadeTarget() const noexcept;
- glm::vec3 GetEvadeForce(const EntityState &) const noexcept;
+ glm::vec3 GetEvadeForce(const Entity &, const EntityState &) const noexcept;
void StartPursuing() noexcept;
void StopPursuing() noexcept;
void SetPursuitSpeed(float) noexcept;
Entity &GetPursuitTarget() noexcept;
const Entity &GetPursuitTarget() const noexcept;
- glm::vec3 GetPursuitForce(const EntityState &) const noexcept;
+ glm::vec3 GetPursuitForce(const Entity &, const EntityState &) const noexcept;
/// start wandering randomly
void StartWandering() noexcept;
float radius = 1.0f,
float displacement = 1.0f
) noexcept;
- glm::vec3 GetWanderForce(const EntityState &) const noexcept;
+ glm::vec3 GetWanderForce(const Entity &, const EntityState &) const noexcept;
private:
World &world;
bool halted;
float halt_speed;
+ bool avoid_obstacles;
+ AABB obstacle_box;
+ glm::mat4 obstacle_transform;
+
bool fleeing;
Entity *flee_target;
float flee_speed;