From cbca59d49eb580a4eb0b59f63e62f7e60c35185e Mon Sep 17 00:00:00 2001 From: engineer124 <47598039+engineer124@users.noreply.github.com> Date: Sun, 22 Oct 2023 02:35:23 +1100 Subject: [PATCH] Match `Camera_KeepOn1` (#1447) * Match Camera_KeepOn1 * small cleanup --- include/z64camera.h | 2 +- src/code/z_camera.c | 314 ++++++++++++++++++++------------------------ 2 files changed, 144 insertions(+), 172 deletions(-) diff --git a/include/z64camera.h b/include/z64camera.h index ccdee88112..ad88a76709 100644 --- a/include/z64camera.h +++ b/include/z64camera.h @@ -859,7 +859,7 @@ typedef struct { { data11, CAM_DATA_11 } typedef struct { - /* 0x00 */ f32 unk_00; + /* 0x00 */ f32 yOffset; /* 0x04 */ f32 unk_04; /* 0x08 */ f32 unk_08; /* 0x0C */ f32 unk_0C; diff --git a/src/code/z_camera.c b/src/code/z_camera.c index 6ff74e9df6..8f3fb9a3ac 100644 --- a/src/code/z_camera.c +++ b/src/code/z_camera.c @@ -3951,23 +3951,19 @@ s32 Camera_Battle0(Camera* camera) { /** * Used for following a secondary target such as zora fins or a z-target */ -// Very non-equivalent, many fakes. May need to restart from scratch (mips2c) -#ifdef NON_EQUIVALENT s32 Camera_KeepOn1(Camera* camera) { - f32 pad1; - f32* pad2; - Vec3f* sp48 = &camera->eye; - Vec3f* sp44 = &camera->at; - Vec3f* sp40 = &camera->eyeNext; + Vec3f* eye = &camera->eye; + Vec3f* at = &camera->at; + Vec3f* eyeNext = &camera->eyeNext; Vec3f sp130; Vec3f sp124; Vec3f sp118; f32 sp114; - PosRot* sp3C = &camera->focalActorPosRot; - PosRot* sp30 = &camera->targetPosRot; + PosRot* focalActorPosRot = &camera->focalActorPosRot; + s32 pad1; + f32 var2; f32 sp104; f32 temp_f2_3; - f32 new_var; f32 spFC; f32 spF8; f32 spF4; @@ -3977,36 +3973,21 @@ s32 Camera_KeepOn1(Camera* camera) { VecGeo spE0; VecGeo spD8; VecGeo spD0; - VecGeo spC8; - VecGeo spC0; - f32 new_var2; - s32 new_var3; - f32 temp_f0; - Vec3f spA8; - PosRot* spA4; + VecGeo atToEye; + VecGeo atToEyeNext; + s32 pad2; + PosRot spA8; + PosRot* spA4 = &camera->focalActor->focus; CameraCollision sp7C; - - s32 sp78; + s32 skipEyeAtCalc = false; f32 sp74; s16 sp72; s16 sp70; - f32 sp60; - s16 sp56; - s16 sp54; - - s16 phi_v1_3; - s16 phi_a0; KeepOn1ReadOnlyData* roData = &camera->paramData.keep1.roData; KeepOn1ReadWriteData* rwData = &camera->paramData.keep1.rwData; - s16 temp_v0_3; - s16 new_var4; - - spA4 = &camera->focalActor->focus; - //! FAKE - if (temp_v0_3) {} - sp78 = 0; - temp_f0 = Camera_GetFocalActorHeight(camera); - // temp_a1 = camera->target; + s32 pad3; + f32 focalActorHeight = Camera_GetFocalActorHeight(camera); + s32 pad4; if ((camera->target == NULL) || (camera->target->update == NULL)) { camera->target = NULL; @@ -4017,7 +3998,8 @@ s32 Camera_KeepOn1(Camera* camera) { if (RELOAD_PARAMS(camera)) { CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values; - roData->unk_00 = GET_NEXT_SCALED_RO_DATA(values) * temp_f0 * (0.8f - ((68.0f / temp_f0) * -0.2f)); + roData->yOffset = + GET_NEXT_SCALED_RO_DATA(values) * focalActorHeight * (0.8f - ((68.0f / focalActorHeight) * -0.2f)); roData->unk_04 = GET_NEXT_RO_DATA(values); roData->unk_08 = GET_NEXT_RO_DATA(values); roData->unk_0C = GET_NEXT_RO_DATA(values); @@ -4026,10 +4008,8 @@ s32 Camera_KeepOn1(Camera* camera) { roData->unk_14 = 40.0f - (40.0f - roData->unk_14); roData->unk_18 = GET_NEXT_RO_DATA(values); roData->unk_18 = 20.0f - (20.0f - roData->unk_18); - // roData->unk_18 = roData->unk_18; // TODO: Fake - // if (!roData->unk_08) {} roData->unk_1C = GET_NEXT_SCALED_RO_DATA(values); - roData->unk_1C = 1.000f - (1.00f - roData->unk_1C); // TODO: Necessary? + roData->unk_1C = 1.000f - (1.00f - roData->unk_1C); roData->unk_20 = GET_NEXT_RO_DATA(values); roData->unk_24 = GET_NEXT_SCALED_RO_DATA(values); roData->unk_24 = 1.0f - (1.0f - roData->unk_24); @@ -4038,11 +4018,11 @@ s32 Camera_KeepOn1(Camera* camera) { roData->unk_28 = 0.2f - (0.2f - roData->unk_28); } - sp60 = temp_f0; - sp114 = roData->unk_00; // TODO: likely fake temp - sp60 += sp114; - OLib_Vec3fDiffToVecGeo(&spC8, sp44, sp48); - OLib_Vec3fDiffToVecGeo(&spC0, sp44, sp40); + focalActorHeight += roData->yOffset; + + OLib_Vec3fDiffToVecGeo(&atToEye, at, eye); + OLib_Vec3fDiffToVecGeo(&atToEyeNext, at, eyeNext); + sCameraInterfaceFlags = roData->interfaceFlags; if (RELOAD_PARAMS(camera)) { @@ -4052,38 +4032,38 @@ s32 Camera_KeepOn1(Camera* camera) { rwData->unk_04 = 0.0f; rwData->unk_0C = camera->target; rwData->unk_16 = 7; - rwData->unk_12 = spC8.yaw; - rwData->unk_14 = spC8.pitch; - rwData->unk_00 = spC8.r; - rwData->unk_08 = sp3C->pos.y - camera->unk_0F0.y; - if ((2.0f * roData->unk_04) < camera->dist) { + rwData->unk_12 = atToEye.yaw; + rwData->unk_14 = atToEye.pitch; + rwData->unk_00 = atToEye.r; + rwData->unk_08 = focalActorPosRot->pos.y - camera->unk_0F0.y; + if (camera->dist > (2.0f * roData->unk_04)) { camera->dist = 2.0f * roData->unk_04; - spC0.r = camera->dist; - spC8.r = spC0.r; - OLib_AddVecGeoToVec3f(sp48, sp44, &spC8); - *sp40 = *sp48; + atToEyeNext.r = camera->dist; + atToEye.r = atToEyeNext.r; + OLib_AddVecGeoToVec3f(eye, at, &atToEye); + *eyeNext = *eye; } } if (camera->status == CAM_STATUS_ACTIVE) { sUpdateCameraDirection = true; - camera->inputDir.x = -spC8.pitch; - camera->inputDir.y = spC8.yaw + 0x8000; + camera->inputDir.x = -atToEye.pitch; + camera->inputDir.y = atToEye.yaw + 0x8000; camera->inputDir.z = 0; } if (func_800CB950(camera)) { - rwData->unk_08 = sp3C->pos.y; + rwData->unk_08 = focalActorPosRot->pos.y; } sp114 = roData->unk_04; if (camera->target->id != ACTOR_EN_BOOM) { - Actor_GetWorldPosShapeRot(sp30, camera->target); + Actor_GetWorldPosShapeRot(&camera->targetPosRot, camera->target); Actor_GetFocus(&spA8, camera->target); - camera->targetPosRot.pos.y = spA8.y; + camera->targetPosRot.pos.y = spA8.pos.y; } else { - Actor_GetFocus(sp30, camera->target); + Actor_GetFocus(&camera->targetPosRot, camera->target); } if (rwData->unk_0C != camera->target) { rwData->unk_0C = camera->target; @@ -4094,34 +4074,36 @@ s32 Camera_KeepOn1(Camera* camera) { Camera_ScaledStepToCeilF(1.0f, camera->yOffsetUpdateRate, camera->speedRatio * 0.5f, 0.0001f); camera->xzOffsetUpdateRate = Camera_ScaledStepToCeilF(1.0f, camera->xzOffsetUpdateRate, camera->speedRatio * 0.2f, 0.0001f); - // TODO: No f on 0.05? - camera->fovUpdateRate = Camera_ScaledStepToCeilF(0.05, camera->fovUpdateRate, camera->speedRatio * 0.05f, 0.0001f); + + camera->fovUpdateRate = Camera_ScaledStepToCeilF(.05f, camera->fovUpdateRate, camera->speedRatio * 0.05f, 0.0001f); if (func_800CB950(camera)) { - rwData->unk_08 = sp3C->pos.y; + rwData->unk_08 = focalActorPosRot->pos.y; sp70 = false; } else { sp70 = true; } - Camera_CalcAtForFriendlyLockOn(camera, &spC0, sp30, roData->unk_00, roData->unk_08, &rwData->unk_08, &spD0, - roData->interfaceFlags | (sp70 ? KEEPON1_FLAG_7 : 0)); - sp124 = sp3C->pos; - sp124.y += sp60; - OLib_Vec3fDiffToVecGeo(&spD0, &sp124, sp30); + Camera_CalcAtForFriendlyLockOn(camera, &atToEyeNext, &camera->targetPosRot.pos, roData->yOffset, roData->unk_08, + &rwData->unk_08, &spD0, roData->interfaceFlags | (sp70 ? KEEPON1_FLAG_7 : 0)); - if (sp114 < spD0.r) { + sp124 = focalActorPosRot->pos; + sp124.y += focalActorHeight; + + OLib_Vec3fDiffToVecGeo(&spD0, &sp124, &camera->targetPosRot.pos); + + if (spD0.r > sp114) { sp74 = 1.0f; } else { sp74 = spD0.r / sp114; } - OLib_Vec3fDiffToVecGeo(&spE8, sp44, sp40); + OLib_Vec3fDiffToVecGeo(&spE8, at, eyeNext); if (spE8.r < roData->unk_04) { sp114 = roData->unk_04; spF8 = 20.0f; - } else if (roData->unk_08 < spE8.r) { + } else if (spE8.r > roData->unk_08) { sp114 = roData->unk_08; spF8 = 20.0f; } else { @@ -4129,110 +4111,107 @@ s32 Camera_KeepOn1(Camera* camera) { spF8 = 1.0f; } - camera->rUpdateRateInv = Camera_ScaledStepToCeilF(spF8, camera->rUpdateRateInv, 0.5f, 0.1f); - camera->dist = Camera_ScaledStepToCeilF(sp114, camera->dist, 1.0f / camera->rUpdateRateInv, 0.1f); - spF8 = camera->dist; - spE8.r = camera->dist; - sp118 = sp30->pos; - OLib_Vec3fDiffToVecGeo(&spD8, sp44, &sp118); - //! FAKE - if (1) {} - if (1) {} - if (1) {} // TODO: Is needed? - pad1 = spD8.r; // TODO: Fake temp? - spD8.r = spF8 - (((pad1 <= spF8) ? spD8.r : spF8) * .5f); - camera->dist = Camera_ScaledStepToCeilF(pad1, camera->dist, 0.06f, 0.1f); - spE8.r = camera->dist; - spFC = roData->unk_0C + ((roData->unk_10 - roData->unk_0C) * (1.1f - sp74)); - spE8.yaw = spC0.yaw; - temp_v0_3 = (s16)(spD8.yaw - (s16)(spC0.yaw + 0x8000)); + camera->rUpdateRateInv = Camera_ScaledStepToCeilF(spF8, camera->rUpdateRateInv, .5f, 0.1f); + spE8.r = spF8 = camera->dist = Camera_ScaledStepToCeilF(sp114, camera->dist, 1.0f / camera->rUpdateRateInv, 0.1f); + + sp118 = camera->targetPosRot.pos; + OLib_Vec3fDiffToVecGeo(&spD8, at, &sp118); + + spD8.r = spF8 - (((spD8.r <= spF8) ? spD8.r : spF8) * 0.5f); + spE8.r = camera->dist = Camera_ScaledStepToCeilF(spF8, camera->dist, 0.06f, 0.1f); + + spFC = F32_LERPIMP(roData->unk_0C, roData->unk_10, 1.1f - sp74); + + spE8.yaw = atToEyeNext.yaw; + spF2 = spD8.yaw - (s16)(atToEyeNext.yaw + 0x8000); + if (rwData->unk_16 != 0) { if (rwData->unk_16 > 0) { sp72 = rwData->unk_16 - 1; spF2 = spD0.yaw; - OLib_Vec3fDiffToVecGeo(&spD0, sp44, sp48); - spD0.yaw = (s16)(spF2 + 0x8000); - sp60 = (rwData->unk_00 - spD0.r) * 0.16666667f; - spF2 = (s16)(rwData->unk_12 - (s16)(spF2 + 0x8000)) * 0.16666667f; - spF0 = ((s16)(rwData->unk_14 - (s64)spD0.pitch)); // TODO: s16 cast on F0 - spF0 = (s16)(spF0 * 0.16666667f); - spE8.r = Camera_ScaledStepToCeilF(spD0.r + (sp60 * sp72), spC8.r, .5f, 0.1f); - spE8.yaw = Camera_ScaledStepToCeilS(spD0.yaw + (spF2 * sp72), spC8.yaw, .5f, 5); - spE8.pitch = Camera_ScaledStepToCeilS(spD0.pitch + (spF0 * sp72), spC8.pitch, .5f, 5); - } - sp78 = 1; - rwData->unk_16--; - } else { - new_var3 = ABS(temp_v0_3); // TODO: Fake temp? - if ((s16)((spFC * 182.04167f) + .5f) < new_var3) { - spF2 = temp_v0_3; - sp104 = temp_v0_3 * 0.00549325f; - temp_f2_3 = ((OLib_ClampMaxDist(spD8.r, spE8.r) / spE8.r) * ((spFC + 10.0f) - spFC)) + spFC; - pad2 = &sp104; // TODO: Fake temp - temp_f2_3 = ((temp_f2_3 * temp_f2_3) - 2.0f) / (temp_f2_3 - 360.0f); - temp_f2_3 = (sp104 * (*pad2)) / ((temp_f2_3 * (*pad2)) + (2.0f - (360.0f * temp_f2_3))); + OLib_Vec3fDiffToVecGeo(&spD0, at, eye); - if (spF2 >= 0) { - phi_v1_3 = (s16)((temp_f2_3 * 182.04167f) + .5f); - } else { - phi_v1_3 = -(s16)((temp_f2_3 * 182.04167f) + .5f); - } - spE8.yaw = (s16)(spC0.yaw + 0x8000) + (s16)(phi_v1_3 + 0x8000); - } else { - new_var = (1.0f - camera->speedRatio) * 0.05f; // TODO: Fake temp? - phi_v1_3 = (temp_v0_3 >= 0) ? CAM_DEG_TO_BINANG(spFC) : -CAM_DEG_TO_BINANG(spFC); - //! FAKE - if (phi_a0) {} // TODO: Fake to shaft a registers - spE8.yaw = (s16)(spC0.yaw - (s16)((phi_v1_3 - temp_v0_3) * new_var)); + spD0.yaw = spF2 + 0x8000; + + spF8 = (rwData->unk_00 - spD0.r) * (1.0f / 6.0f); + spF2 = (s16)(rwData->unk_12 - spD0.yaw) * (1.0f / 6.0f); + spF0 = (s16)(rwData->unk_14 - spD0.pitch) * (1.0f / 6.0f); + + spE8.r = Camera_ScaledStepToCeilF(spD0.r + (spF8 * sp72), atToEye.r, .5f, 0.1f); + spE8.yaw = Camera_ScaledStepToCeilS(spD0.yaw + (spF2 * sp72), atToEye.yaw, .5f, 5); + spE8.pitch = Camera_ScaledStepToCeilS(spD0.pitch + (spF0 * sp72), atToEye.pitch, .5f, 5); } + skipEyeAtCalc = true; + rwData->unk_16--; + } else if (ABS(spF2) > CAM_DEG_TO_BINANG(spFC)) { + sp104 = CAM_BINANG_TO_DEG(spF2); + temp_f2_3 = ((OLib_ClampMaxDist(spD8.r, spE8.r) / spE8.r) * ((spFC + 10.0f) - spFC)) + spFC; + temp_f2_3 = (SQ(temp_f2_3) - 2.0f) / (temp_f2_3 - 360.0f); + var2 = (temp_f2_3 * sp104) + (2.0f - (360.0f * temp_f2_3)); + temp_f2_3 = SQ(sp104) / var2; + + if (spF2 >= 0) { + spF0 = CAM_DEG_TO_BINANG(temp_f2_3); + } else { + spF0 = -CAM_DEG_TO_BINANG(temp_f2_3); + } + spE8.yaw = (s16)((s16)(atToEyeNext.yaw + 0x8000) + spF0) + 0x8000; + } else { + sp104 = (1.0f - camera->speedRatio) * 0.05f; + spF0 = (spF2 >= 0) ? CAM_DEG_TO_BINANG(spFC) : -CAM_DEG_TO_BINANG(spFC); + + spE8.yaw = atToEyeNext.yaw - (s16)((spF0 - spF2) * sp104); } - //! FAKE - if (!spF0) {} // TODO: Is needed? - if (sp78 == 0) { - // TODO: extra 0 on 0.050f needed? - phi_a0 = (s16)(((roData->unk_14 + ((roData->unk_18 - roData->unk_14) * sp74)) * 182.04167f) + .5f); - phi_a0 -= (s16)((spD0.pitch * (0.5f + (sp74 * 0.5f))) + 0.5f); - //! FAKE - if (1) {} // TODO: Needed? - sp60 = spD8.pitch * roData->unk_1C; // TODO: Fake sp60 temp? - phi_a0 += (s16)sp60; + if (!skipEyeAtCalc) { + spF2 = CAM_DEG_TO_BINANG(F32_LERPIMP(roData->unk_14, roData->unk_18, sp74)); + spF2 -= (s16)((spD0.pitch * (0.5f + (sp74 * 0.5f))) + 0.5f); - if (phi_a0 < -0x3200) { - phi_a0 = -0x3200; - } else if (phi_a0 > 0x3200) { - phi_a0 = 0x3200; + spF8 = spD8.pitch * roData->unk_1C; + spF2 += (s16)spF8; + + if (spF2 < -0x3200) { + spF2 = -0x3200; + } else if (spF2 > 0x3200) { + spF2 = 0x3200; } - spE8.pitch = Camera_ScaledStepToCeilS(phi_a0, spC0.pitch, 0.11111111f, 5); - OLib_AddVecGeoToVec3f(sp40, sp44, &spE8); - sp7C.pos = *sp40; + spE8.pitch = Camera_ScaledStepToCeilS(spF2, atToEyeNext.pitch, 1.0f / 9.0f, 5); + OLib_AddVecGeoToVec3f(eyeNext, at, &spE8); + sp7C.pos = *eyeNext; + if (camera->status == CAM_STATUS_ACTIVE) { if (!(roData->interfaceFlags & KEEPON1_FLAG_4)) { - if ((camera->play->envCtx.skyboxDisabled == 0) || (roData->interfaceFlags & KEEPON1_FLAG_0)) { - if (func_800CBC84(camera, sp44, &sp7C, 0) != 0) { + if (!camera->play->envCtx.skyboxDisabled || (roData->interfaceFlags & KEEPON1_FLAG_0)) { + if (func_800CBC84(camera, at, &sp7C, 0) != 0) { rwData->unk_18 |= 0x1000; } else { rwData->unk_18 &= ~0x1000; } } else if (roData->interfaceFlags & KEEPON1_FLAG_1) { - func_800CBC84(camera, sp44, &sp7C, 3); + func_800CBC84(camera, at, &sp7C, 3); } else { - OLib_Vec3fDistNormalize(&sp130, sp44, &sp7C.pos); + OLib_Vec3fDistNormalize(&sp130, at, &sp7C.pos); sp7C.pos.x -= sp130.x; sp7C.pos.y -= sp130.y; sp7C.pos.z -= sp130.z; } - *sp48 = sp7C.pos; + *eye = sp7C.pos; rwData->unk_18 &= ~0x10; - } else if ((camera->play->envCtx.skyboxDisabled == 0) || (roData->interfaceFlags & KEEPON1_FLAG_0)) { - if (func_800CBC84(camera, sp44, &sp7C, 0) != 0) { + } else if (!camera->play->envCtx.skyboxDisabled || (roData->interfaceFlags & KEEPON1_FLAG_0)) { + if (func_800CBC84(camera, at, &sp7C, 0) != 0) { + s16 screenX; + s16 screenY; + rwData->unk_18 |= 0x1000; - spF8 = OLib_Vec3fDist(sp44, spA4); - spF4 = OLib_Vec3fDist(sp44, &sp7C.pos); - spF8 += (rwData->unk_18 & 0x10) ? 40 : 0.0f; // TODO: 40.0f? - Actor_GetScreenPos(camera->play, camera->focalActor, &sp56, &sp54); - if ((spF4 < spF8) || ((sp56 >= 0) && (sp56 <= 320) && (sp54 >= 0) && (sp54 <= 240))) { + spF8 = OLib_Vec3fDist(at, &spA4->pos); + spF4 = OLib_Vec3fDist(at, &sp7C.pos); + spF8 += (rwData->unk_18 & 0x10) ? 40 : 0.0f; + + Actor_GetScreenPos(camera->play, camera->focalActor, &screenX, &screenY); + + if ((spF4 < spF8) || + ((screenX >= 0) && (screenX <= SCREEN_WIDTH) && (screenY >= 0) && (screenY <= SCREEN_HEIGHT))) { rwData->unk_18 |= 0x10; spE0.yaw = (s16)(spD0.yaw + 0x8000); spE0.pitch = -spD0.pitch; @@ -4240,66 +4219,59 @@ s32 Camera_KeepOn1(Camera* camera) { sp130 = spA4->pos; sp130.y += 40.0f; OLib_AddVecGeoToVec3f(&sp124, &sp130, &spE0); - Camera_ScaledStepToCeilVec3f(&sp124, sp48, 0.15f, 0.15f, 0.2f); + Camera_ScaledStepToCeilVec3f(&sp124, eye, 0.15f, 0.15f, 0.2f); } else if (rwData->unk_18 & 0x10) { - if (OLib_Vec3fDist(&sp7C.pos, sp48) < 20.0f) { + if (OLib_Vec3fDist(&sp7C.pos, eye) < 20.0f) { rwData->unk_18 &= ~0x10; - *sp48 = sp7C.pos; + *eye = sp7C.pos; } else { - Camera_ScaledStepToCeilVec3f(&sp7C.pos, sp48, 0.15f, 0.15f, 0.2f); + Camera_ScaledStepToCeilVec3f(&sp7C.pos, eye, 0.15f, 0.15f, 0.2f); } } else { rwData->unk_18 &= ~0x10; - *sp48 = sp7C.pos; + *eye = sp7C.pos; } - dummy:; // TODO: Is this needed? } else { if (rwData->unk_18 & 0x10) { - if (OLib_Vec3fDist(&sp7C.pos, sp48) < 20.0f) { + if (OLib_Vec3fDist(&sp7C.pos, eye) < 20.0f) { rwData->unk_18 &= ~0x10; - *sp48 = sp7C.pos; + *eye = sp7C.pos; } else { - Camera_ScaledStepToCeilVec3f(&sp7C.pos, sp48, 0.15f, 0.15f, 0.2f); + Camera_ScaledStepToCeilVec3f(&sp7C.pos, eye, 0.15f, 0.15f, 0.2f); } } else { rwData->unk_18 &= ~0x10; - *sp48 = sp7C.pos; - // if (sp104) {} // TODO: Is this needed? + *eye = sp7C.pos; } rwData->unk_18 &= ~0x1000; } } else if (roData->interfaceFlags & KEEPON1_FLAG_1) { rwData->unk_18 &= ~0x10; - if (func_800CBC84(camera, sp44, &sp7C, 3) != 0) { - *sp48 = sp7C.pos; + if (func_800CBC84(camera, at, &sp7C, 3) != 0) { + *eye = sp7C.pos; } else { - *sp48 = sp7C.pos; - ; + *eye = sp7C.pos; } } else { rwData->unk_18 &= ~0x10; - OLib_Vec3fDistNormalize(&sp130, sp44, &sp7C.pos); + OLib_Vec3fDistNormalize(&sp130, at, &sp7C.pos); sp7C.pos.x -= sp130.x; sp7C.pos.y -= sp130.y; sp7C.pos.z -= sp130.z; - *sp48 = sp7C.pos; + *eye = sp7C.pos; } } else { rwData->unk_18 &= ~0x10; - *sp48 = *sp40; + *eye = *eyeNext; } } - // TODO: spF8 temp needed? - camera->fov = Camera_ScaledStepToCeilF(spF8 = roData->unk_20, camera->fov, camera->fovUpdateRate, 0.1f); + camera->fov = Camera_ScaledStepToCeilF(roData->unk_20, camera->fov, camera->fovUpdateRate, 0.1f); camera->roll = Camera_ScaledStepToCeilS(0, camera->roll, 0.2f, 5); camera->atLerpStepScale = Camera_ClampLerpScale(camera, sp70 ? roData->unk_28 : roData->unk_24); return true; } -#else -#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_KeepOn1.s") -#endif s32 Camera_KeepOn2(Camera* camera) { return Camera_Noop(camera);