84 std::vector<KeyFrame>& keyFrames = transport->
keyFrames;
86 bool mapChange =
false;
88 for (
size_t i = 0; i < path.
size(); ++i)
96 keyFrames.back().Teleport =
true;
102 keyFrames.push_back(k);
103 splinePath.push_back(G3D::Vector3(node_i.
x, node_i.
y, node_i.
z));
115 splinePath.erase(splinePath.begin());
116 keyFrames.erase(keyFrames.begin());
117 splinePath.pop_back();
118 keyFrames.pop_back();
120 if (cyclic && !splinePath.empty())
122 splinePath.pop_back();
123 keyFrames.pop_back();
127 ASSERT(!keyFrames.empty());
131 for (std::set<uint32>::const_iterator itr = transport->
mapsUsed.begin(); itr != transport->
mapsUsed.end(); ++itr)
140 keyFrames.back().Teleport =
true;
144 const float accel_dist = 0.5f * speed * speed / accel;
149 int32 firstStop = -1;
153 keyFrames[0].DistFromPrev = 0;
154 keyFrames[0].Index = 1;
155 if (keyFrames[0].IsStopFrame())
168 keyFrames[0].DistFromPrev = spline->
length(spline->
last() - 2, spline->
last() - 1);
169 keyFrames[0].Spline = spline;
170 for (
size_t i = 0; i < keyFrames.size(); ++i)
172 keyFrames[i].Index = i + 1;
173 keyFrames[i].DistFromPrev = spline->
length(i, i + 1);
175 keyFrames[i - 1].NextDistFromPrev = keyFrames[i].DistFromPrev;
176 keyFrames[i].Spline = spline;
177 if (keyFrames[i].IsStopFrame())
189 for (
size_t i = 1; i < keyFrames.size(); ++i)
191 if (keyFrames[i - 1].Teleport || i + 1 == keyFrames.size())
193 size_t extra = !keyFrames[i - 1].Teleport ? 1 : 0;
197 for (
size_t j = start; j < i + extra; ++j)
199 keyFrames[j].Index = j - start + 1;
200 keyFrames[j].DistFromPrev = spline->
length(j - start, j + 1 - start);
202 keyFrames[j - 1].NextDistFromPrev = keyFrames[j].DistFromPrev;
203 keyFrames[j].Spline = spline;
206 if (keyFrames[i - 1].Teleport)
208 keyFrames[i].Index = i - start + 1;
209 keyFrames[i].DistFromPrev = 0.0f;
210 keyFrames[i - 1].NextDistFromPrev = 0.0f;
211 keyFrames[i].Spline = spline;
217 if (keyFrames[i].IsStopFrame())
227 keyFrames.back().NextDistFromPrev = keyFrames.front().DistFromPrev;
229 if (firstStop == -1 || lastStop == -1)
230 firstStop = lastStop = 0;
235 float tmpDist = 0.0f;
236 for (
size_t i = 0; i < keyFrames.size(); ++i)
238 int32 j = (i + lastStop) % keyFrames.size();
239 if (keyFrames[j].IsStopFrame() || j == lastStop)
242 tmpDist += keyFrames[j].DistFromPrev;
243 keyFrames[j].DistSinceStop = tmpDist;
247 for (
int32 i =
int32(keyFrames.size()) - 1; i >= 0; i--)
249 int32 j = (i + firstStop) % keyFrames.size();
250 tmpDist += keyFrames[(j + 1) % keyFrames.size()].DistFromPrev;
251 keyFrames[j].DistUntilStop = tmpDist;
252 if (keyFrames[j].IsStopFrame() || j == firstStop)
256 for (
size_t i = 0; i < keyFrames.size(); ++i)
258 float total_dist = keyFrames[i].DistSinceStop + keyFrames[i].DistUntilStop;
259 if (total_dist < 2 * accel_dist)
261 if (keyFrames[i].DistSinceStop < keyFrames[i].DistUntilStop)
264 float segment_time = 2.0f * sqrt((keyFrames[i].DistUntilStop + keyFrames[i].DistSinceStop) / accel);
266 keyFrames[i].TimeTo = segment_time - sqrt(2 * keyFrames[i].DistSinceStop / accel);
269 keyFrames[i].TimeTo = sqrt(2 * keyFrames[i].DistUntilStop / accel);
271 else if (keyFrames[i].DistSinceStop < accel_dist)
274 float segment_time = (keyFrames[i].DistUntilStop + keyFrames[i].DistSinceStop) / speed + (speed / accel);
276 keyFrames[i].TimeTo = segment_time - sqrt(2 * keyFrames[i].DistSinceStop / accel);
278 else if (keyFrames[i].DistUntilStop < accel_dist)
279 keyFrames[i].TimeTo = sqrt(2 * keyFrames[i].DistUntilStop / accel);
281 keyFrames[i].TimeTo = (keyFrames[i].DistUntilStop / speed) + (0.5f * speed / accel);
285 float segmentTime = 0.0f;
286 for (
size_t i = 0; i < keyFrames.size(); ++i)
288 int32 j = (i + lastStop) % keyFrames.size();
289 if (keyFrames[j].IsStopFrame() || j == lastStop)
290 segmentTime = keyFrames[j].TimeTo;
291 keyFrames[j].TimeFrom = segmentTime - keyFrames[j].TimeTo;
295 keyFrames[0].ArriveTime = 0;
296 float curPathTime = 0.0f;
297 if (keyFrames[0].IsStopFrame())
299 curPathTime = float(keyFrames[0].Node->delay);
303 for (
size_t i = 1; i < keyFrames.size(); ++i)
305 curPathTime += keyFrames[i - 1].TimeTo;
306 if (keyFrames[i].IsStopFrame())
309 keyFrames[i - 1].NextArriveTime = keyFrames[i].ArriveTime;
310 curPathTime += float(keyFrames[i].Node->delay);
315 curPathTime -= keyFrames[i].TimeTo;
317 keyFrames[i - 1].NextArriveTime = keyFrames[i].ArriveTime;
318 keyFrames[i].DepartureTime = keyFrames[i].ArriveTime;
322 keyFrames.back().NextArriveTime = keyFrames.back().DepartureTime;
324 transport->
pathTime = keyFrames.back().DepartureTime;