From 828908fd56a4c93db55cd9513db093bd34710944 Mon Sep 17 00:00:00 2001 From: Nathan Date: Sat, 6 Apr 2024 21:14:26 -0400 Subject: [PATCH] Implement PathActor VTable0x80 and PathActorStruct FUN_1009a140 --- LEGO1/lego/legoomni/include/legopathactor.h | 13 +++++- .../lego/legoomni/src/paths/legopathactor.cpp | 45 +++++++++++++++++-- 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/LEGO1/lego/legoomni/include/legopathactor.h b/LEGO1/lego/legoomni/include/legopathactor.h index 85fe8286..c545a933 100644 --- a/LEGO1/lego/legoomni/include/legopathactor.h +++ b/LEGO1/lego/legoomni/include/legopathactor.h @@ -11,6 +11,12 @@ class LegoPathController; struct LegoActorStruct { LegoActorStruct(); ~LegoActorStruct(); + void FUN_1009a140( + Mx3DPointFloat& p_point1, + Mx3DPointFloat& p_point2, + Mx3DPointFloat& p_point3, + Mx3DPointFloat& p_point4 + ); Mx3DPointFloat m_unk0x00[4]; // 0x00 }; @@ -47,7 +53,12 @@ class LegoPathActor : public LegoActor { // FUNCTION: LEGO1 0x10002d30 virtual MxU8 GetUserNavFlag() { return m_userNavFlag; } // vtable+0x7c - virtual void VTable0x80(); // vtable+0x80 + virtual MxResult VTable0x80( + Mx3DPointFloat& p_point1, + Mx3DPointFloat& p_point2, + Mx3DPointFloat& p_point3, + Mx3DPointFloat& 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..4af1cbd8 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 "vec.h" + DECOMP_SIZE_ASSERT(LegoPathActor, 0x154) // FUNCTION: LEGO1 0x1002d700 @@ -29,10 +31,30 @@ LegoPathActor::~LegoPathActor() } } -// STUB: LEGO1 0x1002d8d0 -void LegoPathActor::VTable0x80() +// FUNCTION: LEGO1 0x1002d8d0 +MxResult LegoPathActor::VTable0x80( + Mx3DPointFloat& p_point1, + Mx3DPointFloat& p_point2, + Mx3DPointFloat& p_point3, + Mx3DPointFloat& p_point4 +) { - // TODO + Mx3DPointFloat p1, p2, p3; + p3 = p_point3; + ((Mx3DPointFloat&) p3).Sub(&p_point1); + m_BADuration = NORMSQRD3(p3.GetData()); + + if (m_BADuration > 0.0f) { + m_BADuration = sqrtf(m_BADuration); + p1 = p_point2; + p2 = p_point4; + m_unk0x8c.FUN_1009a140(p_point1, p1, p_point3, p2); + m_BADuration *= 1000.0; + return SUCCESS; + } + else { + return FAILURE; + } } // STUB: LEGO1 0x1002d9c0 @@ -120,3 +142,20 @@ LegoActorStruct::LegoActorStruct() LegoActorStruct::~LegoActorStruct() { } + +// FUNCTION: LEGO1 0x1009a140 +void LegoActorStruct::FUN_1009a140( + Mx3DPointFloat& p_point1, + Mx3DPointFloat& p_point2, + Mx3DPointFloat& p_point3, + Mx3DPointFloat& p_point4 +) +{ + m_unk0x00[0] = p_point1; + m_unk0x00[1] = p_point2; + + for (MxU32 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]; + } +}