52da1bcdca
bfc048670a
(cherry picked from commit86cdf1f2cf
)
282 lines
8.1 KiB
Diff
282 lines
8.1 KiB
Diff
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.
|