💿🐜 Antkeeper source code https://antkeeper.com
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

209 lines
4.5 KiB

/*
* Copyright (C) 2017 Christopher J. Howard
*
* This file is part of Antkeeper Source Code.
*
* Antkeeper Source Code is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Antkeeper Source Code is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Antkeeper Source Code. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef AGENT_HPP
#define AGENT_HPP
#include "navmesh.hpp"
#include <vector>
#include <emergent/emergent.hpp>
using namespace Emergent;
class Obstacle;
/*************88
Ant is an agent.
Ant combines steering behaviors with different weights.
I.E.
seek pheromones * 0.5
separation * 0.1
alignment * 0.1
cohesion * 0.1
followWall * 0.2
*/
/**
* An agent which navigates on a navmesh.
*/
class Agent
{
public:
Agent();
/**
* Adds a force to the agent's acceleration vector.
*
* @param force Acceleration force
*/
void applyForce(const Vector3& force);
/**
* Calculates velocity based on current acceleration vector, then resets acceleration to zero.
*/
void updateVelocity();
/**
* Calculates steering force for the wander behavior.
*/
Vector3 wander(float dt);
/**
* Calculates steering force for the seek behavior.
*/
Vector3 seek(const Vector3& target) const;
/**
* Calculates steering force for the flee behavior.
*/
Vector3 flee(const Vector3& target) const;
Vector3 containment(const Vector3& probe) const;
Vector3 separation(const std::list<Agent*>& neighbors) const;
Vector3 forage(const Vector3& leftProbe, const Vector3& rightProbe);
void setMaxSpeed(float speed);
void setVelocity(const Vector3& velocity);
void setMaxAcceleration(float acceleration);
void setMass(float mass);
void setWanderCircleDistance(float distance);
void setWanderCircleRadius(float radius);
void setWanderRate(float angle);
void setSeparationRadius(float radius);
/**
* Sets the position of the agent on a navmesh.
*
* @param triangle Navmesh triangle on which the agent resides
* @param position Barycentric position on the specified triangle
*/
void setPosition(Navmesh::Triangle* triangle, const Vector3& position);
/**
* Sets the orientation of the agent. This effectively updates the agent's vector basis and rotation quaternion.
*
* @param forward Normalized forward vector
* @param up Normalized up vector
*/
void setOrientation(const Vector3& newForward, const Vector3& newUp);
/*
Vector3 followWall();
// or
Vector3 followEdge();
Vector3 avoidObstacle(const Obstacle* obstacle);
Vector3 alignment(const std::vector<const Agent*>* neighbors);
Vector3 cohesion(const std::vector<const Agent*>* neighbors);
*/
const Navmesh::Triangle* getNavmeshTriangle() const;
Navmesh::Triangle* getNavmeshTriangle();
const Vector3& getBarycentricPosition() const;
const Vector3& getPosition() const;
const Vector3& getForward() const;
const Vector3& getUp() const;
const Vector3& getRight() const;
const Quaternion& getRotation() const;
const Vector3& getVelocity() const;
private:
Navmesh::Triangle* navmeshTriangle;
Vector3 barycentricPosition;
Vector3 position;
Vector3 forward;
Vector3 up;
Vector3 right;
Quaternion rotation;
// Limits
float maxSpeed;
float maxAcceleration;
// Steering forces
float mass;
Vector3 acceleration;
Vector3 velocity;
// Wander variables
float wanderCircleDistance;
float wanderCircleRadius;
float wanderRate;
Vector3 wanderDirection;
float separationRadius;
float separationRadiusSquared;
};
inline const Navmesh::Triangle* Agent::getNavmeshTriangle() const
{
return navmeshTriangle;
}
inline Navmesh::Triangle* Agent::getNavmeshTriangle()
{
return navmeshTriangle;
}
inline const Vector3& Agent::getBarycentricPosition() const
{
return barycentricPosition;
}
inline const Vector3& Agent::getPosition() const
{
return position;
}
inline const Vector3& Agent::getForward() const
{
return forward;
}
inline const Vector3& Agent::getUp() const
{
return up;
}
inline const Vector3& Agent::getRight() const
{
return right;
}
inline const Quaternion& Agent::getRotation() const
{
return rotation;
}
inline const Vector3& Agent::getVelocity() const
{
return velocity;
}
#endif // AGENT_HPP