diff options
Diffstat (limited to 'thirdparty/rvo2/rvo2_3d/RVOSimulator3d.cc')
-rw-r--r-- | thirdparty/rvo2/rvo2_3d/RVOSimulator3d.cc | 250 |
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 */ |