From d3b575169e9329a5fefb64e120027f38d7c0ae1c Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Mon, 4 Mar 2024 12:26:36 -0500 Subject: [PATCH] Implement/match LegoModelPresenter::FUN_1007ff70 (#622) --- .../legoomni/include/legomodelpresenter.h | 4 +-- LEGO1/lego/legoomni/include/legoworld.h | 4 +-- LEGO1/lego/legoomni/src/entity/legoworld.cpp | 6 ++-- .../legoomni/src/video/legomodelpresenter.cpp | 30 ++++++++++++++++--- 4 files changed, 33 insertions(+), 11 deletions(-) diff --git a/LEGO1/lego/legoomni/include/legomodelpresenter.h b/LEGO1/lego/legoomni/include/legomodelpresenter.h index bde10f31..480de885 100644 --- a/LEGO1/lego/legoomni/include/legomodelpresenter.h +++ b/LEGO1/lego/legoomni/include/legomodelpresenter.h @@ -36,7 +36,7 @@ class LegoModelPresenter : public MxVideoPresenter { void ParseExtra() override; // vtable+0x30 void Destroy() override; // vtable+0x38 - void FUN_1007ff70(MxDSChunk& p_chunk, LegoEntity* p_entity, undefined p_modelUnknown0x34, LegoWorld* p_world); + MxResult FUN_1007ff70(MxDSChunk& p_chunk, LegoEntity* p_entity, undefined p_modelUnknown0x34, LegoWorld* p_world); inline void Reset() { @@ -54,7 +54,7 @@ class LegoModelPresenter : public MxVideoPresenter { LegoROI* m_roi; // 0x64 MxBool m_addedToView; // 0x68 - MxResult CreateROI(MxStreamChunk* p_chunk); + MxResult CreateROI(MxDSChunk* p_chunk); }; #endif // LEGOMODELPRESENTER_H diff --git a/LEGO1/lego/legoomni/include/legoworld.h b/LEGO1/lego/legoomni/include/legoworld.h index 160c8ffc..2fa46dd5 100644 --- a/LEGO1/lego/legoomni/include/legoworld.h +++ b/LEGO1/lego/legoomni/include/legoworld.h @@ -67,7 +67,7 @@ class LegoWorld : public LegoEntity { inline LegoCameraController* GetCamera() { return m_cameraController; } inline MxS32 GetScriptIndex() { return m_scriptIndex; } inline MxCoreSet& GetUnknown0xd0() { return m_set0xd0; } - inline list& GetUnknownList0xe0() { return m_list0xe0; } + inline list& GetROIList() { return m_roiList; } inline void SetScriptIndex(MxS32 p_scriptIndex) { m_scriptIndex = p_scriptIndex; } @@ -91,7 +91,7 @@ class LegoWorld : public LegoEntity { MxCoreSet m_set0xa8; // 0xa8 MxPresenterList m_controlPresenters; // 0xb8 MxCoreSet m_set0xd0; // 0xd0 - list m_list0xe0; // 0xe0 + list m_roiList; // 0xe0 MxS32 m_scriptIndex; // 0xec LegoHideAnimPresenter* m_hideAnimPresenter; // 0xf0 MxS16 m_startupTicks; // 0xf4 diff --git a/LEGO1/lego/legoomni/src/entity/legoworld.cpp b/LEGO1/lego/legoomni/src/entity/legoworld.cpp index 81bb1e6c..bdaece9b 100644 --- a/LEGO1/lego/legoomni/src/entity/legoworld.cpp +++ b/LEGO1/lego/legoomni/src/entity/legoworld.cpp @@ -203,9 +203,9 @@ void LegoWorld::Destroy(MxBool p_fromDestructor) m_cacheSoundList = NULL; } - while (!m_list0xe0.empty()) { - LegoROI* roi = m_list0xe0.front(); - m_list0xe0.pop_front(); + while (!m_roiList.empty()) { + LegoROI* roi = m_roiList.front(); + m_roiList.pop_front(); delete roi; } diff --git a/LEGO1/lego/legoomni/src/video/legomodelpresenter.cpp b/LEGO1/lego/legoomni/src/video/legomodelpresenter.cpp index 36433c4a..3ec449c7 100644 --- a/LEGO1/lego/legoomni/src/video/legomodelpresenter.cpp +++ b/LEGO1/lego/legoomni/src/video/legomodelpresenter.cpp @@ -52,7 +52,7 @@ void LegoModelPresenter::Destroy(MxBool p_fromDestructor) } // FUNCTION: LEGO1 0x1007f6b0 -MxResult LegoModelPresenter::CreateROI(MxStreamChunk* p_chunk) +MxResult LegoModelPresenter::CreateROI(MxDSChunk* p_chunk) { MxResult result = FAILURE; LegoU32 numROIs; @@ -202,14 +202,36 @@ MxResult LegoModelPresenter::CreateROI(MxStreamChunk* p_chunk) return result; } -// STUB: LEGO1 0x1007ff70 -void LegoModelPresenter::FUN_1007ff70( +// FUNCTION: LEGO1 0x1007ff70 +MxResult LegoModelPresenter::FUN_1007ff70( MxDSChunk& p_chunk, LegoEntity* p_entity, undefined p_modelUnknown0x34, LegoWorld* p_world ) { + MxResult result = SUCCESS; + + ParseExtra(); + + if (m_roi == NULL && (result = CreateROI(&p_chunk)) == SUCCESS && p_entity != NULL) { + VideoManager()->Get3DManager()->GetLego3DView()->Add(*m_roi); + VideoManager()->Get3DManager()->GetLego3DView()->Moved(*m_roi); + } + + if (m_roi != NULL) { + m_roi->SetUnknown0x0c(p_modelUnknown0x34); + } + + if (p_entity != NULL) { + p_entity->SetROI(m_roi, TRUE, TRUE); + p_entity->ClearFlag(LegoEntity::c_bit2); + } + else { + p_world->GetROIList().push_back(m_roi); + } + + return result; } // FUNCTION: LEGO1 0x10080050 @@ -291,7 +313,7 @@ void LegoModelPresenter::ParseExtra() } else if (KeyValueStringParse(output, g_dbCreate, extraCopy) != 0 && m_roi == NULL) { LegoWorld* currentWorld = CurrentWorld(); - list& roiList = currentWorld->GetUnknownList0xe0(); + list& roiList = currentWorld->GetROIList(); for (list::iterator it = roiList.begin(); it != roiList.end(); it++) { if (!strcmpi((*it)->GetName(), output)) {