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

Method update

src/SB/Core/x/xCamera.cpp:1513–1661  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1511}
1512
1513void 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);

Callers

nothing calls this directly

Calls 15

xatan2Function · 0.85
bound_sphere_xzFunction · 0.85
xCameraGetFOVFunction · 0.85
range_limitFunction · 0.85
xexpFunction · 0.85
isinFunction · 0.85
icosFunction · 0.85
xsqrtFunction · 0.85
render_debugFunction · 0.85
lengthMethod · 0.80
xrmodFunction · 0.70
xMat3x3LookVecFunction · 0.70

Tested by

no test coverage detected