From b394770864d89081435242aca8b3ee3728341701 Mon Sep 17 00:00:00 2001 From: Nathan M Gilbert Date: Sun, 7 Apr 2024 08:03:21 -0400 Subject: [PATCH] Implement PathActor VTable0x80 and PathActorStruct FUN_1009a140 (#781) * Implement PathActor VTable0x80 and PathActorStruct FUN_1009a140 * Match functions, fixes * fixes --------- Co-authored-by: Christian Semmler --- LEGO1/lego/legoomni/include/legopathactor.h | 8 ++++- .../lego/legoomni/src/paths/legopathactor.cpp | 35 +++++++++++++++++-- LEGO1/lego/legoomni/src/worlds/isle.cpp | 10 +++--- LEGO1/mxgeometry/mxgeometry3d.h | 8 ++--- LEGO1/mxgeometry/mxmatrix.h | 4 +-- LEGO1/realtime/matrix.h | 4 +-- LEGO1/realtime/vector.h | 6 ++-- LEGO1/viewmanager/viewmanager.cpp | 6 ++-- 8 files changed, 57 insertions(+), 24 deletions(-) diff --git a/LEGO1/lego/legoomni/include/legopathactor.h b/LEGO1/lego/legoomni/include/legopathactor.h index 85fe8286..60f2a5ef 100644 --- a/LEGO1/lego/legoomni/include/legopathactor.h +++ b/LEGO1/lego/legoomni/include/legopathactor.h @@ -11,6 +11,7 @@ class LegoPathController; struct LegoActorStruct { LegoActorStruct(); ~LegoActorStruct(); + void FUN_1009a140(Vector3& p_point1, Vector3& p_point2, Vector3& p_point3, Vector3& p_point4); Mx3DPointFloat m_unk0x00[4]; // 0x00 }; @@ -47,7 +48,12 @@ class LegoPathActor : public LegoActor { // FUNCTION: LEGO1 0x10002d30 virtual MxU8 GetUserNavFlag() { return m_userNavFlag; } // vtable+0x7c - virtual void VTable0x80(); // vtable+0x80 + virtual MxResult VTable0x80( + Vector3& p_point1, + Vector3& p_point2, + Vector3& p_point3, + Vector3& p_point4 + ); // vtable+0x80 virtual void VTable0x84(); // vtable+0x84 virtual void VTable0x88(); // vtable+0x88 virtual void VTable0x8c(); // vtable+0x8c diff --git a/LEGO1/lego/legoomni/src/paths/legopathactor.cpp b/LEGO1/lego/legoomni/src/paths/legopathactor.cpp index d4ccc35c..a66c8f18 100644 --- a/LEGO1/lego/legoomni/src/paths/legopathactor.cpp +++ b/LEGO1/lego/legoomni/src/paths/legopathactor.cpp @@ -1,5 +1,7 @@ #include "legopathactor.h" +#include + DECOMP_SIZE_ASSERT(LegoPathActor, 0x154) // FUNCTION: LEGO1 0x1002d700 @@ -29,10 +31,25 @@ LegoPathActor::~LegoPathActor() } } -// STUB: LEGO1 0x1002d8d0 -void LegoPathActor::VTable0x80() +// FUNCTION: LEGO1 0x1002d8d0 +MxResult LegoPathActor::VTable0x80(Vector3& p_point1, Vector3& p_point2, Vector3& p_point3, Vector3& p_point4) { - // TODO + Mx3DPointFloat p1, p2, p3; + + p1 = p_point3; + ((Vector3&) p1).Sub(&p_point1); + m_BADuration = p1.LenSquared(); + + if (m_BADuration > 0.0f) { + m_BADuration = sqrtf(m_BADuration); + p2 = p_point2; + p3 = p_point4; + m_unk0x8c.FUN_1009a140(p_point1, p2, p_point3, p3); + m_BADuration /= 0.001; + return SUCCESS; + } + + return FAILURE; } // STUB: LEGO1 0x1002d9c0 @@ -120,3 +137,15 @@ LegoActorStruct::LegoActorStruct() LegoActorStruct::~LegoActorStruct() { } + +// FUNCTION: LEGO1 0x1009a140 +void LegoActorStruct::FUN_1009a140(Vector3& p_point1, Vector3& p_point2, Vector3& p_point3, Vector3& p_point4) +{ + m_unk0x00[0] = p_point1; + m_unk0x00[1] = p_point2; + + for (MxS32 i = 0; i < 3; i++) { + m_unk0x00[2][i] = (p_point3[i] - p_point1[i]) * 3.0f - p_point2[i] * 2.0f - p_point4[i]; + m_unk0x00[3][i] = (p_point1[i] - p_point3[i]) * 2.0f + p_point4[i] + p_point2[i]; + } +} diff --git a/LEGO1/lego/legoomni/src/worlds/isle.cpp b/LEGO1/lego/legoomni/src/worlds/isle.cpp index e3545dfe..155bcb33 100644 --- a/LEGO1/lego/legoomni/src/worlds/isle.cpp +++ b/LEGO1/lego/legoomni/src/worlds/isle.cpp @@ -30,8 +30,6 @@ #include "skateboard.h" #include "towtrack.h" -#include - DECOMP_SIZE_ASSERT(Isle, 0x140) // GLOBAL: LEGO1 0x100f1198 @@ -664,14 +662,14 @@ void Isle::Enable(MxBool p_enable) Mx3DPointFloat position(CurrentActor()->GetROI()->GetWorldPosition()); Mx3DPointFloat sub(-21.375f, 0.0f, -41.75f); - sub.Sub(&position); - if (NORMSQRD3(sub) < 1024.0f) { + ((Vector3&) sub).Sub(&position); + if (sub.LenSquared() < 1024.0f) { AnimationManager()->FUN_10064740(FALSE); } Mx3DPointFloat sub2(98.874992f, 0.0f, -46.156292f); - sub2.Sub(&position); - if (NORMSQRD3(sub2) < 1024.0f) { + ((Vector3&) sub2).Sub(&position); + if (sub2.LenSquared() < 1024.0f) { AnimationManager()->FUN_10064670(FALSE); } } diff --git a/LEGO1/mxgeometry/mxgeometry3d.h b/LEGO1/mxgeometry/mxgeometry3d.h index c5dfeeda..6b822ae0 100644 --- a/LEGO1/mxgeometry/mxgeometry3d.h +++ b/LEGO1/mxgeometry/mxgeometry3d.h @@ -32,8 +32,8 @@ class Mx3DPointFloat : public Vector3 { inline float GetY() { return m_data[1]; } inline float GetZ() { return m_data[2]; } - inline float& operator[](size_t idx) { return m_data[idx]; } - inline const float& operator[](size_t idx) const { return m_data[idx]; } + inline float& operator[](int idx) { return m_data[idx]; } + inline const float& operator[](int idx) const { return m_data[idx]; } // SYNTHETIC: LEGO1 0x10010c00 // Mx3DPointFloat::operator= @@ -60,8 +60,8 @@ class Mx4DPointFloat : public Vector4 { // FUNCTION: LEGO1 0x10003200 virtual void operator=(const Vector4& p_impl) { EqualsImpl(p_impl.m_data); } // vtable+0x98 - inline float& operator[](size_t idx) { return m_data[idx]; } - inline const float& operator[](size_t idx) const { return m_data[idx]; } + inline float& operator[](int idx) { return m_data[idx]; } + inline const float& operator[](int idx) const { return m_data[idx]; } private: float m_elements[4]; // 0x08 diff --git a/LEGO1/mxgeometry/mxmatrix.h b/LEGO1/mxgeometry/mxmatrix.h index c32635b9..abbc92f5 100644 --- a/LEGO1/mxgeometry/mxmatrix.h +++ b/LEGO1/mxgeometry/mxmatrix.h @@ -14,8 +14,8 @@ class MxMatrix : public Matrix4 { inline MxMatrix(const Matrix4& p_matrix) : Matrix4(m_elements) { Equals(p_matrix); } - float* operator[](size_t idx) { return m_data[idx]; } - const float* operator[](size_t idx) const { return m_data[idx]; } + float* operator[](int idx) { return m_data[idx]; } + const float* operator[](int idx) const { return m_data[idx]; } // FUNCTION: LEGO1 0x10002850 void operator=(const Matrix4& p_matrix) override { Equals(p_matrix); } // vtable+0x28 diff --git a/LEGO1/realtime/matrix.h b/LEGO1/realtime/matrix.h index 1345e965..bc45dd54 100644 --- a/LEGO1/realtime/matrix.h +++ b/LEGO1/realtime/matrix.h @@ -144,8 +144,8 @@ class Matrix4 { inline virtual void ToQuaternion(Vector4& p_resultQuat); // vtable+0x40 inline virtual int FromQuaternion(const Vector4& p_vec); // vtable+0x44 - float* operator[](size_t idx) { return m_data[idx]; } - const float* operator[](size_t idx) const { return m_data[idx]; } + float* operator[](int idx) { return m_data[idx]; } + const float* operator[](int idx) const { return m_data[idx]; } protected: float (*m_data)[4]; diff --git a/LEGO1/realtime/vector.h b/LEGO1/realtime/vector.h index 2911e7c4..746008f2 100644 --- a/LEGO1/realtime/vector.h +++ b/LEGO1/realtime/vector.h @@ -152,8 +152,8 @@ class Vector2 { Vector2::SetVector(&p_other); return *this; } - inline float& operator[](size_t idx) { return m_data[idx]; } - inline const float& operator[](size_t idx) const { return m_data[idx]; } + inline float& operator[](int idx) { return m_data[idx]; } + inline const float& operator[](int idx) const { return m_data[idx]; } protected: float* m_data; // 0x04 @@ -265,7 +265,7 @@ class Vector3 : public Vector2 { // FUNCTION: LEGO1 0x10003bd0 float LenSquared() const override { - return m_data[1] * m_data[1] + m_data[0] * m_data[0] + m_data[2] * m_data[2]; + return m_data[0] * m_data[0] + m_data[1] * m_data[1] + m_data[2] * m_data[2]; } // vtable+0x40 inline void Fill(float p_value) { EqualsScalar(&p_value); } diff --git a/LEGO1/viewmanager/viewmanager.cpp b/LEGO1/viewmanager/viewmanager.cpp index 459403f5..395e4397 100644 --- a/LEGO1/viewmanager/viewmanager.cpp +++ b/LEGO1/viewmanager/viewmanager.cpp @@ -2,9 +2,10 @@ #include "mxdirectx/mxstopwatch.h" #include "tgl/d3drm/impl.h" -#include "vec.h" #include "viewlod.h" +#include + DECOMP_SIZE_ASSERT(ViewManager, 0x1bc) // GLOBAL: LEGO1 0x100dbcd8 @@ -372,8 +373,7 @@ void ViewManager::FUN_100a6b90() { flags &= ~c_bit2; - // TODO: Should be signed, but worsens match - unsigned int i, j, k; + int i, j, k; for (i = 0; i < 8; i++) { for (j = 0; j < 3; j++) {