Implement LegoModelPresenter::ParseExtra (#557)

* Implement LegoModelPresenter::ParseExtra

* rename function according to leaked source code

* Minor improvement

---------

Co-authored-by: Christian Semmler <mail@csemmler.com>
This commit is contained in:
Misha
2024-02-11 09:03:56 -05:00
committed by GitHub
parent a29c0aca3f
commit 5233b48c59
5 changed files with 64 additions and 20 deletions

View File

@@ -35,10 +35,10 @@ protected:
void Destroy(MxBool p_fromDestructor); void Destroy(MxBool p_fromDestructor);
private: private:
AutoROI* m_unk0x64; // 0x64 AutoROI* m_roi; // 0x64
MxBool m_addedToView; // 0x68 MxBool m_addedToView; // 0x68
undefined4 LoadModel(MxStreamChunk* p_chunk); MxResult CreateROI(MxStreamChunk* p_chunk);
}; };
#endif // LEGOMODELPRESENTER_H #endif // LEGOMODELPRESENTER_H

View File

@@ -39,7 +39,7 @@ public:
LegoUnkSaveDataWriter(); LegoUnkSaveDataWriter();
MxResult WriteSaveData3(LegoStorage* p_stream); MxResult WriteSaveData3(LegoStorage* p_stream);
AutoROI* FUN_10083500(undefined4, undefined4); AutoROI* FUN_10083500(char*, undefined4);
void FUN_100832a0(); void FUN_100832a0();
void FUN_10083db0(LegoROI* p_roi); void FUN_10083db0(LegoROI* p_roi);

View File

@@ -68,6 +68,7 @@ public:
inline void SetUnknown0xec(undefined4 p_unk0xec) { m_unk0xec = p_unk0xec; } inline void SetUnknown0xec(undefined4 p_unk0xec) { m_unk0xec = p_unk0xec; }
inline undefined4 GetUnknown0xec() { return m_unk0xec; } inline undefined4 GetUnknown0xec() { return m_unk0xec; }
inline MxCoreSet& GetUnknown0xd0() { return m_set0xd0; } inline MxCoreSet& GetUnknown0xd0() { return m_set0xd0; }
inline list<AutoROI*>& GetUnknownList0xe0() { return m_list0xe0; }
MxBool PresentersPending(); MxBool PresentersPending();
void Remove(MxCore* p_object); void Remove(MxCore* p_object);

View File

@@ -71,7 +71,7 @@ MxResult LegoUnkSaveDataWriter::WriteSaveData3(LegoStorage* p_stream)
} }
// STUB: LEGO1 0x10083500 // STUB: LEGO1 0x10083500
AutoROI* LegoUnkSaveDataWriter::FUN_10083500(undefined4, undefined4) AutoROI* LegoUnkSaveDataWriter::FUN_10083500(char*, undefined4)
{ {
// TODO // TODO
// involves an STL map with a _Nil node at 0x100fc508 // involves an STL map with a _Nil node at 0x100fc508

View File

@@ -1,14 +1,27 @@
#include "legomodelpresenter.h" #include "legomodelpresenter.h"
#include "define.h"
#include "legoentity.h" #include "legoentity.h"
#include "legoentitypresenter.h" #include "legoentitypresenter.h"
#include "legoomni.h" #include "legoomni.h"
#include "legounksavedatawriter.h"
#include "legovideomanager.h" #include "legovideomanager.h"
#include "legoworld.h"
#include "mxcompositepresenter.h" #include "mxcompositepresenter.h"
#include "mxutil.h"
#include "roi/legoroi.h"
// GLOBAL: LEGO1 0x100f7ae0 // GLOBAL: LEGO1 0x100f7ae0
int g_modelPresenterConfig = 1; int g_modelPresenterConfig = 1;
// GLOBAL: LEGO1 0x10102054
// STRING: LEGO1 0x10102018
char* g_autoCreate = "AUTO_CREATE";
// GLOBAL: LEGO1 0x10102078
// STRING: LEGO1 0x10101fc4
char* g_dbCreate = "DB_CREATE";
// FUNCTION: LEGO1 0x1000cca0 // FUNCTION: LEGO1 0x1000cca0
void LegoModelPresenter::Destroy() void LegoModelPresenter::Destroy()
{ {
@@ -25,7 +38,7 @@ void LegoModelPresenter::configureLegoModelPresenter(MxS32 p_modelPresenterConfi
void LegoModelPresenter::Destroy(MxBool p_fromDestructor) void LegoModelPresenter::Destroy(MxBool p_fromDestructor)
{ {
m_criticalSection.Enter(); m_criticalSection.Enter();
m_unk0x64 = 0; m_roi = NULL;
m_addedToView = FALSE; m_addedToView = FALSE;
m_criticalSection.Leave(); m_criticalSection.Leave();
@@ -35,10 +48,10 @@ void LegoModelPresenter::Destroy(MxBool p_fromDestructor)
} }
// STUB: LEGO1 0x1007f6b0 // STUB: LEGO1 0x1007f6b0
undefined4 LegoModelPresenter::LoadModel(MxStreamChunk* p_chunk) MxResult LegoModelPresenter::CreateROI(MxStreamChunk* p_chunk)
{ {
// TODO // TODO
return 0; return FAILURE;
} }
// FUNCTION: LEGO1 0x10080050 // FUNCTION: LEGO1 0x10080050
@@ -51,11 +64,9 @@ void LegoModelPresenter::ReadyTickle()
ParseExtra(); ParseExtra();
if (m_unk0x64 != NULL) { if (m_roi != NULL) {
if (m_compositePresenter && m_compositePresenter->IsA("LegoEntityPresenter")) { if (m_compositePresenter && m_compositePresenter->IsA("LegoEntityPresenter")) {
((LegoEntityPresenter*) m_compositePresenter) ((LegoEntityPresenter*) m_compositePresenter)->GetEntity()->SetROI((LegoROI*) m_roi, m_addedToView, TRUE);
->GetEntity()
->SetROI((LegoROI*) m_unk0x64, m_addedToView, TRUE);
((LegoEntityPresenter*) m_compositePresenter) ((LegoEntityPresenter*) m_compositePresenter)
->GetEntity() ->GetEntity()
->SetFlags( ->SetFlags(
@@ -73,17 +84,15 @@ void LegoModelPresenter::ReadyTickle()
if (chunk != NULL && chunk->GetTime() <= m_action->GetElapsedTime()) { if (chunk != NULL && chunk->GetTime() <= m_action->GetElapsedTime()) {
chunk = m_subscriber->NextChunk(); chunk = m_subscriber->NextChunk();
undefined4 und = LoadModel(chunk); MxResult result = CreateROI(chunk);
m_subscriber->DestroyChunk(chunk); m_subscriber->DestroyChunk(chunk);
if (und == 0) { if (result == SUCCESS) {
VideoManager()->Get3DManager()->GetLego3DView()->Add(*m_unk0x64); VideoManager()->Get3DManager()->GetLego3DView()->Add(*m_roi);
VideoManager()->Get3DManager()->GetLego3DView()->Moved(*m_unk0x64); VideoManager()->Get3DManager()->GetLego3DView()->Moved(*m_roi);
if (m_compositePresenter != NULL && m_compositePresenter->IsA("LegoEntityPresenter")) { if (m_compositePresenter != NULL && m_compositePresenter->IsA("LegoEntityPresenter")) {
((LegoEntityPresenter*) m_compositePresenter) ((LegoEntityPresenter*) m_compositePresenter)->GetEntity()->SetROI((LegoROI*) m_roi, TRUE, TRUE);
->GetEntity()
->SetROI((LegoROI*) m_unk0x64, TRUE, TRUE);
((LegoEntityPresenter*) m_compositePresenter) ((LegoEntityPresenter*) m_compositePresenter)
->GetEntity() ->GetEntity()
->SetFlags( ->SetFlags(
@@ -100,8 +109,42 @@ void LegoModelPresenter::ReadyTickle()
} }
} }
// STUB: LEGO1 0x100801b0 // FUNCTION: LEGO1 0x100801b0
void LegoModelPresenter::ParseExtra() void LegoModelPresenter::ParseExtra()
{ {
// TODO char output[1024];
MxU16 len = m_action->GetExtraLength();
char* extraData = m_action->GetExtraData();
if (len != 0) {
char buffer[1024];
output[0] = 0;
memcpy(buffer, extraData, len);
buffer[len] = 0;
if (KeyValueStringParse(output, g_autoCreate, buffer) != 0) {
char* token = strtok(output, g_parseExtraTokens);
if (m_roi == NULL) {
m_roi = UnkSaveDataWriter()->FUN_10083500(token, 0);
m_addedToView = FALSE;
}
}
else if (KeyValueStringParse(output, g_dbCreate, buffer) != 0 && m_roi == NULL) {
LegoWorld* currentWorld = CurrentWorld();
list<AutoROI*>& roiList = currentWorld->GetUnknownList0xe0();
for (list<AutoROI*>::iterator it = roiList.begin(); it != roiList.end(); it++) {
if (!strcmpi(((LegoROI*) (*it))->GetUnknown0xe4(), output)) {
m_roi = *it;
roiList.erase(it);
m_addedToView = TRUE;
VideoManager()->Get3DManager()->GetLego3DView()->Add(*m_roi);
VideoManager()->Get3DManager()->GetLego3DView()->Moved(*m_roi);
break;
}
}
}
}
} }