MCPcopy Create free account
hub / github.com/bfbbdecomp/bfbb / SolvePaddleMotion

Function SolvePaddleMotion

src/SB/Game/zPlatform.cpp:261–379  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

259}
260
261static F32 SolvePaddleMotion(zPlatform* plat, F32* time, F32 tmr)
262{
263 xPlatformPaddleData* paddle = &plat->passet->paddle;
264
265 F32 destOrient = paddle->orient[plat->ctr];
266 F32 srcOrient;
267 if (plat->state == 1 || plat->state == 3) {
268 if (plat->ctr + 1 == paddle->countOrient) {
269 srcOrient = paddle->orientLoop;
270 } else {
271 srcOrient = paddle->orient[plat->ctr + 1];
272 }
273 } else if (plat->state == 2 || plat->state == 4) {
274 if (plat->ctr == 0) {
275 destOrient = paddle->orientLoop;
276 srcOrient = paddle->orient[paddle->countOrient - 1];
277 } else {
278 srcOrient = paddle->orient[plat->ctr - 1];
279 }
280 } else {
281 return destOrient;
282 }
283
284 F32 absDelta = xabs(destOrient - srcOrient);
285
286 if (plat->state == 3 || plat->state == 4) {
287 time[0] = 0.0f;
288 time[1] = 0.2f;
289 time[2] = 0.0f;
290
291 if (tmr >= 0.0f) {
292 if (tmr > 0.1f) tmr = 0.2f - tmr;
293
294 F32 stutterAmount = 100.0f * tmr;
295 if (destOrient < srcOrient) stutterAmount = -stutterAmount;
296
297 return destOrient + stutterAmount;
298 }
299
300 return destOrient;
301 }
302
303 F32 A = 0.0f;
304 F32 D = 0.0f;
305 F32 distA, distC, distD;
306
307 if (paddle->accelTime && paddle->decelTime) {
308 A = paddle->rotateSpeed / paddle->accelTime;
309 D = paddle->rotateSpeed / paddle->decelTime;
310
311 time[0] = xsqrt(2.0f * D * absDelta / (A * D + A * A));
312 if (time[0] < paddle->accelTime) {
313 time[1] = 0.0f;
314 time[2] = A * time[0] / D;
315 } else {
316 distA = 0.5f * paddle->rotateSpeed * paddle->accelTime;
317 distD = 0.5f * paddle->rotateSpeed * paddle->decelTime;
318 distC = absDelta - distA - distD;

Callers 2

zPlatform_UpdateFunction · 0.70

Calls 1

xsqrtFunction · 0.85

Tested by

no test coverage detected