| 446 | } |
| 447 | |
| 448 | void xSpline3_EvalSeg(xSpline3* spl, F32 u, U32 deriv, xVec3* o) |
| 449 | { |
| 450 | xCoef3 tempCoef; |
| 451 | F32 temp_u; |
| 452 | F32 new_u; |
| 453 | U32 seg; |
| 454 | |
| 455 | if ((U16)spl->type == 4) |
| 456 | { |
| 457 | EvalBspline3(spl, u, deriv, o); |
| 458 | return; |
| 459 | } |
| 460 | if (u < 0.0f) |
| 461 | { |
| 462 | u = 0.0f; |
| 463 | } |
| 464 | temp_u = floorf(u); |
| 465 | seg = (U32)temp_u; |
| 466 | if (seg >= spl->N) |
| 467 | { |
| 468 | new_u = 1.0f; |
| 469 | seg = spl->N - 1; |
| 470 | } |
| 471 | else |
| 472 | { |
| 473 | new_u = u - temp_u; |
| 474 | } |
| 475 | |
| 476 | switch (spl->type) |
| 477 | { |
| 478 | case 1: |
| 479 | EvalCoef3(spl->coef + (seg * 0x30), new_u, deriv, o); |
| 480 | return; |
| 481 | case 2: |
| 482 | BasisToCoef3(&tempCoef, (f32(*)[4])sBasisHermite, spl->points + (seg * 0xC), |
| 483 | spl->p12 + (seg * 0x18), spl->p12 + (seg * 0x18) + 0xC, |
| 484 | spl->points + (seg * 0xC) + 0xC); |
| 485 | EvalCoef3(&tempCoef, new_u, deriv, o); |
| 486 | return; |
| 487 | case 3: |
| 488 | BasisToCoef3(&tempCoef, (F32(*)[4])sBasisBezier, spl->points + (seg * 0xC), |
| 489 | spl->p12 + (seg * 0x18), spl->p12 + (seg * 0x18) + 0xC, |
| 490 | spl->points + (seg * 0xC) + 0xC); |
| 491 | EvalCoef3(&tempCoef, new_u, deriv, o); |
| 492 | return; |
| 493 | } |
| 494 | } |
| 495 | |
| 496 | F32 ArcEvalIterate(xSpline3* spl, F32 s, U32 deriv, xVec3* o, U32 iterations) |
| 497 | { |
no test coverage detected