mirror of
https://github.com/isledecomp/isle.git
synced 2025-10-24 08:54:15 +00:00
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:
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user