diff --git a/LEGO1/lego/legoomni/include/legoanimpresenter.h b/LEGO1/lego/legoomni/include/legoanimpresenter.h index f22e9ba9..8d9d04a4 100644 --- a/LEGO1/lego/legoomni/include/legoanimpresenter.h +++ b/LEGO1/lego/legoomni/include/legoanimpresenter.h @@ -16,8 +16,8 @@ struct LegoAnimStructComparator { // SIZE 0x08 struct LegoAnimStruct { - LegoROI* m_roi; // 0x00 - undefined4 m_unk0x04; // 0x04 + LegoROI* m_roi; // 0x00 + MxU32 m_index; // 0x04 }; typedef map LegoAnimPresenterMap; @@ -62,8 +62,8 @@ class LegoAnimPresenter : public MxVideoPresenter { virtual void VTable0x94(); // vtable+0x94 virtual void VTable0x98(); // vtable+0x98 - // STUB: LEGO1 0x1000c990 - virtual undefined4* VTable0x9c(undefined4& p_unk0x6c) + // FUNCTION: LEGO1 0x1000c990 + virtual LegoROI** VTable0x9c(MxU32& p_unk0x6c) { p_unk0x6c = m_unk0x6c; return m_unk0x68; @@ -95,8 +95,8 @@ class LegoAnimPresenter : public MxVideoPresenter { void FUN_1006c8a0(LegoBool); LegoAnim* m_anim; // 0x64 - undefined4* m_unk0x68; // 0x68 - undefined4 m_unk0x6c; // 0x6c + LegoROI** m_unk0x68; // 0x68 + MxU32 m_unk0x6c; // 0x6c LegoROIList* m_unk0x70; // 0x70 LegoROIList* m_unk0x74; // 0x74 MxMatrix* m_unk0x78; // 0x78 @@ -104,9 +104,9 @@ class LegoAnimPresenter : public MxVideoPresenter { LegoWorld* m_currentWorld; // 0x80 MxAtomId m_animAtom; // 0x84 undefined4 m_unk0x88; // 0x88 - undefined4 m_unk0x8c; // 0x8c - undefined4 m_unk0x90; // 0x90 - undefined m_unk0x94; // 0x94 + LegoROI** m_unk0x8c; // 0x8c + const char** m_unk0x90; // 0x90 + MxU8 m_unk0x94; // 0x94 undefined m_unk0x95; // 0x95 MxBool m_unk0x96; // 0x96 undefined m_unk0x97; // 0x97 @@ -121,6 +121,15 @@ class LegoAnimPresenter : public MxVideoPresenter { // SYNTHETIC: LEGO1 0x10068650 // LegoAnimPresenter::`scalar deleting destructor' +// TEMPLATE: LEGO1 0x10069d80 +// _Tree,map >::_Kfn,LegoAnimStructComparator,allocator >::~_Tree::~Map + +// TEMPLATE: LEGO1 0x1006a370 +// map >::~map > + // TEMPLATE: LEGO1 0x1006a750 // _Tree,map >::_Kfn,LegoAnimStructComparator,allocator >::iterator::_Dec diff --git a/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp b/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp index b5bb0163..17a6f5cc 100644 --- a/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp +++ b/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp @@ -45,8 +45,8 @@ void LegoAnimPresenter::Init() m_unk0x98 = 0; m_animAtom.Clear(); m_unk0x9c = 0; - m_unk0x8c = 0; - m_unk0x90 = 0; + m_unk0x8c = NULL; + m_unk0x90 = NULL; m_unk0x94 = 0; m_unk0x96 = TRUE; m_unk0xa0 = 0; @@ -313,10 +313,45 @@ LegoROI* LegoAnimPresenter::FUN_100699e0(const LegoChar*) return NULL; } -// STUB: LEGO1 0x10069b10 +// FUNCTION: LEGO1 0x10069b10 void LegoAnimPresenter::FUN_10069b10() { - // TODO + LegoAnimPresenterMap map; + + if (m_unk0x8c != NULL) { + memset(m_unk0x8c, 0, m_unk0x94 * sizeof(*m_unk0x8c)); + } + + FUN_1006a3c0(map, m_anim->GetRoot(), NULL); + + if (m_unk0x68 != NULL) { + delete[] m_unk0x68; + m_unk0x6c = 0; + } + + m_unk0x6c = 0; + m_unk0x68 = new LegoROI*[map.size() + 1]; + memset(m_unk0x68, 0, (map.size() + 1) * sizeof(*m_unk0x68)); + + for (LegoAnimPresenterMap::iterator it = map.begin(); it != map.end();) { + MxU32 index = (*it).second.m_index; + m_unk0x68[index] = (*it).second.m_roi; + + if (m_unk0x68[index]->GetName() != NULL) { + for (MxS32 i = 0; i < m_unk0x94; i++) { + if (m_unk0x8c[i] == NULL && m_unk0x90[i] != NULL) { + if (!strcmpi(m_unk0x90[i], m_unk0x68[index]->GetName())) { + m_unk0x8c[i] = m_unk0x68[index]; + break; + } + } + } + } + + delete[] const_cast((*it).first); + it++; + m_unk0x6c++; + } } // FUNCTION: LEGO1 0x1006a3c0 @@ -384,10 +419,10 @@ void LegoAnimPresenter::FUN_1006a4f0( it = p_map.find(p_und); if (it == p_map.end()) { LegoAnimStruct animStruct; - animStruct.m_unk0x04 = p_map.size() + 1; + animStruct.m_index = p_map.size() + 1; animStruct.m_roi = p_roi; - p_data->SetUnknown0x20(animStruct.m_unk0x04); + p_data->SetUnknown0x20(animStruct.m_index); LegoChar* und = new LegoChar[strlen(p_und) + 1]; strcpy(und, p_und); @@ -395,7 +430,7 @@ void LegoAnimPresenter::FUN_1006a4f0( p_map[und] = animStruct; } else { - p_data->SetUnknown0x20((*it).second.m_unk0x04); + p_data->SetUnknown0x20((*it).second.m_index); } } @@ -469,12 +504,12 @@ void LegoAnimPresenter::StartingTickle() m_unk0x78 = new MxMatrix(); CalcLocalTransform(m_action->GetLocation(), m_action->GetDirection(), m_action->GetUp(), *m_unk0x78); } - else if (m_unk0x68) { - MxU8* und = (MxU8*) m_unk0x68[1]; + else if (m_unk0x68 != NULL) { + LegoROI* roi = m_unk0x68[1]; - if (und) { + if (roi != NULL) { MxMatrix mat; - mat = *(Matrix4*) (und + 0x10); + mat = roi->GetLocal2World(); m_unk0x78 = new MxMatrix(mat); } }