2021-12-16 06:15:23 +01:00
/*
* Agent . h
* RVO2 - 3 D Library
*
* Copyright 2008 University of North Carolina at Chapel Hill
*
* Licensed under the Apache License , Version 2.0 ( the " License " ) ;
* you may not use this file except in compliance with the License .
* You may obtain a copy of the License at
*
* http : //www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing , software
* distributed under the License is distributed on an " AS IS " BASIS ,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
* See the License for the specific language governing permissions and
* limitations under the License .
*
* Please send all bug reports to < geom @ cs . unc . edu > .
*
* The authors may be contacted via :
*
* Jur van den Berg , Stephen J . Guy , Jamie Snape , Ming C . Lin , Dinesh Manocha
* Dept . of Computer Science
* 201 S . Columbia St .
* Frederick P . Brooks , Jr . Computer Science Bldg .
* Chapel Hill , N . C . 27599 - 3175
* United States of America
*
* < http : //gamma.cs.unc.edu/RVO2/>
*/
/**
* \ file Agent . h
* \ brief Contains the Agent class .
*/
# ifndef RVO_AGENT_H_
# define RVO_AGENT_H_
# include "API.h"
# include <cstddef>
# include <utility>
# include <vector>
# include "Vector3.h"
// Note: Slightly modified to work better in Godot.
// - The agent can be created by anyone.
// - The simulator pointer is removed.
// - The update function is removed.
// - The compute velocity function now need the timeStep.
// - Moved the `Plane` class here.
// - Added a new parameter `ignore_y_` in the `Agent`. This parameter is used to control a godot feature that allows to avoid collisions by moving on the horizontal plane.
namespace RVO {
2022-05-18 14:21:02 +02:00
/**
* \ brief Defines a plane .
*/
class Plane {
public :
/**
* \ brief A point on the plane .
*/
Vector3 point ;
2021-12-16 06:15:23 +01:00
2022-05-18 14:21:02 +02:00
/**
* \ brief The normal to the plane .
*/
Vector3 normal ;
} ;
2021-12-16 06:15:23 +01:00
2022-05-18 14:21:02 +02:00
/**
* \ brief Defines an agent in the simulation .
*/
class Agent {
public :
/**
2021-12-16 06:15:23 +01:00
* \ brief Constructs an agent instance .
* \ param sim The simulator instance .
*/
2022-05-18 14:21:02 +02:00
explicit Agent ( ) ;
2021-12-16 06:15:23 +01:00
2022-05-18 14:21:02 +02:00
/**
2021-12-16 06:15:23 +01:00
* \ brief Computes the neighbors of this agent .
*/
2022-05-18 14:21:02 +02:00
void computeNeighbors ( class KdTree * kdTree_ ) ;
2021-12-16 06:15:23 +01:00
2022-05-18 14:21:02 +02:00
/**
2021-12-16 06:15:23 +01:00
* \ brief Computes the new velocity of this agent .
*/
2022-05-18 14:21:02 +02:00
void computeNewVelocity ( float timeStep ) ;
2021-12-16 06:15:23 +01:00
2022-05-18 14:21:02 +02:00
/**
2021-12-16 06:15:23 +01:00
* \ brief Inserts an agent neighbor into the set of neighbors of this agent .
* \ param agent A pointer to the agent to be inserted .
* \ param rangeSq The squared range around this agent .
*/
2022-05-18 14:21:02 +02:00
void insertAgentNeighbor ( const Agent * agent , float & rangeSq ) ;
2021-12-16 06:15:23 +01:00
2022-05-18 14:21:02 +02:00
Vector3 newVelocity_ ;
Vector3 position_ ;
Vector3 prefVelocity_ ;
Vector3 velocity_ ;
size_t id_ ;
size_t maxNeighbors_ ;
float maxSpeed_ ;
float neighborDist_ ;
float radius_ ;
float timeHorizon_ ;
std : : vector < std : : pair < float , const Agent * > > agentNeighbors_ ;
std : : vector < Plane > orcaPlanes_ ;
/// This is a godot feature that allows the Agent to avoid collision by mooving
/// on the horizontal plane.
bool ignore_y_ ;
2021-12-16 06:15:23 +01:00
2022-05-18 14:21:02 +02:00
friend class KdTree ;
} ;
}
2021-12-16 06:15:23 +01:00
# endif /* RVO_AGENT_H_ */