From 223b07ee3d14ecdc4e0dfc29c66022f196fded24 Mon Sep 17 00:00:00 2001 From: Misha <106913236+MishaProductions@users.noreply.github.com> Date: Fri, 9 Feb 2024 18:41:35 -0500 Subject: [PATCH] Implement LegoModelPresenter::ReadyTickle (#546) * Implement LegoModelPresenter::ReadyTickle * Update legoworld.h * Fixes --------- Co-authored-by: Christian Semmler --- LEGO1/lego/legoomni/include/legoentity.h | 3 + .../legoomni/include/legoentitypresenter.h | 2 + .../legoomni/include/legomodelpresenter.h | 2 + LEGO1/lego/legoomni/src/entity/legoentity.cpp | 6 ++ .../legoomni/src/video/legomodelpresenter.cpp | 72 ++++++++++++++++++- 5 files changed, 82 insertions(+), 3 deletions(-) diff --git a/LEGO1/lego/legoomni/include/legoentity.h b/LEGO1/lego/legoomni/include/legoentity.h index e132a113..d0f64079 100644 --- a/LEGO1/lego/legoomni/include/legoentity.h +++ b/LEGO1/lego/legoomni/include/legoentity.h @@ -56,11 +56,14 @@ public: virtual void VTable0x4c(); // vtable+0x4c void FUN_10010c30(); + void FUN_100114e0(MxU8 p_unk0x59); void SetLocation(Mx3DPointFloat& p_location, Mx3DPointFloat& p_direction, Mx3DPointFloat& p_up, MxBool); inline LegoROI* GetROI() { return m_roi; } inline MxU8 GetFlags() { return m_flags; } + inline void SetFlags(MxU8 p_flags) { m_flags = p_flags; } + protected: void Init(); void SetWorld(); diff --git a/LEGO1/lego/legoomni/include/legoentitypresenter.h b/LEGO1/lego/legoomni/include/legoentitypresenter.h index 565e7878..dec78dae 100644 --- a/LEGO1/lego/legoomni/include/legoentitypresenter.h +++ b/LEGO1/lego/legoomni/include/legoentitypresenter.h @@ -35,6 +35,8 @@ public: void SetEntityLocation(Mx3DPointFloat& p_location, Mx3DPointFloat& p_direction, Mx3DPointFloat& p_up); + inline LegoEntity* GetEntity() { return m_entity; } + // SYNTHETIC: LEGO1 0x100535a0 // LegoEntityPresenter::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/include/legomodelpresenter.h b/LEGO1/lego/legoomni/include/legomodelpresenter.h index c94be713..f84c04e6 100644 --- a/LEGO1/lego/legoomni/include/legomodelpresenter.h +++ b/LEGO1/lego/legoomni/include/legomodelpresenter.h @@ -37,6 +37,8 @@ protected: private: AutoROI* m_unk0x64; // 0x64 MxBool m_addedToView; // 0x68 + + undefined4 LoadModel(MxStreamChunk* p_chunk); }; #endif // LEGOMODELPRESENTER_H diff --git a/LEGO1/lego/legoomni/src/entity/legoentity.cpp b/LEGO1/lego/legoomni/src/entity/legoentity.cpp index 86ccf923..9ac45046 100644 --- a/LEGO1/lego/legoomni/src/entity/legoentity.cpp +++ b/LEGO1/lego/legoomni/src/entity/legoentity.cpp @@ -163,6 +163,12 @@ void LegoEntity::VTable0x4c() // TODO } +// FUNCTION: LEGO1 0x100114e0 +void LegoEntity::FUN_100114e0(MxU8 p_unk0x59) +{ + m_unk0x59 = p_unk0x59; +} + // STUB: LEGO1 0x100114f0 MxLong LegoEntity::Notify(MxParam& p_param) { diff --git a/LEGO1/lego/legoomni/src/video/legomodelpresenter.cpp b/LEGO1/lego/legoomni/src/video/legomodelpresenter.cpp index 4f835212..d5fb18b9 100644 --- a/LEGO1/lego/legoomni/src/video/legomodelpresenter.cpp +++ b/LEGO1/lego/legoomni/src/video/legomodelpresenter.cpp @@ -1,5 +1,11 @@ #include "legomodelpresenter.h" +#include "legoentity.h" +#include "legoentitypresenter.h" +#include "legoomni.h" +#include "legovideomanager.h" +#include "mxcompositepresenter.h" + // GLOBAL: LEGO1 0x100f7ae0 int g_modelPresenterConfig = 1; @@ -22,16 +28,76 @@ void LegoModelPresenter::Destroy(MxBool p_fromDestructor) m_unk0x64 = 0; m_addedToView = FALSE; m_criticalSection.Leave(); + if (!p_fromDestructor) { MxVideoPresenter::Destroy(FALSE); } } -// STUB: LEGO1 0x10080050 -void LegoModelPresenter::ReadyTickle() +// STUB: LEGO1 0x1007f6b0 +undefined4 LegoModelPresenter::LoadModel(MxStreamChunk* p_chunk) { // TODO - SetTickleState(e_starting); + return 0; +} + +// FUNCTION: LEGO1 0x10080050 +void LegoModelPresenter::ReadyTickle() +{ + if (m_compositePresenter != NULL && m_compositePresenter->IsA("LegoEntityPresenter") && + m_compositePresenter->GetCurrentTickleState() <= e_ready) { + return; + } + + ParseExtra(); + + if (m_unk0x64 != NULL) { + if (m_compositePresenter && m_compositePresenter->IsA("LegoEntityPresenter")) { + ((LegoEntityPresenter*) m_compositePresenter) + ->GetEntity() + ->SetROI((LegoROI*) m_unk0x64, m_addedToView, TRUE); + ((LegoEntityPresenter*) m_compositePresenter) + ->GetEntity() + ->SetFlags( + ((LegoEntityPresenter*) m_compositePresenter)->GetEntity()->GetFlags() & ~LegoEntity::c_bit2 + ); + ((LegoEntityPresenter*) m_compositePresenter)->GetEntity()->FUN_100114e0(0); + } + + ParseExtra(); + ProgressTickleState(e_starting); + EndAction(); + } + else { + MxStreamChunk* chunk = m_subscriber->CurrentChunk(); + + if (chunk != NULL && chunk->GetTime() <= m_action->GetElapsedTime()) { + chunk = m_subscriber->NextChunk(); + undefined4 und = LoadModel(chunk); + m_subscriber->DestroyChunk(chunk); + + if (und == 0) { + VideoManager()->Get3DManager()->GetLego3DView()->Add(*m_unk0x64); + VideoManager()->Get3DManager()->GetLego3DView()->Moved(*m_unk0x64); + + if (m_compositePresenter != NULL && m_compositePresenter->IsA("LegoEntityPresenter")) { + ((LegoEntityPresenter*) m_compositePresenter) + ->GetEntity() + ->SetROI((LegoROI*) m_unk0x64, TRUE, TRUE); + ((LegoEntityPresenter*) m_compositePresenter) + ->GetEntity() + ->SetFlags( + ((LegoEntityPresenter*) m_compositePresenter)->GetEntity()->GetFlags() & ~LegoEntity::c_bit2 + ); + } + + ParseExtra(); + ProgressTickleState(e_starting); + } + + EndAction(); + } + } } // STUB: LEGO1 0x100801b0