From 425238fd5d0d6962e2c1c334c28a944593e91511 Mon Sep 17 00:00:00 2001 From: engineer124 <47598039+engineer124@users.noreply.github.com> Date: Sun, 22 Oct 2023 03:17:47 +1100 Subject: [PATCH] Match `Camera_Battle1` (#1445) * match Camera_Battle1 * more cleanup * more docs from OoT --- include/z64camera.h | 14 +- src/code/z_camera.c | 382 +++++++++++++++++++++----------------------- 2 files changed, 185 insertions(+), 211 deletions(-) diff --git a/include/z64camera.h b/include/z64camera.h index ad88a7670..ba0f6a614 100644 --- a/include/z64camera.h +++ b/include/z64camera.h @@ -800,15 +800,15 @@ typedef struct { { data18, CAM_DATA_18 } typedef struct { - /* 0x00 */ f32 unk_00; + /* 0x00 */ f32 yOffset; /* 0x04 */ f32 unk_04; /* 0x08 */ f32 unk_08; /* 0x0C */ f32 unk_0C; /* 0x10 */ f32 unk_10; - /* 0x14 */ f32 unk_14; - /* 0x18 */ f32 unk_18; - /* 0x1C */ f32 unk_1C; - /* 0x20 */ f32 unk_20; + /* 0x14 */ f32 swingPitchInitial; + /* 0x18 */ f32 swingPitchFinal; + /* 0x1C */ f32 swingPitchAdj; + /* 0x20 */ f32 fov; /* 0x24 */ f32 unk_24; /* 0x28 */ f32 unk_28; /* 0x2C */ f32 unk_2C; @@ -818,13 +818,13 @@ typedef struct { typedef struct { /* 0x00 */ f32 unk_00; /* 0x04 */ f32 unk_04; - /* 0x08 */ Actor* unk_08; // targe3t + /* 0x08 */ Actor* unk_08; // target /* 0x0C */ s32 unk_0C; // unused? /* 0x10 */ s16 unk_10; /* 0x12 */ s16 unk_12; /* 0x14 */ s16 unk_14; /* 0x16 */ s16 unk_16; - /* 0x18 */ s16 unk_18; + /* 0x18 */ s16 chargeTimer; /* 0x1A */ s16 unk_1A; } Battle1ReadWriteData; // size = 0x1C diff --git a/src/code/z_camera.c b/src/code/z_camera.c index 8f3fb9a3a..d019ee395 100644 --- a/src/code/z_camera.c +++ b/src/code/z_camera.c @@ -1579,7 +1579,7 @@ s32 Camera_CalcAtForFriendlyLockOn(Camera* camera, VecGeo* eyeAtDir, Vec3f* targ return 1; } -s32 Camera_CalcAtForEnemyLockOn(Camera* camera, f32* arg1, s32 arg2, f32 yOffset, f32 arg4, f32 arg5, f32* arg6, +s32 Camera_CalcAtForEnemyLockOn(Camera* camera, VecGeo* arg1, Vec3f* arg2, f32 yOffset, f32 arg4, f32 arg5, f32* arg6, VecGeo* arg7, s16 flags) { PosRot* focalActorPosRot = &camera->focalActorPosRot; Vec3f focalActorAtOffsetTarget; @@ -1623,7 +1623,7 @@ s32 Camera_CalcAtForEnemyLockOn(Camera* camera, f32* arg1, s32 arg2, f32 yOffset if (focalActorPosRot->pos.x) {} //! FAKE: unnecessary temp? - new_var2 = *arg1; + new_var2 = arg1->r; sp4C = new_var2; deltaY = focalActorPosRot->pos.y - *arg6; temp_f0_3 = Math_FAtan2F(deltaY, sp4C); @@ -3542,120 +3542,103 @@ s32 Camera_Jump0(Camera* camera) { return Camera_Noop(camera); } -#ifdef NON_EQUIVALENT s32 Camera_Battle1(Camera* camera) { - Battle1ReadOnlyData* roData = &camera->paramData.batt1.roData; - Battle1ReadWriteData* rwData = &camera->paramData.batt1.rwData; + Vec3f* eye = &camera->eye; + Vec3f* at = &camera->at; + Vec3f* eyeNext = &camera->eyeNext; Vec3f sp120; Vec3f sp114; + f32 temp_f14; + f32 temp_f2_3; + s32 pad1; f32 sp104; + f32 var2; f32 spFC; f32 spF8; - f32 spF8_2; f32 spF4; - s32 spF0; // bool - f32 spEC; - Vec3f spC4; + s32 skipEyeAtCalc; + f32 distRatio; + CameraCollision spC4; VecGeo spBC; VecGeo spB4; - VecGeo spAC; + VecGeo atToTargetDir; VecGeo spA4; - VecGeo sp9C; - VecGeo sp94; + VecGeo atToEyeDir; + VecGeo atToEyeNextDir; + s32 pad2; PosRot* sp8C; s16 sp8A; s16 sp88; s16 sp86; - s16 sp84; - f32 sp80; - f32 sp7C; - f32 sp78; - f32 sp68; - s16 sp5E; - s16 sp5C; - Vec3f* sp50; - Vec3f* sp4C; - Vec3f* sp48; - PosRot* sp40; - + s16 isOffGround; + f32 swingPitchInitial; + f32 swingPitchFinal; + f32 fov; f32 temp_f12; - f32 temp_f14; - f32 temp_f2_3; - s16 temp_v0_5; - s16 temp_v0_6; - s32 temp_f4; - f32 phi_f0_3; - f32 phi_f12; + Battle1ReadOnlyData* roData = &camera->paramData.batt1.roData; + Battle1ReadWriteData* rwData = &camera->paramData.batt1.rwData; + f32 focalActorHeight; + s32 pad3; - f32 new_var; - f32 new_var2; - f32 new_var3; - f32 new_var5; - f32 new_var4; - - sp50 = &camera->eye; - sp4C = &camera->at; - sp48 = &camera->eyeNext; - sp40 = &camera->targetPosRot; - - spF0 = false; + skipEyeAtCalc = false; sp8C = &camera->focalActor->focus; - sp68 = Camera_GetFocalActorHeight(camera); + focalActorHeight = Camera_GetFocalActorHeight(camera); - if ((camera->animState != 0) && (camera->animState != 0xA) && (camera->animState != 0x14)) { + if (!RELOAD_PARAMS(camera)) { } else { CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values; - roData->unk_00 = GET_NEXT_RO_DATA(values) * 0.01f * sp68 * (0.8f - ((68.0f / sp68) * -0.2f)); + roData->yOffset = + GET_NEXT_RO_DATA(values) * 0.01f * 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); roData->unk_0C = 80.0f - (80.0f - roData->unk_0C); roData->unk_10 = GET_NEXT_RO_DATA(values); roData->unk_10 = 0.0f - (0.0f - roData->unk_10); - roData->unk_14 = GET_NEXT_RO_DATA(values); - 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_1C = GET_NEXT_RO_DATA(values) * 0.01f; - roData->unk_1C = 1.0f - (1.0f - roData->unk_1C); - roData->unk_20 = GET_NEXT_RO_DATA(values); + roData->swingPitchInitial = GET_NEXT_RO_DATA(values); + roData->swingPitchInitial = 40.0f - (40.0f - roData->swingPitchInitial); + roData->swingPitchFinal = GET_NEXT_RO_DATA(values); + roData->swingPitchFinal = 20.0f - (20.0f - roData->swingPitchFinal); + roData->swingPitchAdj = GET_NEXT_RO_DATA(values) * 0.01f; + roData->swingPitchAdj = 1.0f - (1.0f - roData->swingPitchAdj); + roData->fov = GET_NEXT_RO_DATA(values); roData->unk_24 = GET_NEXT_RO_DATA(values) * 0.01f; roData->unk_24 = 1.0f - (1.0f - roData->unk_24); roData->interfaceFlags = GET_NEXT_RO_DATA(values); roData->unk_28 = GET_NEXT_RO_DATA(values) * 0.01f; roData->unk_28 = 0.2f - (0.2f - roData->unk_28); roData->unk_2C = GET_NEXT_RO_DATA(values) * 0.01f; - if ((camera->animState != 0) && (camera->animState != 0xA) && (camera->animState != 0x14)) { + if (!RELOAD_PARAMS(camera)) { } else { - rwData->unk_18 = 0x28; + rwData->chargeTimer = 40; camera->pitchUpdateRateInv = 9.0f; } } - sp80 = roData->unk_14; - sp7C = roData->unk_18; - sp78 = roData->unk_20; + swingPitchInitial = roData->swingPitchInitial; + swingPitchFinal = roData->swingPitchFinal; + fov = roData->fov; if (Camera_IsChargingSwordOrDekuFlowerDive(camera)) { camera->pitchUpdateRateInv = Camera_ScaledStepToCeilF(18.0f, camera->pitchUpdateRateInv, 0.5f, 0.1f); camera->yOffsetUpdateRate = Camera_ScaledStepToCeilF(0.2f, camera->yOffsetUpdateRate, 0.5f, 0.0001f); camera->xzOffsetUpdateRate = Camera_ScaledStepToCeilF(0.2f, camera->xzOffsetUpdateRate, 0.5f, 0.0001f); - if (rwData->unk_18 >= -0x13) { - rwData->unk_18--; + if (rwData->chargeTimer > -20) { + rwData->chargeTimer--; } else { - sp80 = 50.0f; - sp7C = 40.0f; - sp78 = 60.0f; + swingPitchInitial = 50.0f; + swingPitchFinal = 40.0f; + fov = 60.0f; } } else { - if (rwData->unk_18 < 0) { - sp80 = 50.0f; - sp7C = 40.0f; - sp78 = 60.0f; - rwData->unk_18++; + if (rwData->chargeTimer < 0) { + swingPitchInitial = 50.0f; + swingPitchFinal = 40.0f; + fov = 60.0f; + rwData->chargeTimer++; } else { - rwData->unk_18 = 0x28; + rwData->chargeTimer = 40; camera->pitchUpdateRateInv = Camera_ScaledStepToCeilF(9.0f, camera->pitchUpdateRateInv, 0.5f, 0.1f); camera->yOffsetUpdateRate = Camera_ScaledStepToCeilF(0.6f, camera->yOffsetUpdateRate, camera->speedRatio * 0.5f, 0.0001f); @@ -3666,9 +3649,12 @@ s32 Camera_Battle1(Camera* camera) { camera->fovUpdateRate = Camera_ScaledStepToCeilF(0.050f, camera->fovUpdateRate, camera->speedRatio * 0.05f, 0.0001f); - sp68 += roData->unk_00; - OLib_Vec3fDiffToVecGeo(&sp9C, sp4C, sp50); - OLib_Vec3fDiffToVecGeo(&sp94, sp4C, sp48); + + focalActorHeight += roData->yOffset; + + OLib_Vec3fDiffToVecGeo(&atToEyeDir, at, eye); + OLib_Vec3fDiffToVecGeo(&atToEyeNextDir, at, eyeNext); + if ((camera->target == NULL) || (camera->target->update == NULL)) { camera->target = NULL; Camera_ChangeMode(camera, CAM_MODE_TARGET); @@ -3677,44 +3663,44 @@ s32 Camera_Battle1(Camera* camera) { sCameraInterfaceFlags = roData->interfaceFlags; - if ((camera->animState == 0) || (camera->animState == 0xA) || (camera->animState == 0x14)) { + if (RELOAD_PARAMS(camera)) { rwData->unk_10 = 0; rwData->unk_1A = 0; rwData->unk_08 = camera->target; camera->animState++; rwData->unk_16 = 7; - rwData->unk_12 = sp9C.yaw; - rwData->unk_14 = sp9C.pitch; - rwData->unk_00 = sp9C.r; + rwData->unk_12 = atToEyeDir.yaw; + rwData->unk_14 = atToEyeDir.pitch; + rwData->unk_00 = atToEyeDir.r; rwData->unk_04 = camera->focalActorPosRot.pos.y - camera->unk_0F0.y; - if ((2.0f * roData->unk_04) < camera->dist) { + if (camera->dist > (2.0f * roData->unk_04)) { camera->dist = 2.0f * roData->unk_04; - sp94.r = camera->dist; - sp9C.r = sp94.r; - OLib_AddVecGeoToVec3f(sp50, sp4C, &sp9C); - *sp48 = *sp50; + atToEyeNextDir.r = camera->dist; + atToEyeDir.r = atToEyeNextDir.r; + OLib_AddVecGeoToVec3f(eye, at, &atToEyeDir); + *eyeNext = *eye; } } if (camera->status == CAM_STATUS_ACTIVE) { sUpdateCameraDirection = true; - camera->inputDir.x = -sp9C.pitch; - camera->inputDir.y = sp9C.yaw + 0x8000; + camera->inputDir.x = -atToEyeDir.pitch; + camera->inputDir.y = atToEyeDir.yaw + 0x8000; camera->inputDir.z = 0; } if (func_800CB950(camera)) { rwData->unk_04 = camera->focalActorPosRot.pos.y; - sp84 = 0; + isOffGround = false; } else { - sp84 = 1; + isOffGround = true; } if (rwData->unk_16 == 0) { - camera->atLerpStepScale = Camera_ClampLerpScale(camera, sp84 ? roData->unk_28 : roData->unk_24); + camera->atLerpStepScale = Camera_ClampLerpScale(camera, isOffGround ? roData->unk_28 : roData->unk_24); } - Actor_GetFocus(&sp40->pos, camera->target); + Actor_GetFocus(&camera->targetPosRot, camera->target); if (rwData->unk_08 != camera->target) { camera->animState = 0; @@ -3722,141 +3708,132 @@ s32 Camera_Battle1(Camera* camera) { } sp120 = camera->focalActorPosRot.pos; - sp120.y += sp68; - OLib_Vec3fDiffToVecGeo(&spA4, &sp120, &sp40->pos); + sp120.y += focalActorHeight; + OLib_Vec3fDiffToVecGeo(&spA4, &sp120, &camera->targetPosRot.pos); + sp104 = func_800CD6CC(camera->target); - if (PREG(86) + 800.0f < sp104) { + if (sp104 > (PREG(86) + 800.0f)) { sp104 = PREG(86) + 800.0f; } - // new_var5 = sp104; // TODO: Fake temp but helps when used? - // sp104 = new_var5; - - // Above is down to SP and Floats - - if ((sp104 < spA4.r) || Camera_IsChargingSwordOrDekuFlowerDive(camera)) { - spEC = 1.0f; + if ((spA4.r > sp104) || Camera_IsChargingSwordOrDekuFlowerDive(camera)) { + distRatio = 1.0f; spF8 = 10.0f; - // dummy:; // Helps? - // sp80 = roData->unk_14; // Fake & Non-equivalent but helps? } else { - spEC = spA4.r / sp104; + distRatio = spA4.r / sp104; spF8 = 2.0f; } - // spF8 should be set with swc1 twice, not once - // sp94 is loading in too early - Camera_CalcAtForEnemyLockOn(camera, &sp94.r, sp40, roData->unk_00, roData->unk_2C, 1.0f - spEC, &rwData->unk_04, - &spA4, - (sp84 ? (BATTLE1_FLAG_7 | BATTLE1_FLAG_0) : BATTLE1_FLAG_0) | roData->interfaceFlags); + Camera_CalcAtForEnemyLockOn(camera, &atToEyeNextDir, &camera->targetPosRot.pos, roData->yOffset, roData->unk_2C, + 1.0f - distRatio, &rwData->unk_04, &spA4, + (isOffGround ? (BATTLE1_FLAG_7 | BATTLE1_FLAG_0) : BATTLE1_FLAG_0) | + roData->interfaceFlags); sp88 = spA4.yaw; - OLib_Vec3fDiffToVecGeo(&spBC, sp4C, sp48); - spF4 = roData->unk_04 + ((roData->unk_08 - roData->unk_04) * spEC); + OLib_Vec3fDiffToVecGeo(&spBC, at, eyeNext); + spF4 = F32_LERPIMP(roData->unk_04, roData->unk_08, distRatio); camera->rUpdateRateInv = Camera_ScaledStepToCeilF(spF8, camera->rUpdateRateInv, 0.5f, 0.1f); spBC.r = camera->dist = Camera_ScaledStepToCeilF(spF4, camera->dist, 1.0f / camera->rUpdateRateInv, 0.1f); - OLib_Vec3fDiffToVecGeo(&spAC, sp4C, &sp40->pos); - spAC.r = spBC.r - (((spAC.r >= spBC.r) ? spBC.r : spAC.r) * 0.5f); + OLib_Vec3fDiffToVecGeo(&atToTargetDir, at, &camera->targetPosRot.pos); + + atToTargetDir.r = spBC.r - (((spBC.r >= atToTargetDir.r) ? atToTargetDir.r : spBC.r) * 0.5f); if (rwData->unk_1A & 0x1000) { spFC = 15.0f; } else { - spFC = roData->unk_0C + ((roData->unk_10 - roData->unk_0C) * (1.1f - spEC)); + spFC = roData->unk_0C + ((roData->unk_10 - roData->unk_0C) * (1.1f - distRatio)); } - spBC.yaw = sp94.yaw; - temp_v0_5 = (sp94.yaw + 0x8000); - temp_v0_5 = spAC.yaw - temp_v0_5; + + spBC.yaw = atToEyeNextDir.yaw; + sp8A = (s16)(atToTargetDir.yaw - (s16)(atToEyeNextDir.yaw + 0x8000)); + if (rwData->unk_16 != 0) { if (rwData->unk_16 > 0) { sp86 = rwData->unk_16 - 1; - OLib_Vec3fDiffToVecGeo(&spB4, sp4C, sp50); + OLib_Vec3fDiffToVecGeo(&spB4, at, eye); spB4.yaw = sp88 + 0x8000; - new_var = (rwData->unk_00 - spB4.r) * 0.16666667f; - sp8A = (s16)(rwData->unk_12 - spB4.yaw) * 0.16666667f; - sp88 = (s16)(rwData->unk_14 - spB4.pitch) * 0.16666667f; - spBC.r = Camera_ScaledStepToCeilF((sp86 * new_var) + spB4.r, sp9C.r, 0.5f, - 1.0f); // TODO: extra float calcs going on here - spBC.yaw = Camera_ScaledStepToCeilS(spB4.yaw + (sp8A * sp86), sp9C.yaw, 0.5f, 5); - spBC.pitch = Camera_ScaledStepToCeilS(spB4.pitch + (sp88 * sp86), sp9C.pitch, 0.5f, 5); + spF8 = (rwData->unk_00 - spB4.r) * (1.0f / 6.0f); + sp8A = (s16)(rwData->unk_12 - spB4.yaw) * (1.0f / 6.0f); + sp88 = (s16)(rwData->unk_14 - spB4.pitch) * (1.0f / 6.0f); + spBC.r = Camera_ScaledStepToCeilF((sp86 * spF8) + spB4.r, atToEyeDir.r, 0.5f, 1.0f); + spBC.yaw = Camera_ScaledStepToCeilS(spB4.yaw + (sp8A * sp86), atToEyeDir.yaw, 0.5f, 5); + spBC.pitch = Camera_ScaledStepToCeilS(spB4.pitch + (sp88 * sp86), atToEyeDir.pitch, 0.5f, 5); } else { - spF0 = true; + skipEyeAtCalc = true; } rwData->unk_16--; - } else { - // s32 phi_v0_2 = ABS(temp_v0_5); - temp_f4 = (s16)((spFC * 182.04167f) + .5f); - if ((temp_f4 < ABS(temp_v0_5)) && (sp84 == 0)) { + } else if ((ABS(sp8A) > CAM_DEG_TO_BINANG(spFC)) && !isOffGround) { + sp104 = CAM_BINANG_TO_DEG(sp8A); + temp_f2_3 = spFC + (((spFC + 10.0f) - spFC) * (OLib_ClampMaxDist(atToTargetDir.r, spBC.r) / spBC.r)); + temp_f12 = (SQ(temp_f2_3) - 2.0f) / (temp_f2_3 - 360.0f); + var2 = ((temp_f12 * sp104) + (2.0f - (360.0f * temp_f12))); + temp_f14 = SQ(sp104) / var2; - sp8A = temp_v0_5; - sp104 = temp_v0_5 * 0.00549325f; - - temp_f2_3 = ((OLib_ClampMaxDist(spAC.r, spBC.r) / spBC.r) * ((spFC + 10.0f) - spFC)) + spFC; - temp_f12 = (SQ(temp_f2_3) - 2.0f) / (temp_f2_3 - 360.0f); - new_var3 = temp_f12 * sp104; - temp_f14 = SQ(sp104) / (new_var3 + (2.0f - (360.0f * temp_f12))); - - if (sp8A >= 0) { - sp88 = CAM_DEG_TO_BINANG(temp_f14); - } else { - sp88 = -CAM_DEG_TO_BINANG(temp_f14); - } - - spBC.yaw = (s16)(sp94.yaw + 0x8000) + (s16)(sp88 + 0x8000); + if (sp8A >= 0) { + sp88 = CAM_DEG_TO_BINANG(temp_f14); } else { - new_var2 = (1.0f - camera->speedRatio) * 0.05f; - if (temp_v0_5 >= 0) { - sp88 = temp_f4 & 0xFFFFu; // TODO: Is this needed? - } else { - sp88 = -temp_f4; - } - spBC.yaw = sp94.yaw - (s16)((sp88 - temp_v0_5) * new_var2); + sp88 = -CAM_DEG_TO_BINANG(temp_f14); } + + spBC.yaw = (s16)((s16)(atToEyeNextDir.yaw + 0x8000) + sp88) + 0x8000; + } else { + sp104 = (1.0f - camera->speedRatio) * 0.05f; + sp88 = (sp8A >= 0) ? CAM_DEG_TO_BINANG(spFC) : -CAM_DEG_TO_BINANG(spFC); + spBC.yaw = atToEyeNextDir.yaw - (s16)((sp88 - sp8A) * sp104); } - if (spF0 == false) { - new_var4 = spAC.pitch * roData->unk_1C; - temp_v0_6 = ((s16)(((((sp7C - sp80) * spEC) + sp80) * 182.04167f) + .5f) - - (s16)((spA4.pitch * (0.5f + (spEC * 0.5f))) + 0.5f)); - temp_v0_6 += (s16)new_var4; + if (!skipEyeAtCalc) { + spF8 = atToTargetDir.pitch * roData->swingPitchAdj; + var2 = swingPitchInitial + ((swingPitchFinal - swingPitchInitial) * distRatio); + sp8A = CAM_DEG_TO_BINANG(var2) - (s16)((spA4.pitch * (0.5f + (distRatio * (1.0f - 0.5f)))) + 0.5f); + sp8A += (s16)spF8; - if (temp_v0_6 < -0x2AA8) { - temp_v0_6 = -0x2AA8; - } else if (temp_v0_6 > 0x2AA8) { - temp_v0_6 = 0x2AA8; + if (sp8A < -0x2AA8) { + sp8A = -0x2AA8; + } else if (sp8A > 0x2AA8) { + sp8A = 0x2AA8; } - spBC.pitch = Camera_ScaledStepToCeilS(temp_v0_6, sp94.pitch, 1.0f / camera->pitchUpdateRateInv, 5); - OLib_AddVecGeoToVec3f(sp48, sp4C, &spBC); - spC4 = *sp48; + spBC.pitch = Camera_ScaledStepToCeilS(sp8A, atToEyeNextDir.pitch, 1.0f / camera->pitchUpdateRateInv, 5); + OLib_AddVecGeoToVec3f(eyeNext, at, &spBC); + spC4.pos = *eyeNext; + if (camera->status == CAM_STATUS_ACTIVE) { if (!(roData->interfaceFlags & BATTLE1_FLAG_4)) { - if ((camera->play->envCtx.skyboxDisabled == 0) || (roData->interfaceFlags & BATTLE1_FLAG_0)) { - if (func_800CBC84(camera, sp4C, &spC4, 0) != 0) { + if (!camera->play->envCtx.skyboxDisabled || (roData->interfaceFlags & BATTLE1_FLAG_0)) { + if (func_800CBC84(camera, at, &spC4, 0) != 0) { rwData->unk_1A |= 0x1000; } else { rwData->unk_1A &= ~0x1000; } } else if (roData->interfaceFlags & BATTLE1_FLAG_1) { - func_800CBC84(camera, sp4C, &spC4, 3); + func_800CBC84(camera, at, &spC4, 3); } else { - OLib_Vec3fDistNormalize(&sp114, sp4C, &spC4); - spC4.x -= sp114.x; - spC4.y -= sp114.y; - spC4.z -= sp114.z; + OLib_Vec3fDistNormalize(&sp114, at, &spC4.pos); + spC4.pos.x -= sp114.x; + spC4.pos.y -= sp114.y; + spC4.pos.z -= sp114.z; } - *sp50 = spC4; - ; + *eye = spC4.pos; rwData->unk_1A &= ~0x10; - } else if ((camera->play->envCtx.skyboxDisabled == 0) || (roData->interfaceFlags & BATTLE1_FLAG_0)) { - if (func_800CBC84(camera, sp4C, &spC4, 0) != 0) { + } else if (!camera->play->envCtx.skyboxDisabled || (roData->interfaceFlags & BATTLE1_FLAG_0)) { + if (func_800CBC84(camera, at, &spC4, 0) != 0) { + s16 screenX; + s16 screenY; + rwData->unk_1A |= 0x1000; - spF8 = OLib_Vec3fDist(sp4C, sp8C); - spF4 = OLib_Vec3fDist(sp4C, &spC4); - phi_f0_3 = (rwData->unk_1A & 0x10) ? 40.0f : 0.0f; - spF8 = spF8 + phi_f0_3; - Actor_GetScreenPos(camera->play, camera->focalActor, &sp5E, &sp5C); - if ((spF4 < spF8) || ((sp5E >= 0) && (sp5E < 0x141) && (sp5C >= 0) && (sp5C < 0xF1))) { + spF8 = OLib_Vec3fDist(at, &sp8C->pos); + + //! FAKE: + if (1) {} + + spF4 = OLib_Vec3fDist(at, &spC4.pos); + spF8 += (rwData->unk_1A & 0x10) ? 40.0f : 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_1A |= 0x10; spB4.yaw = spA4.yaw + 0x8000; spB4.pitch = -spA4.pitch; @@ -3864,73 +3841,70 @@ s32 Camera_Battle1(Camera* camera) { sp114 = sp8C->pos; sp114.y += 40.0f; OLib_AddVecGeoToVec3f(&sp120, &sp114, &spB4); - Camera_ScaledStepToCeilVec3f(&sp120, sp50, 0.15f, 0.15f, 0.2f); + Camera_ScaledStepToCeilVec3f(&sp120, eye, 0.15f, 0.15f, 0.2f); } else if (rwData->unk_1A & 0x10) { - if (OLib_Vec3fDist(&spC4, sp50) < 20.0f) { + if (OLib_Vec3fDist(&spC4.pos, eye) < 20.0f) { rwData->unk_1A &= ~0x10; - *sp50 = spC4; + *eye = spC4.pos; } else { - Camera_ScaledStepToCeilVec3f(&spC4, sp50, 0.15f, 0.15f, 0.2f); + Camera_ScaledStepToCeilVec3f(&spC4.pos, eye, 0.15f, 0.15f, 0.2f); } } else { rwData->unk_1A &= ~0x10; - *sp50 = spC4; + *eye = spC4.pos; } - dummy:; // TODO: Is Needed? } else { if (rwData->unk_1A & 0x10) { - if (OLib_Vec3fDist(&spC4, sp50) < 20.0f) { + if (OLib_Vec3fDist(&spC4.pos, eye) < 20.0f) { rwData->unk_1A &= ~0x10; - *sp50 = spC4; + *eye = spC4.pos; } else { - Camera_ScaledStepToCeilVec3f(&spC4, sp50, 0.15f, 0.15f, 0.2f); + Camera_ScaledStepToCeilVec3f(&spC4.pos, eye, 0.15f, 0.15f, 0.2f); } } else { rwData->unk_1A &= ~0x10; - *sp50 = spC4; + *eye = spC4.pos; } rwData->unk_1A &= ~0x1000; } } else if (roData->interfaceFlags & BATTLE1_FLAG_1) { rwData->unk_1A &= ~0x10; - if (func_800CBC84(camera, sp4C, &spC4, 3) != 0) { - *sp50 = spC4; + if (func_800CBC84(camera, at, &spC4, 3) != 0) { + *eye = spC4.pos; } else { - *sp50 = spC4; + *eye = spC4.pos; } } else { rwData->unk_1A &= ~0x10; - OLib_Vec3fDistNormalize(&sp114, sp4C, &spC4); - spC4.x -= sp114.x; - spC4.y -= sp114.y; - spC4.z -= sp114.z; - *sp50 = spC4; + OLib_Vec3fDistNormalize(&sp114, at, &spC4.pos); + spC4.pos.x -= sp114.x; + spC4.pos.y -= sp114.y; + spC4.pos.z -= sp114.z; + *eye = spC4.pos; } } else { rwData->unk_1A &= ~0x10; - *sp50 = *sp48; + *eye = *eyeNext; } } if (rwData->unk_16 != 0) { sp88 = 0; } else { - sp88 = (s16)(sp94.yaw - spBC.yaw) * 0.50f; + sp88 = (s16)(atToEyeNextDir.yaw - spBC.yaw) * 0.50f; } - camera->roll = Camera_ScaledStepToCeilS(sp88, camera->roll, 0.06f, 5); + if (func_800CBAAC(camera) != PLAYER_MELEE_WEAPON_STATE_0) { - phi_f12 = ((camera->play->state.frames & 8) != 0) ? roData->unk_20 - (roData->unk_20 * 0.5f) : roData->unk_20; + temp_f12 = ((camera->play->state.frames & 8) != 0) ? roData->fov - (roData->fov * 0.5f) : roData->fov; } else { - phi_f12 = ((gSaveContext.save.saveInfo.playerData.health <= 16) ? 0.8f : 1.0f) * (sp78 - (sp78 * 0.05f * spEC)); + temp_f12 = + ((gSaveContext.save.saveInfo.playerData.health <= 16) ? 0.8f : 1.0f) * (fov - (fov * 0.05f * distRatio)); } - camera->fov = Camera_ScaledStepToCeilF(phi_f12, camera->fov, camera->fovUpdateRate, 0.1f); + camera->fov = Camera_ScaledStepToCeilF(temp_f12, camera->fov, camera->fovUpdateRate, 0.1f); return true; } -#else -#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Battle1.s") -#endif s32 Camera_Battle2(Camera* camera) { return Camera_Noop(camera);