From 1aed8f6d93f4e7aede6b3686b9e1c5887e579fa4 Mon Sep 17 00:00:00 2001 From: Misha <106913236+MishaProductions@users.noreply.github.com> Date: Fri, 9 Feb 2024 18:09:45 -0500 Subject: [PATCH] Implement LegoModelPresenter::ReadyTickle --- LEGO1/lego/legoomni/include/legoentity.h | 3 + .../legoomni/include/legoentitypresenter.h | 2 + .../legoomni/include/legomodelpresenter.h | 2 + LEGO1/lego/legoomni/include/legoworld.h | 1 + LEGO1/lego/legoomni/src/entity/legoentity.cpp | 6 ++ .../legoomni/src/video/legomodelpresenter.cpp | 69 ++++++++++++++++++- 6 files changed, 80 insertions(+), 3 deletions(-) diff --git a/LEGO1/lego/legoomni/include/legoentity.h b/LEGO1/lego/legoomni/include/legoentity.h index e132a113..003d7e03 100644 --- a/LEGO1/lego/legoomni/include/legoentity.h +++ b/LEGO1/lego/legoomni/include/legoentity.h @@ -56,11 +56,14 @@ class LegoEntity : public MxEntity { virtual void VTable0x4c(); // vtable+0x4c void FUN_10010c30(); + void FUN_100114e0(MxU8 p_val); 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 @@ class LegoEntityPresenter : public MxCompositePresenter { 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..8b79561f 100644 --- a/LEGO1/lego/legoomni/include/legomodelpresenter.h +++ b/LEGO1/lego/legoomni/include/legomodelpresenter.h @@ -37,6 +37,8 @@ class LegoModelPresenter : public MxVideoPresenter { private: AutoROI* m_unk0x64; // 0x64 MxBool m_addedToView; // 0x68 + + void LoadModel(MxStreamChunk* p_chunk); }; #endif // LEGOMODELPRESENTER_H diff --git a/LEGO1/lego/legoomni/include/legoworld.h b/LEGO1/lego/legoomni/include/legoworld.h index bd07ddc5..5ac75643 100644 --- a/LEGO1/lego/legoomni/include/legoworld.h +++ b/LEGO1/lego/legoomni/include/legoworld.h @@ -66,6 +66,7 @@ class LegoWorld : public LegoEntity { inline LegoCameraController* GetCamera() { return m_cameraController; } inline undefined4 GetUnknown0xec() { return m_unk0xec; } + inline MxCoreSet& GetUnknown0xd0() { return m_set0xd0; } MxBool PresentersPending(); void Remove(MxCore* p_object); diff --git a/LEGO1/lego/legoomni/src/entity/legoentity.cpp b/LEGO1/lego/legoomni/src/entity/legoentity.cpp index 86ccf923..c3943ec4 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_val) +{ + m_unk0x59 = p_val; +} + // 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..590304a5 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; @@ -27,11 +33,68 @@ void LegoModelPresenter::Destroy(MxBool p_fromDestructor) } } -// STUB: LEGO1 0x10080050 -void LegoModelPresenter::ReadyTickle() +// STUB: LEGO1 0x1007f6b0 +void LegoModelPresenter::LoadModel(MxStreamChunk* p_chunk) { // TODO - SetTickleState(e_starting); +} + +// 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(); + LoadModel(chunk); + m_subscriber->DestroyChunk(chunk); + + if (chunk == NULL) { + 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(); + } + return; + } } // STUB: LEGO1 0x100801b0