From fb800db8628542b250d13936faa0135e7cec3b5e Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Fri, 8 Mar 2024 21:52:42 -0500 Subject: [PATCH] Implement OrientableROI::FUN_100a46b0 (#640) * Implement OrientableROI::FUN_100a46b0 * Fix --- .../legoomni/src/input/legoinputmanager.cpp | 4 +-- LEGO1/lego/sources/roi/legoroi.cpp | 6 ++-- LEGO1/realtime/orientableroi.cpp | 36 ++++++++++++++++--- LEGO1/realtime/orientableroi.h | 6 ++-- 4 files changed, 39 insertions(+), 13 deletions(-) diff --git a/LEGO1/lego/legoomni/src/input/legoinputmanager.cpp b/LEGO1/lego/legoomni/src/input/legoinputmanager.cpp index 00b5ecec..40eac915 100644 --- a/LEGO1/lego/legoomni/src/input/legoinputmanager.cpp +++ b/LEGO1/lego/legoomni/src/input/legoinputmanager.cpp @@ -388,8 +388,8 @@ MxBool LegoInputManager::ProcessOneEvent(LegoEventNotificationParam& p_param) p_param.SetROI(roi); if (roi && roi->GetUnknown0x0c() == 1) { - for (OrientableROI* oroi = roi->GetUnknown0xd4(); oroi; oroi = oroi->GetUnknown0xd4()) { - roi = (LegoROI*) oroi; + for (OrientableROI* parent = roi->GetParentROI(); parent; parent = parent->GetParentROI()) { + roi = (LegoROI*) parent; } LegoEntity* entity = roi->GetEntity(); diff --git a/LEGO1/lego/sources/roi/legoroi.cpp b/LEGO1/lego/sources/roi/legoroi.cpp index b985420b..df83cd37 100644 --- a/LEGO1/lego/sources/roi/legoroi.cpp +++ b/LEGO1/lego/sources/roi/legoroi.cpp @@ -69,7 +69,7 @@ void LegoROI::configureLegoROI(int p_roiConfig) // FUNCTION: LEGO1 0x100a81d0 LegoROI::LegoROI(Tgl::Renderer* p_renderer) : ViewROI(p_renderer, NULL) { - m_unk0xd4 = NULL; + m_parentROI = NULL; m_name = NULL; m_entity = NULL; } @@ -77,7 +77,7 @@ LegoROI::LegoROI(Tgl::Renderer* p_renderer) : ViewROI(p_renderer, NULL) // FUNCTION: LEGO1 0x100a82d0 LegoROI::LegoROI(Tgl::Renderer* p_renderer, ViewLODList* p_lodList) : ViewROI(p_renderer, p_lodList) { - m_unk0xd4 = NULL; + m_parentROI = NULL; m_name = NULL; m_entity = NULL; } @@ -124,7 +124,7 @@ LegoResult LegoROI::Read( LegoSphere sphere; LegoBox box; - m_unk0xd4 = p_unk0xd4; + m_parentROI = p_unk0xd4; if (p_storage->Read(&length, sizeof(length)) != SUCCESS) { goto done; diff --git a/LEGO1/realtime/orientableroi.cpp b/LEGO1/realtime/orientableroi.cpp index 2acdb72d..3d2ad0e2 100644 --- a/LEGO1/realtime/orientableroi.cpp +++ b/LEGO1/realtime/orientableroi.cpp @@ -16,7 +16,7 @@ OrientableROI::OrientableROI() ZEROVEC3(m_world_velocity); IDENTMAT4(m_local2world); - m_unk0xd4 = NULL; + m_parentROI = NULL; ToggleUnknown0xd8(TRUE); } @@ -27,10 +27,36 @@ void OrientableROI::WrappedSetLocalTransform(const Matrix4& p_transform) SetLocalTransform(p_transform); } -// STUB: LEGO1 0x100a46b0 -void OrientableROI::FUN_100a46b0(Matrix4& p_transform) +// FUNCTION: LEGO1 0x100a46b0 +void OrientableROI::FUN_100a46b0(const Matrix4& p_transform) { - // TODO + MxMatrix mat; + + double local2world[4][4]; + double local2parent[4][4]; + int i, j; + + for (i = 0; i < 4; i++) { + for (j = 0; j < 4; j++) { + local2world[i][j] = p_transform[i][j]; + local2parent[i][j] = m_local2world[i][j]; + } + } + + double local_inverse[4][4]; + INVERTMAT4d(local_inverse, local2parent); + + double parent2world[4][4]; + MXM4(parent2world, local_inverse, local2world); + + unsigned int k, l; + for (k = 0; k < 4; k++) { + for (l = 0; l < 4; l++) { + mat[k][l] = parent2world[k][l]; + } + } + + UpdateWorldData(mat); } // Maybe an overload based on MxMatrix type @@ -43,7 +69,7 @@ void OrientableROI::WrappedVTable0x24(const Matrix4& p_transform) // STUB: LEGO1 0x100a50a0 void OrientableROI::GetLocalTransform(Matrix4& p_transform) { - // TODO + p_transform = m_local2world; } // FUNCTION: LEGO1 0x100a58f0 diff --git a/LEGO1/realtime/orientableroi.h b/LEGO1/realtime/orientableroi.h index 70db67cb..beec0ef9 100644 --- a/LEGO1/realtime/orientableroi.h +++ b/LEGO1/realtime/orientableroi.h @@ -33,7 +33,7 @@ class OrientableROI : public ROI { virtual void UpdateWorldVelocity(); // vtable+0x2c void WrappedSetLocalTransform(const Matrix4& p_transform); - void FUN_100a46b0(Matrix4& p_transform); + void FUN_100a46b0(const Matrix4& p_transform); void WrappedVTable0x24(const Matrix4& p_transform); void GetLocalTransform(Matrix4& p_transform); void FUN_100a58f0(const Matrix4& p_transform); @@ -43,7 +43,7 @@ class OrientableROI : public ROI { const float* GetWorldPosition() const { return m_local2world[3]; } const float* GetWorldDirection() const { return m_local2world[2]; } const float* GetWorldUp() const { return m_local2world[1]; } - OrientableROI* GetUnknown0xd4() const { return m_unk0xd4; } + OrientableROI* GetParentROI() const { return m_parentROI; } void ToggleUnknown0xd8(BOOL p_enable) { @@ -61,7 +61,7 @@ class OrientableROI : public ROI { BoundingBox m_unk0x80; // 0x80 BoundingSphere m_world_bounding_sphere; // 0xa8 Mx3DPointFloat m_world_velocity; // 0xc0 - OrientableROI* m_unk0xd4; // 0xd4 + OrientableROI* m_parentROI; // 0xd4 undefined4 m_unk0xd8; // 0xd8 };