123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283 |
- diff --git a/thirdparty/rvo2/Agent.cpp b/thirdparty/rvo2/Agent.cpp
- index 5e49a3554c..b35eee9c12 100644
- --- a/thirdparty/rvo2/Agent.cpp
- +++ b/thirdparty/rvo2/Agent.cpp
- @@ -105,18 +105,17 @@ namespace RVO {
- */
- void linearProgram4(const std::vector<Plane> &planes, size_t beginPlane, float radius, Vector3 &result);
-
- - Agent::Agent(RVOSimulator *sim) : sim_(sim), id_(0), maxNeighbors_(0), maxSpeed_(0.0f), neighborDist_(0.0f), radius_(0.0f), timeHorizon_(0.0f) { }
- + Agent::Agent() : id_(0), maxNeighbors_(0), maxSpeed_(0.0f), neighborDist_(0.0f), radius_(0.0f), timeHorizon_(0.0f), ignore_y_(false) { }
-
- - void Agent::computeNeighbors()
- + void Agent::computeNeighbors(KdTree *kdTree_)
- {
- agentNeighbors_.clear();
- -
- if (maxNeighbors_ > 0) {
- - sim_->kdTree_->computeAgentNeighbors(this, neighborDist_ * neighborDist_);
- + kdTree_->computeAgentNeighbors(this, neighborDist_ * neighborDist_);
- }
- }
-
- - void Agent::computeNewVelocity()
- + void Agent::computeNewVelocity(float timeStep)
- {
- orcaPlanes_.clear();
- const float invTimeHorizon = 1.0f / timeHorizon_;
- @@ -124,10 +123,24 @@ namespace RVO {
- /* Create agent ORCA planes. */
- for (size_t i = 0; i < agentNeighbors_.size(); ++i) {
- const Agent *const other = agentNeighbors_[i].second;
- - const Vector3 relativePosition = other->position_ - position_;
- - const Vector3 relativeVelocity = velocity_ - other->velocity_;
- - const float distSq = absSq(relativePosition);
- +
- + Vector3 relativePosition = other->position_ - position_;
- + Vector3 relativeVelocity = velocity_ - other->velocity_;
- const float combinedRadius = radius_ + other->radius_;
- +
- + // This is a Godot feature that allow the agents to avoid the collision
- + // by moving only on the horizontal plane relative to the player velocity.
- + if (ignore_y_) {
- + // Skip if these are in two different heights
- +#define ABS(m_v) (((m_v) < 0) ? (-(m_v)) : (m_v))
- + if (ABS(relativePosition[1]) > combinedRadius * 2) {
- + continue;
- + }
- + relativePosition[1] = 0;
- + relativeVelocity[1] = 0;
- + }
- +
- + const float distSq = absSq(relativePosition);
- const float combinedRadiusSq = sqr(combinedRadius);
-
- Plane plane;
- @@ -165,7 +178,7 @@ namespace RVO {
- }
- else {
- /* Collision. */
- - const float invTimeStep = 1.0f / sim_->timeStep_;
- + const float invTimeStep = 1.0f / timeStep;
- const Vector3 w = relativeVelocity - invTimeStep * relativePosition;
- const float wLength = abs(w);
- const Vector3 unitW = w / wLength;
- @@ -183,6 +196,11 @@ namespace RVO {
- if (planeFail < orcaPlanes_.size()) {
- linearProgram4(orcaPlanes_, planeFail, maxSpeed_, newVelocity_);
- }
- +
- + if (ignore_y_) {
- + // Not 100% necessary, but better to have.
- + newVelocity_[1] = prefVelocity_[1];
- + }
- }
-
- void Agent::insertAgentNeighbor(const Agent *agent, float &rangeSq)
- @@ -211,12 +229,6 @@ namespace RVO {
- }
- }
-
- - void Agent::update()
- - {
- - velocity_ = newVelocity_;
- - position_ += velocity_ * sim_->timeStep_;
- - }
- -
- bool linearProgram1(const std::vector<Plane> &planes, size_t planeNo, const Line &line, float radius, const Vector3 &optVelocity, bool directionOpt, Vector3 &result)
- {
- const float dotProduct = line.point * line.direction;
- diff --git a/thirdparty/rvo2/Agent.h b/thirdparty/rvo2/Agent.h
- index d3922ec645..45fbead2f5 100644
- --- a/thirdparty/rvo2/Agent.h
- +++ b/thirdparty/rvo2/Agent.h
- @@ -41,30 +41,52 @@
- #include <utility>
- #include <vector>
-
- -#include "RVOSimulator.h"
- #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 {
- + /**
- + * \brief Defines a plane.
- + */
- + class Plane {
- + public:
- + /**
- + * \brief A point on the plane.
- + */
- + Vector3 point;
- +
- + /**
- + * \brief The normal to the plane.
- + */
- + Vector3 normal;
- + };
- +
- /**
- * \brief Defines an agent in the simulation.
- */
- class Agent {
- - private:
- + public:
- /**
- * \brief Constructs an agent instance.
- * \param sim The simulator instance.
- */
- - explicit Agent(RVOSimulator *sim);
- + explicit Agent();
-
- /**
- * \brief Computes the neighbors of this agent.
- */
- - void computeNeighbors();
- + void computeNeighbors(class KdTree *kdTree_);
-
- /**
- * \brief Computes the new velocity of this agent.
- */
- - void computeNewVelocity();
- + void computeNewVelocity(float timeStep);
-
- /**
- * \brief Inserts an agent neighbor into the set of neighbors of this agent.
- @@ -73,16 +95,10 @@ namespace RVO {
- */
- void insertAgentNeighbor(const Agent *agent, float &rangeSq);
-
- - /**
- - * \brief Updates the three-dimensional position and three-dimensional velocity of this agent.
- - */
- - void update();
- -
- Vector3 newVelocity_;
- Vector3 position_;
- Vector3 prefVelocity_;
- Vector3 velocity_;
- - RVOSimulator *sim_;
- size_t id_;
- size_t maxNeighbors_;
- float maxSpeed_;
- @@ -91,9 +107,11 @@ namespace RVO {
- 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_;
-
- friend class KdTree;
- - friend class RVOSimulator;
- };
- }
-
- diff --git a/thirdparty/rvo2/KdTree.cpp b/thirdparty/rvo2/KdTree.cpp
- index 5e9e9777a6..c857f299df 100644
- --- a/thirdparty/rvo2/KdTree.cpp
- +++ b/thirdparty/rvo2/KdTree.cpp
- @@ -36,16 +36,15 @@
-
- #include "Agent.h"
- #include "Definitions.h"
- -#include "RVOSimulator.h"
-
- namespace RVO {
- const size_t RVO3D_MAX_LEAF_SIZE = 10;
-
- - KdTree::KdTree(RVOSimulator *sim) : sim_(sim) { }
- + KdTree::KdTree() { }
-
- - void KdTree::buildAgentTree()
- + void KdTree::buildAgentTree(std::vector<Agent *> agents)
- {
- - agents_ = sim_->agents_;
- + agents_.swap(agents);
-
- if (!agents_.empty()) {
- agentTree_.resize(2 * agents_.size() - 1);
- diff --git a/thirdparty/rvo2/KdTree.h b/thirdparty/rvo2/KdTree.h
- index a09384c20f..69d8920ce0 100644
- --- a/thirdparty/rvo2/KdTree.h
- +++ b/thirdparty/rvo2/KdTree.h
- @@ -41,6 +41,9 @@
-
- #include "Vector3.h"
-
- +// Note: Slightly modified to work better with Godot.
- +// - Removed `sim_`.
- +// - KdTree things are public
- namespace RVO {
- class Agent;
- class RVOSimulator;
- @@ -49,7 +52,7 @@ namespace RVO {
- * \brief Defines <i>k</i>d-trees for agents in the simulation.
- */
- class KdTree {
- - private:
- + public:
- /**
- * \brief Defines an agent <i>k</i>d-tree node.
- */
- @@ -90,12 +93,12 @@ namespace RVO {
- * \brief Constructs a <i>k</i>d-tree instance.
- * \param sim The simulator instance.
- */
- - explicit KdTree(RVOSimulator *sim);
- + explicit KdTree();
-
- /**
- * \brief Builds an agent <i>k</i>d-tree.
- */
- - void buildAgentTree();
- + void buildAgentTree(std::vector<Agent *> agents);
-
- void buildAgentTreeRecursive(size_t begin, size_t end, size_t node);
-
- @@ -110,7 +113,6 @@ namespace RVO {
-
- std::vector<Agent *> agents_;
- std::vector<AgentTreeNode> agentTree_;
- - RVOSimulator *sim_;
-
- friend class Agent;
- friend class RVOSimulator;
- diff --git a/thirdparty/rvo2/Vector3.h b/thirdparty/rvo2/Vector3.h
- index 6c3223bb87..f44e311f29 100644
- --- a/thirdparty/rvo2/Vector3.h
- +++ b/thirdparty/rvo2/Vector3.h
- @@ -41,7 +41,7 @@
- #include <cstddef>
- #include <ostream>
-
- -#include "Export.h"
- +#define RVO3D_EXPORT
-
- namespace RVO {
- /**
- @@ -59,17 +59,6 @@ namespace RVO {
- val_[2] = 0.0f;
- }
-
- - /**
- - * \brief Constructs and initializes a three-dimensional vector from the specified three-dimensional vector.
- - * \param vector The three-dimensional vector containing the xyz-coordinates.
- - */
- - inline Vector3(const Vector3 &vector)
- - {
- - val_[0] = vector[0];
- - val_[1] = vector[1];
- - val_[2] = vector[2];
- - }
- -
- /**
- * \brief Constructs and initializes a three-dimensional vector from the specified three-element array.
- * \param val The three-element array containing the xyz-coordinates.
|