| 1511 | } |
| 1512 | |
| 1513 | void xBinaryCamera::update(F32 dt) |
| 1514 | // NONMATCH("https://decomp.me/scratch/c9iST") |
| 1515 | { |
| 1516 | xVec3& A = camera->mat.pos; |
| 1517 | const xVec3& B = *s1; |
| 1518 | const xVec3& C = *s2; |
| 1519 | |
| 1520 | xVec3 CA = { 0.0f, 0.0f, 0.0f }; |
| 1521 | CA.x = A.x - C.x; |
| 1522 | CA.z = A.z - C.z; |
| 1523 | |
| 1524 | F32 dCA = CA.length(); |
| 1525 | if (dCA < 0.01f) |
| 1526 | { |
| 1527 | CA.assign(A.x - B.x, 0.0f, A.z - B.z).right_normalize(); |
| 1528 | dCA = 0.01f; |
| 1529 | } |
| 1530 | else |
| 1531 | { |
| 1532 | CA /= dCA; |
| 1533 | } |
| 1534 | |
| 1535 | F32 yaw_start = xatan2(B.x - A.x, B.z - A.z); |
| 1536 | F32 yaw_end; |
| 1537 | if (dCA > s2_radius) |
| 1538 | { |
| 1539 | xVec3 Q1, Q2; |
| 1540 | bound_sphere_xz(Q1, Q2, C, s2_radius, CA, dCA); |
| 1541 | F32 yaw_Q1 = xatan2(Q1.x - A.x, Q1.z - A.z); |
| 1542 | F32 yaw_Q2 = xatan2(Q2.x - A.x, Q2.z - A.z); |
| 1543 | F32 dyaw1 = xrmod(yaw_Q1 - yaw_start + PI) - PI; |
| 1544 | F32 dyaw2 = xrmod(yaw_Q2 - yaw_start + PI) - PI; |
| 1545 | |
| 1546 | F32 fov = DEG2RAD(1.0f) * xCameraGetFOV(camera) * 0.5f + cfg.margin_angle; |
| 1547 | fov = range_limit(fov, 0.0f, PI); |
| 1548 | F32 max_dyaw = 0.5f * xabs(dyaw2 - dyaw1); |
| 1549 | if (max_dyaw > fov) |
| 1550 | { |
| 1551 | yaw_end = xatan2(C.x - B.x, C.z - B.z); |
| 1552 | } |
| 1553 | else if (dyaw1 >= dyaw2) |
| 1554 | { |
| 1555 | yaw_end = xatan2(C.x - B.x, C.z - B.z); |
| 1556 | } |
| 1557 | else if (dyaw1 >= -fov) |
| 1558 | { |
| 1559 | if (dyaw2 <= fov) |
| 1560 | { |
| 1561 | yaw_end = yaw_start; |
| 1562 | } |
| 1563 | else |
| 1564 | { |
| 1565 | yaw_end = yaw_start + (dyaw2 - fov); |
| 1566 | } |
| 1567 | } |
| 1568 | else |
| 1569 | { |
| 1570 | yaw_end = yaw_start + (dyaw1 + fov); |
nothing calls this directly
no test coverage detected