| 259 | } |
| 260 | |
| 261 | static 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; |
no test coverage detected