From 4bf26d935fcc0632f8330d39a522038ad41b0576 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Wed, 27 Mar 2024 15:23:51 -0400 Subject: [PATCH] Improve LegoExtraActor::VTable0x90 --- .../lego/legoomni/include/legocarraceactor.h | 12 +++--- LEGO1/lego/legoomni/include/legoextraactor.h | 18 ++++---- LEGO1/lego/legoomni/include/legopathactor.h | 2 +- LEGO1/lego/legoomni/include/legoraceactor.h | 2 +- .../legoomni/src/entity/legocarraceactor.cpp | 2 +- .../legoomni/src/paths/legoextraactor.cpp | 42 ++++++++++++------- .../lego/legoomni/src/race/legoraceactor.cpp | 2 +- LEGO1/realtime/matrix.h | 4 +- 8 files changed, 48 insertions(+), 36 deletions(-) diff --git a/LEGO1/lego/legoomni/include/legocarraceactor.h b/LEGO1/lego/legoomni/include/legocarraceactor.h index b70e1df2..78080c96 100644 --- a/LEGO1/lego/legoomni/include/legocarraceactor.h +++ b/LEGO1/lego/legoomni/include/legocarraceactor.h @@ -27,12 +27,12 @@ class LegoCarRaceActor : public virtual LegoRaceActor { return !strcmp(p_name, LegoCarRaceActor::ClassName()) || LegoRaceActor::IsA(p_name); } - void VTable0x6c() override; // vtable+0x6c - void VTable0x70(float p_float) override; // vtable+0x70 - MxU32 VTable0x90(float, MxMatrix&) override; // vtable+0x90 - MxS32 VTable0x94() override; // vtable+0x94 - void VTable0x98() override; // vtable+0x98 - void VTable0x9c() override; // vtable+0x9c + void VTable0x6c() override; // vtable+0x6c + void VTable0x70(float p_float) override; // vtable+0x70 + MxU32 VTable0x90(float, Matrix4&) override; // vtable+0x90 + MxS32 VTable0x94() override; // vtable+0x94 + void VTable0x98() override; // vtable+0x98 + void VTable0x9c() override; // vtable+0x9c virtual void FUN_10080590(); diff --git a/LEGO1/lego/legoomni/include/legoextraactor.h b/LEGO1/lego/legoomni/include/legoextraactor.h index 9c954201..2b2612a6 100644 --- a/LEGO1/lego/legoomni/include/legoextraactor.h +++ b/LEGO1/lego/legoomni/include/legoextraactor.h @@ -34,15 +34,15 @@ class LegoExtraActor : public virtual LegoAnimActor { void SetWorldSpeed(MxFloat p_worldSpeed) override; // vtable+0x30 void VTable0x68(Mx3DPointFloat& p_point1, Mx3DPointFloat& p_point2, Mx3DPointFloat& p_point3) - override; // vtable+0x68 - void VTable0x6c() override; // vtable+0x6c - void VTable0x70(float) override; // vtable+0x70 - void VTable0x74(Matrix4& p_transform) override; // vtable+0x74 - MxU32 VTable0x90(float p_float, MxMatrix& p_matrix) override; // vtable+0x90 - MxS32 VTable0x94() override; // vtable+0x94 - void VTable0x9c() override; // vtable+0x9c - void VTable0xa4() override; // vtable+0xa4 - void VTable0xc4() override; // vtable+0xc4 + override; // vtable+0x68 + void VTable0x6c() override; // vtable+0x6c + void VTable0x70(float) override; // vtable+0x70 + void VTable0x74(Matrix4& p_transform) override; // vtable+0x74 + MxU32 VTable0x90(float p_float, Matrix4& p_matrix) override; // vtable+0x90 + MxS32 VTable0x94() override; // vtable+0x94 + void VTable0x9c() override; // vtable+0x9c + void VTable0xa4() override; // vtable+0xa4 + void VTable0xc4() override; // vtable+0xc4 virtual MxResult FUN_1002aae0(); diff --git a/LEGO1/lego/legoomni/include/legopathactor.h b/LEGO1/lego/legoomni/include/legopathactor.h index 444c90dd..8cdf5b00 100644 --- a/LEGO1/lego/legoomni/include/legopathactor.h +++ b/LEGO1/lego/legoomni/include/legopathactor.h @@ -46,7 +46,7 @@ class LegoPathActor : public LegoActor { virtual void VTable0x8c(); // vtable+0x8c // FUNCTION: LEGO1 0x10002d40 - virtual MxU32 VTable0x90(float, MxMatrix&) { return FALSE; } // vtable+0x90 + virtual MxU32 VTable0x90(float, Matrix4&) { return FALSE; } // vtable+0x90 // FUNCTION: LEGO1 0x10002d50 virtual MxS32 VTable0x94() { return 0; } // vtable+0x94 diff --git a/LEGO1/lego/legoomni/include/legoraceactor.h b/LEGO1/lego/legoomni/include/legoraceactor.h index 0dd71d0d..0f535fa6 100644 --- a/LEGO1/lego/legoomni/include/legoraceactor.h +++ b/LEGO1/lego/legoomni/include/legoraceactor.h @@ -31,7 +31,7 @@ class LegoRaceActor : public virtual LegoAnimActor { void VTable0x68(Mx3DPointFloat&, Mx3DPointFloat&, Mx3DPointFloat&) override; // vtable+0x68 void VTable0x70(float p_float) override; // vtable+0x70 void VTable0x74(Matrix4& p_transform) override; // vtable+0x74 - MxU32 VTable0x90(float, MxMatrix&) override; // vtable+0x90 + MxU32 VTable0x90(float, Matrix4&) override; // vtable+0x90 MxS32 VTable0x94() override; // vtable+0x94 // FUNCTION: LEGO1 0x10014aa0 diff --git a/LEGO1/lego/legoomni/src/entity/legocarraceactor.cpp b/LEGO1/lego/legoomni/src/entity/legocarraceactor.cpp index b0bac4e8..5adc760b 100644 --- a/LEGO1/lego/legoomni/src/entity/legocarraceactor.cpp +++ b/LEGO1/lego/legoomni/src/entity/legocarraceactor.cpp @@ -10,7 +10,7 @@ DECOMP_SIZE_ASSERT(LegoCarRaceActor, 0x1a0) const char* g_fuel = "FUEL"; // STUB: LEGO1 0x100141a0 -MxU32 LegoCarRaceActor::VTable0x90(float, MxMatrix&) +MxU32 LegoCarRaceActor::VTable0x90(float, Matrix4&) { // TODO return 0; diff --git a/LEGO1/lego/legoomni/src/paths/legoextraactor.cpp b/LEGO1/lego/legoomni/src/paths/legoextraactor.cpp index e73d5d02..4683e755 100644 --- a/LEGO1/lego/legoomni/src/paths/legoextraactor.cpp +++ b/LEGO1/lego/legoomni/src/paths/legoextraactor.cpp @@ -26,7 +26,7 @@ LegoExtraActor::~LegoExtraActor() } // FUNCTION: LEGO1 0x1002a720 -MxU32 LegoExtraActor::VTable0x90(float p_time, MxMatrix& p_transform) +MxU32 LegoExtraActor::VTable0x90(float p_time, Matrix4& p_transform) { switch (m_unk0xdc & 0xff) { case 0: @@ -39,25 +39,37 @@ MxU32 LegoExtraActor::VTable0x90(float p_time, MxMatrix& p_transform) m_lastTime = p_time; return FALSE; case 3: { - Vector3 positionRef = Vector3(p_transform[3]); + Vector3 positionRef(p_transform[3]); p_transform = m_roi->GetLocal2World(); + if (p_time < m_scheduledTime) { - Mx3DPointFloat position = positionRef; + Mx3DPointFloat position; + position = positionRef; positionRef.Clear(); + switch (m_axis) { - case e_posz: - p_transform.RotateZ(0.7f); - break; - case e_negz: - p_transform.RotateZ(-0.7f); - break; - case e_posx: - p_transform.RotateX(0.7f); - break; - case e_negx: - p_transform.RotateX(-0.7f); + case e_posz: { + float angle = 0.7f; + p_transform.RotateZ(angle); break; } + case e_negz: { + float angle = -0.7f; + p_transform.RotateZ(angle); + break; + } + case e_posx: { + float angle = 0.7f; + p_transform.RotateX(angle); + break; + } + case e_negx: { + float angle = -0.7f; + p_transform.RotateX(angle); + break; + } + } + positionRef = position; m_actorTime += (p_time - m_lastTime) * m_worldSpeed; m_lastTime = p_time; @@ -67,7 +79,7 @@ MxU32 LegoExtraActor::VTable0x90(float p_time, MxMatrix& p_transform) else { m_unk0xdc = 0; m_scheduledTime = 0.0f; - positionRef.Sub(&g_unk0x10104c18); + ((Vector3&) positionRef).Sub(&g_unk0x10104c18); // TODO: Fix call m_roi->FUN_100a58f0(p_transform); return TRUE; } diff --git a/LEGO1/lego/legoomni/src/race/legoraceactor.cpp b/LEGO1/lego/legoomni/src/race/legoraceactor.cpp index 59cc2e00..21d9e130 100644 --- a/LEGO1/lego/legoomni/src/race/legoraceactor.cpp +++ b/LEGO1/lego/legoomni/src/race/legoraceactor.cpp @@ -34,7 +34,7 @@ void LegoRaceActor::VTable0x70(float p_float) } // STUB: LEGO1 0x10014ce0 -MxU32 LegoRaceActor::VTable0x90(float, MxMatrix&) +MxU32 LegoRaceActor::VTable0x90(float, Matrix4&) { // TODO return 0; diff --git a/LEGO1/realtime/matrix.h b/LEGO1/realtime/matrix.h index 06c20553..8604e0ce 100644 --- a/LEGO1/realtime/matrix.h +++ b/LEGO1/realtime/matrix.h @@ -114,7 +114,7 @@ class Matrix4 { } } - inline void RotateX(const float p_angle) + inline void RotateX(const float& p_angle) { float s = sin(p_angle); float c = cos(p_angle); @@ -126,7 +126,7 @@ class Matrix4 { } } - inline void RotateZ(const float p_angle) + inline void RotateZ(const float& p_angle) { float s = sin(p_angle); float c = cos(p_angle);