Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/thirdparty/rvo2/rvo2_3d/RVOSimulator3d.cpp
9902 views
1
/*
2
* RVOSimulator.cpp
3
* RVO2-3D Library
4
*
5
* Copyright 2008 University of North Carolina at Chapel Hill
6
*
7
* Licensed under the Apache License, Version 2.0 (the "License");
8
* you may not use this file except in compliance with the License.
9
* You may obtain a copy of the License at
10
*
11
* http://www.apache.org/licenses/LICENSE-2.0
12
*
13
* Unless required by applicable law or agreed to in writing, software
14
* distributed under the License is distributed on an "AS IS" BASIS,
15
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
* See the License for the specific language governing permissions and
17
* limitations under the License.
18
*
19
* Please send all bug reports to <[email protected]>.
20
*
21
* The authors may be contacted via:
22
*
23
* Jur van den Berg, Stephen J. Guy, Jamie Snape, Ming C. Lin, Dinesh Manocha
24
* Dept. of Computer Science
25
* 201 S. Columbia St.
26
* Frederick P. Brooks, Jr. Computer Science Bldg.
27
* Chapel Hill, N.C. 27599-3175
28
* United States of America
29
*
30
* <http://gamma.cs.unc.edu/RVO2/>
31
*/
32
33
#include "RVOSimulator3d.h"
34
35
#ifdef _OPENMP
36
#include <omp.h>
37
#endif
38
39
#include "Agent3d.h"
40
#include "KdTree3d.h"
41
42
namespace RVO3D {
43
RVOSimulator3D::RVOSimulator3D() : defaultAgent_(NULL), kdTree_(NULL), globalTime_(0.0f), timeStep_(0.0f)
44
{
45
kdTree_ = new KdTree3D(this);
46
}
47
48
RVOSimulator3D::RVOSimulator3D(float timeStep, float neighborDist, size_t maxNeighbors, float timeHorizon, float radius, float maxSpeed, const Vector3 &velocity) : defaultAgent_(NULL), kdTree_(NULL), globalTime_(0.0f), timeStep_(timeStep)
49
{
50
kdTree_ = new KdTree3D(this);
51
defaultAgent_ = new Agent3D();
52
53
defaultAgent_->maxNeighbors_ = maxNeighbors;
54
defaultAgent_->maxSpeed_ = maxSpeed;
55
defaultAgent_->neighborDist_ = neighborDist;
56
defaultAgent_->radius_ = radius;
57
defaultAgent_->timeHorizon_ = timeHorizon;
58
defaultAgent_->velocity_ = velocity;
59
}
60
61
RVOSimulator3D::~RVOSimulator3D()
62
{
63
if (defaultAgent_ != NULL) {
64
delete defaultAgent_;
65
}
66
67
for (size_t i = 0; i < agents_.size(); ++i) {
68
delete agents_[i];
69
}
70
71
if (kdTree_ != NULL) {
72
delete kdTree_;
73
}
74
}
75
76
size_t RVOSimulator3D::getAgentNumAgentNeighbors(size_t agentNo) const
77
{
78
return agents_[agentNo]->agentNeighbors_.size();
79
}
80
81
size_t RVOSimulator3D::getAgentAgentNeighbor(size_t agentNo, size_t neighborNo) const
82
{
83
return agents_[agentNo]->agentNeighbors_[neighborNo].second->id_;
84
}
85
86
size_t RVOSimulator3D::getAgentNumORCAPlanes(size_t agentNo) const
87
{
88
return agents_[agentNo]->orcaPlanes_.size();
89
}
90
91
const Plane &RVOSimulator3D::getAgentORCAPlane(size_t agentNo, size_t planeNo) const
92
{
93
return agents_[agentNo]->orcaPlanes_[planeNo];
94
}
95
96
void RVOSimulator3D::removeAgent(size_t agentNo)
97
{
98
delete agents_[agentNo];
99
agents_[agentNo] = agents_.back();
100
agents_.pop_back();
101
}
102
103
size_t RVOSimulator3D::addAgent(const Vector3 &position)
104
{
105
if (defaultAgent_ == NULL) {
106
return RVO3D_ERROR;
107
}
108
109
Agent3D *agent = new Agent3D();
110
111
agent->position_ = position;
112
agent->maxNeighbors_ = defaultAgent_->maxNeighbors_;
113
agent->maxSpeed_ = defaultAgent_->maxSpeed_;
114
agent->neighborDist_ = defaultAgent_->neighborDist_;
115
agent->radius_ = defaultAgent_->radius_;
116
agent->timeHorizon_ = defaultAgent_->timeHorizon_;
117
agent->velocity_ = defaultAgent_->velocity_;
118
119
agent->id_ = agents_.size();
120
121
agents_.push_back(agent);
122
123
return agents_.size() - 1;
124
}
125
126
size_t RVOSimulator3D::addAgent(const Vector3 &position, float neighborDist, size_t maxNeighbors, float timeHorizon, float radius, float maxSpeed, const Vector3 &velocity)
127
{
128
Agent3D *agent = new Agent3D();
129
130
agent->position_ = position;
131
agent->maxNeighbors_ = maxNeighbors;
132
agent->maxSpeed_ = maxSpeed;
133
agent->neighborDist_ = neighborDist;
134
agent->radius_ = radius;
135
agent->timeHorizon_ = timeHorizon;
136
agent->velocity_ = velocity;
137
138
agent->id_ = agents_.size();
139
140
agents_.push_back(agent);
141
142
return agents_.size() - 1;
143
}
144
145
void RVOSimulator3D::doStep()
146
{
147
kdTree_->buildAgentTree(agents_);
148
149
for (int i = 0; i < static_cast<int>(agents_.size()); ++i) {
150
agents_[i]->computeNeighbors(this);
151
agents_[i]->computeNewVelocity(this);
152
}
153
154
for (int i = 0; i < static_cast<int>(agents_.size()); ++i) {
155
agents_[i]->update(this);
156
}
157
158
globalTime_ += timeStep_;
159
}
160
161
size_t RVOSimulator3D::getAgentMaxNeighbors(size_t agentNo) const
162
{
163
return agents_[agentNo]->maxNeighbors_;
164
}
165
166
float RVOSimulator3D::getAgentMaxSpeed(size_t agentNo) const
167
{
168
return agents_[agentNo]->maxSpeed_;
169
}
170
171
float RVOSimulator3D::getAgentNeighborDist(size_t agentNo) const
172
{
173
return agents_[agentNo]->neighborDist_;
174
}
175
176
const Vector3 &RVOSimulator3D::getAgentPosition(size_t agentNo) const
177
{
178
return agents_[agentNo]->position_;
179
}
180
181
const Vector3 &RVOSimulator3D::getAgentPrefVelocity(size_t agentNo) const
182
{
183
return agents_[agentNo]->prefVelocity_;
184
}
185
186
float RVOSimulator3D::getAgentRadius(size_t agentNo) const
187
{
188
return agents_[agentNo]->radius_;
189
}
190
191
float RVOSimulator3D::getAgentTimeHorizon(size_t agentNo) const
192
{
193
return agents_[agentNo]->timeHorizon_;
194
}
195
196
const Vector3 &RVOSimulator3D::getAgentVelocity(size_t agentNo) const
197
{
198
return agents_[agentNo]->velocity_;
199
}
200
201
float RVOSimulator3D::getGlobalTime() const
202
{
203
return globalTime_;
204
}
205
206
size_t RVOSimulator3D::getNumAgents() const
207
{
208
return agents_.size();
209
}
210
211
float RVOSimulator3D::getTimeStep() const
212
{
213
return timeStep_;
214
}
215
216
void RVOSimulator3D::setAgentDefaults(float neighborDist, size_t maxNeighbors, float timeHorizon, float radius, float maxSpeed, const Vector3 &velocity)
217
{
218
if (defaultAgent_ == NULL) {
219
defaultAgent_ = new Agent3D();
220
}
221
222
defaultAgent_->maxNeighbors_ = maxNeighbors;
223
defaultAgent_->maxSpeed_ = maxSpeed;
224
defaultAgent_->neighborDist_ = neighborDist;
225
defaultAgent_->radius_ = radius;
226
defaultAgent_->timeHorizon_ = timeHorizon;
227
defaultAgent_->velocity_ = velocity;
228
}
229
230
void RVOSimulator3D::setAgentMaxNeighbors(size_t agentNo, size_t maxNeighbors)
231
{
232
agents_[agentNo]->maxNeighbors_ = maxNeighbors;
233
}
234
235
void RVOSimulator3D::setAgentMaxSpeed(size_t agentNo, float maxSpeed)
236
{
237
agents_[agentNo]->maxSpeed_ = maxSpeed;
238
}
239
240
void RVOSimulator3D::setAgentNeighborDist(size_t agentNo, float neighborDist)
241
{
242
agents_[agentNo]->neighborDist_ = neighborDist;
243
}
244
245
void RVOSimulator3D::setAgentPosition(size_t agentNo, const Vector3 &position)
246
{
247
agents_[agentNo]->position_ = position;
248
}
249
250
void RVOSimulator3D::setAgentPrefVelocity(size_t agentNo, const Vector3 &prefVelocity)
251
{
252
agents_[agentNo]->prefVelocity_ = prefVelocity;
253
}
254
255
void RVOSimulator3D::setAgentRadius(size_t agentNo, float radius)
256
{
257
agents_[agentNo]->radius_ = radius;
258
}
259
260
void RVOSimulator3D::setAgentTimeHorizon(size_t agentNo, float timeHorizon)
261
{
262
agents_[agentNo]->timeHorizon_ = timeHorizon;
263
}
264
265
void RVOSimulator3D::setAgentVelocity(size_t agentNo, const Vector3 &velocity)
266
{
267
agents_[agentNo]->velocity_ = velocity;
268
}
269
270
void RVOSimulator3D::setTimeStep(float timeStep)
271
{
272
timeStep_ = timeStep;
273
}
274
}
275
276