| 470 | } |
| 471 | |
| 472 | static void _xCameraUpdate(xCamera* cam, F32 dt) |
| 473 | // NONMATCH("https://decomp.me/scratch/2q6zO") |
| 474 | { |
| 475 | if (!cam->tgt_mat) |
| 476 | return; |
| 477 | |
| 478 | static F32 last_dt = 1.0f / 60; |
| 479 | |
| 480 | xCam_worldtocyl(cam->dcur, cam->hcur, cam->pcur, cam->tgt_mat, &cam->mat.pos, cam->flags); |
| 481 | |
| 482 | F32 wcvx = cam->mat.pos.x - cam->omat.pos.x; |
| 483 | F32 wcvy = cam->mat.pos.y - cam->omat.pos.y; |
| 484 | F32 wcvz = cam->mat.pos.z - cam->omat.pos.z; |
| 485 | F32 m = 1.0f / last_dt; |
| 486 | wcvx *= m; |
| 487 | wcvy *= m; |
| 488 | wcvz *= m; |
| 489 | |
| 490 | cam->omat.pos = cam->mat.pos; |
| 491 | |
| 492 | xCam_buildbasis(cam); |
| 493 | |
| 494 | F32 dcv = wcvx * cam->mbasis.at.x + wcvz * cam->mbasis.at.z; |
| 495 | F32 hcv = wcvy; |
| 496 | F32 pcv = wcvx * cam->mbasis.right.x + wcvz * cam->mbasis.right.z; |
| 497 | wcvx *= dt; |
| 498 | wcvy *= dt; |
| 499 | wcvz *= dt; |
| 500 | |
| 501 | cam->mat.pos.x += wcvx; |
| 502 | cam->mat.pos.y += wcvy; |
| 503 | cam->mat.pos.z += wcvz; |
| 504 | |
| 505 | if (cam->flags & 0x1) |
| 506 | { |
| 507 | F32 tnext = cam->tmr - dt; |
| 508 | if (tnext <= 0.0f) |
| 509 | { |
| 510 | cam->flags &= ~0x1; |
| 511 | cam->tmr = 0.0f; |
| 512 | cam->omat.pos = cam->mat.pos; |
| 513 | } |
| 514 | else |
| 515 | { |
| 516 | F32 dtg = cam->dgoal - cam->dcur; |
| 517 | F32 htg = cam->hgoal - cam->hcur; |
| 518 | F32 ptg = (cam->dgoal + cam->dcur) * xDangleClamp(cam->pgoal - cam->pcur) * 0.5f; |
| 519 | F32 dsv, hsv, psv; |
| 520 | if (tnext <= cam->tm_dec) |
| 521 | { |
| 522 | F32 T_inv = 1.0f / cam->tmr; |
| 523 | dsv = (2.0f * dtg - dcv * dt) * T_inv; |
| 524 | hsv = (2.0f * htg - hcv * dt) * T_inv; |
| 525 | psv = (2.0f * ptg - pcv * dt) * T_inv; |
| 526 | } |
| 527 | else if (tnext <= cam->tm_acc) |
| 528 | { |
| 529 | F32 T_inv = 1.0f / (2.0f * cam->tmr - dt - cam->tm_dec); |
no test coverage detected