summaryrefslogtreecommitdiffstats
path: root/thirdparty/rvo2/rvo2_3d/RVOSimulator3d.cc
diff options
context:
space:
mode:
Diffstat (limited to 'thirdparty/rvo2/rvo2_3d/RVOSimulator3d.cc')
-rw-r--r--thirdparty/rvo2/rvo2_3d/RVOSimulator3d.cc250
1 files changed, 250 insertions, 0 deletions
diff --git a/thirdparty/rvo2/rvo2_3d/RVOSimulator3d.cc b/thirdparty/rvo2/rvo2_3d/RVOSimulator3d.cc
new file mode 100644
index 0000000000..346d604497
--- /dev/null
+++ b/thirdparty/rvo2/rvo2_3d/RVOSimulator3d.cc
@@ -0,0 +1,250 @@
+/*
+ * RVOSimulator3d.cc
+ * RVO2-3D Library
+ *
+ * SPDX-FileCopyrightText: 2008 University of North Carolina at Chapel Hill
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * 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
+ *
+ * https://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
+ *
+ * <https://gamma.cs.unc.edu/RVO2/>
+ */
+
+#include "RVOSimulator3d.h"
+
+#include <utility>
+
+#ifdef _OPENMP
+#include <omp.h>
+#endif /* _OPENMP */
+
+#include "Agent3d.h"
+#include "KdTree3d.h"
+#include "Plane.h"
+
+namespace RVO3D {
+RVOSimulator3D::RVOSimulator3D()
+ : defaultAgent_(NULL),
+ kdTree_(new KdTree3D(this)),
+ globalTime_(0.0F),
+ timeStep_(0.0F) {}
+
+RVOSimulator3D::RVOSimulator3D(float timeStep, float neighborDist,
+ std::size_t maxNeighbors, float timeHorizon,
+ float radius, float maxSpeed,
+ const Vector3 &velocity)
+ : defaultAgent_(new Agent3D()),
+ kdTree_(new KdTree3D(this)),
+ globalTime_(0.0F),
+ timeStep_(timeStep) {
+ defaultAgent_->maxNeighbors_ = maxNeighbors;
+ defaultAgent_->maxSpeed_ = maxSpeed;
+ defaultAgent_->neighborDist_ = neighborDist;
+ defaultAgent_->radius_ = radius;
+ defaultAgent_->timeHorizon_ = timeHorizon;
+ defaultAgent_->velocity_ = velocity;
+}
+
+RVOSimulator3D::~RVOSimulator3D() {
+ delete defaultAgent_;
+ delete kdTree_;
+
+ for (std::size_t i = 0U; i < agents_.size(); ++i) {
+ delete agents_[i];
+ }
+}
+
+std::size_t RVOSimulator3D::getAgentNumAgentNeighbors(std::size_t agentNo) const {
+ return agents_[agentNo]->agentNeighbors_.size();
+}
+
+std::size_t RVOSimulator3D::getAgentAgentNeighbor(std::size_t agentNo,
+ std::size_t neighborNo) const {
+ return agents_[agentNo]->agentNeighbors_[neighborNo].second->id_;
+}
+
+std::size_t RVOSimulator3D::getAgentNumORCAPlanes(std::size_t agentNo) const {
+ return agents_[agentNo]->orcaPlanes_.size();
+}
+
+const Plane &RVOSimulator3D::getAgentORCAPlane(std::size_t agentNo,
+ std::size_t planeNo) const {
+ return agents_[agentNo]->orcaPlanes_[planeNo];
+}
+
+void RVOSimulator3D::removeAgent(std::size_t agentNo) {
+ delete agents_[agentNo];
+ agents_[agentNo] = agents_.back();
+ agents_.pop_back();
+}
+
+std::size_t RVOSimulator3D::addAgent(const Vector3 &position) {
+ if (defaultAgent_ == NULL) {
+ return RVO3D_ERROR;
+ }
+
+ Agent3D *agent = new Agent3D();
+
+ agent->position_ = position;
+ agent->maxNeighbors_ = defaultAgent_->maxNeighbors_;
+ agent->maxSpeed_ = defaultAgent_->maxSpeed_;
+ agent->neighborDist_ = defaultAgent_->neighborDist_;
+ agent->radius_ = defaultAgent_->radius_;
+ agent->timeHorizon_ = defaultAgent_->timeHorizon_;
+ agent->velocity_ = defaultAgent_->velocity_;
+
+ agent->id_ = agents_.size();
+
+ agents_.push_back(agent);
+
+ return agents_.size() - 1U;
+}
+
+std::size_t RVOSimulator3D::addAgent(const Vector3 &position, float neighborDist,
+ std::size_t maxNeighbors, float timeHorizon,
+ float radius, float maxSpeed,
+ const Vector3 &velocity) {
+ Agent3D *agent = new Agent3D();
+
+ agent->position_ = position;
+ agent->maxNeighbors_ = maxNeighbors;
+ agent->maxSpeed_ = maxSpeed;
+ agent->neighborDist_ = neighborDist;
+ agent->radius_ = radius;
+ agent->timeHorizon_ = timeHorizon;
+ agent->velocity_ = velocity;
+
+ agent->id_ = agents_.size();
+
+ agents_.push_back(agent);
+
+ return agents_.size() - 1U;
+}
+
+void RVOSimulator3D::doStep() {
+ kdTree_->buildAgentTree(agents_);
+
+#ifdef _OPENMP
+#pragma omp parallel for
+#endif /* _OPENMP */
+ for (int i = 0; i < static_cast<int>(agents_.size()); ++i) {
+ agents_[i]->computeNeighbors(this);
+ agents_[i]->computeNewVelocity(this);
+ }
+
+#ifdef _OPENMP
+#pragma omp parallel for
+#endif /* _OPENMP */
+ for (int i = 0; i < static_cast<int>(agents_.size()); ++i) {
+ agents_[i]->update(this);
+ }
+
+ globalTime_ += timeStep_;
+}
+
+std::size_t RVOSimulator3D::getAgentMaxNeighbors(std::size_t agentNo) const {
+ return agents_[agentNo]->maxNeighbors_;
+}
+
+float RVOSimulator3D::getAgentMaxSpeed(std::size_t agentNo) const {
+ return agents_[agentNo]->maxSpeed_;
+}
+
+float RVOSimulator3D::getAgentNeighborDist(std::size_t agentNo) const {
+ return agents_[agentNo]->neighborDist_;
+}
+
+const Vector3 &RVOSimulator3D::getAgentPosition(std::size_t agentNo) const {
+ return agents_[agentNo]->position_;
+}
+
+const Vector3 &RVOSimulator3D::getAgentPrefVelocity(std::size_t agentNo) const {
+ return agents_[agentNo]->prefVelocity_;
+}
+
+float RVOSimulator3D::getAgentRadius(std::size_t agentNo) const {
+ return agents_[agentNo]->radius_;
+}
+
+float RVOSimulator3D::getAgentTimeHorizon(std::size_t agentNo) const {
+ return agents_[agentNo]->timeHorizon_;
+}
+
+const Vector3 &RVOSimulator3D::getAgentVelocity(std::size_t agentNo) const {
+ return agents_[agentNo]->velocity_;
+}
+
+void RVOSimulator3D::setAgentDefaults(float neighborDist,
+ std::size_t maxNeighbors, float timeHorizon,
+ float radius, float maxSpeed,
+ const Vector3 &velocity) {
+ if (defaultAgent_ == NULL) {
+ defaultAgent_ = new Agent3D();
+ }
+
+ defaultAgent_->maxNeighbors_ = maxNeighbors;
+ defaultAgent_->maxSpeed_ = maxSpeed;
+ defaultAgent_->neighborDist_ = neighborDist;
+ defaultAgent_->radius_ = radius;
+ defaultAgent_->timeHorizon_ = timeHorizon;
+ defaultAgent_->velocity_ = velocity;
+}
+
+void RVOSimulator3D::setAgentMaxNeighbors(std::size_t agentNo,
+ std::size_t maxNeighbors) {
+ agents_[agentNo]->maxNeighbors_ = maxNeighbors;
+}
+
+void RVOSimulator3D::setAgentMaxSpeed(std::size_t agentNo, float maxSpeed) {
+ agents_[agentNo]->maxSpeed_ = maxSpeed;
+}
+
+void RVOSimulator3D::setAgentNeighborDist(std::size_t agentNo,
+ float neighborDist) {
+ agents_[agentNo]->neighborDist_ = neighborDist;
+}
+
+void RVOSimulator3D::setAgentPosition(std::size_t agentNo,
+ const Vector3 &position) {
+ agents_[agentNo]->position_ = position;
+}
+
+void RVOSimulator3D::setAgentPrefVelocity(std::size_t agentNo,
+ const Vector3 &prefVelocity) {
+ agents_[agentNo]->prefVelocity_ = prefVelocity;
+}
+
+void RVOSimulator3D::setAgentRadius(std::size_t agentNo, float radius) {
+ agents_[agentNo]->radius_ = radius;
+}
+
+void RVOSimulator3D::setAgentTimeHorizon(std::size_t agentNo, float timeHorizon) {
+ agents_[agentNo]->timeHorizon_ = timeHorizon;
+}
+
+void RVOSimulator3D::setAgentVelocity(std::size_t agentNo,
+ const Vector3 &velocity) {
+ agents_[agentNo]->velocity_ = velocity;
+}
+} /* namespace RVO3D */