Skip to content

Commit efafdc7

Browse files
authored
Fix camera rotation speed at HFR (#150)
1 parent 0888628 commit efafdc7

4 files changed

Lines changed: 44 additions & 16 deletions

File tree

MarathonRecomp/api/Sonicteam/Camera/SonicCamera.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ namespace Sonicteam::Camera
88
MARATHON_INSERT_PADDING(0x1C);
99
be<float> m_SpringK;
1010
be<float> m_DampingK;
11-
MARATHON_INSERT_PADDING(0x08);
11+
be<float> m_AzDamping;
12+
be<float> m_AltDamping;
1213
be<float> m_AzDriveK;
1314
be<float> m_AzDampingK;
1415
be<float> m_AltDriveK;
Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
1-
#include <api/Marathon.h>
21
#include <user/config.h>
32

4-
// Load Sonicteam::Camera::SonicCamera parameters
5-
PPC_FUNC_IMPL(__imp__sub_82192218);
6-
PPC_FUNC(sub_82192218)
3+
void SonicCamera_InvertAzDriveK(PPCRegister& az_driveK)
74
{
8-
auto pSonicCamera = (Sonicteam::Camera::SonicCamera*)g_memory.Translate(ctx.r3.u32);
5+
// X axis is inverted by default.
6+
if (Config::HorizontalCamera != ECameraRotationMode::Normal)
7+
return;
98

10-
__imp__sub_82192218(ctx, base);
9+
az_driveK.f64 = -az_driveK.f64;
10+
}
1111

12-
// X axis is inverted by default.
13-
if (Config::HorizontalCamera == ECameraRotationMode::Normal)
14-
pSonicCamera->m_AzDriveK = -pSonicCamera->m_AzDriveK;
12+
void SonicCamera_InvertAltDriveK(PPCRegister& alt_driveK)
13+
{
14+
if (Config::VerticalCamera != ECameraRotationMode::Reverse)
15+
return;
1516

16-
if (Config::VerticalCamera == ECameraRotationMode::Reverse)
17-
pSonicCamera->m_AltDriveK = -pSonicCamera->m_AltDriveK;
17+
alt_driveK.f64 = -alt_driveK.f64;
1818
}

MarathonRecomp/patches/fps_patches.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,13 @@ PPC_FUNC(sub_82587AA8)
1313
__imp__sub_82587AA8(ctx, base);
1414
}
1515

16-
void PostureControlRotationSpeedFix(PPCRegister& c_rotation_speed, PPCRegister& stack)
16+
void PostureControl_RotationSpeedFix(PPCRegister& c_rotation_speed, PPCRegister& stack)
1717
{
18-
double deltaTime = *(be<double>*)g_memory.Translate(stack.u32 + 0x200);
19-
c_rotation_speed.f64 = (c_rotation_speed.f64 * (60.0f * deltaTime));
18+
auto deltaTime = *(be<double>*)g_memory.Translate(stack.u32 + 0x200);
19+
c_rotation_speed.f64 = (c_rotation_speed.f64 * (60.0 * deltaTime));
20+
}
21+
22+
void SonicCamera_RotationSpeedFix(PPCRegister& f0, PPCRegister& deltaTime, PPCRegister& f13)
23+
{
24+
f0.f64 = float((f0.f64 * (deltaTime.f64 * (1.0 / (deltaTime.f64 * 60.0)))) + f13.f64);
2025
}

MarathonRecompLib/config/Marathon.toml

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ address = 0x82311E50
201201
jump_address_on_true = 0x82311E54
202202

203203
[[midasm_hook]]
204-
name = "PostureControlRotationSpeedFix"
204+
name = "PostureControl_RotationSpeedFix"
205205
address = 0x82201C6C
206206
registers = ["f1", "r1"]
207207

@@ -338,6 +338,28 @@ name = "NOP"
338338
address = 0x8258E600
339339
jump_address = 0x8258E604
340340

341+
[[midasm_hook]]
342+
name = "SonicCamera_InvertAzDriveK"
343+
address = 0x82191D40
344+
registers = ["f12"]
345+
346+
[[midasm_hook]]
347+
name = "SonicCamera_InvertAltDriveK"
348+
address = 0x82191E00
349+
registers = ["f12"]
350+
351+
[[midasm_hook]]
352+
name = "SonicCamera_RotationSpeedFix"
353+
address = 0x82191DA0
354+
registers = ["f0", "f31", "f13"]
355+
jump_address = 0x82191DA4
356+
357+
[[midasm_hook]]
358+
name = "SonicCamera_RotationSpeedFix"
359+
address = 0x82191E28
360+
registers = ["f0", "f31", "f13"]
361+
jump_address = 0x82191E2C
362+
341363
[[midasm_hook]]
342364
name = "RestoreChaosSpearFlips"
343365
address = 0x821A6730

0 commit comments

Comments
 (0)