Implement/match various small LegoAnimPresenter functions (#846)

* Implement/match various small LegoAnimPresenter functions

* Fix location of anim function

* fix
This commit is contained in:
Christian Semmler 2024-04-24 09:51:28 -04:00 committed by GitHub
parent f898462d17
commit 410824bd0f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 71 additions and 26 deletions

View file

@ -10,6 +10,7 @@
class LegoWorld; class LegoWorld;
class LegoAnimClass; class LegoAnimClass;
class LegoAnimActor; class LegoAnimActor;
class LegoPathBoundary;
struct LegoAnimStructComparator { struct LegoAnimStructComparator {
MxBool operator()(const char* const& p_a, const char* const& p_b) const { return strcmp(p_a, p_b) < 0; } MxBool operator()(const char* const& p_a, const char* const& p_b) const { return strcmp(p_a, p_b) < 0; }
@ -62,7 +63,7 @@ class LegoAnimPresenter : public MxVideoPresenter {
virtual void VTable0x8c(); // vtable+0x8c virtual void VTable0x8c(); // vtable+0x8c
virtual void VTable0x90(); // vtable+0x90 virtual void VTable0x90(); // vtable+0x90
virtual MxResult VTable0x94(Vector3&, Vector3&, float, float, Vector3&); // vtable+0x94 virtual MxResult VTable0x94(Vector3&, Vector3&, float, float, Vector3&); // vtable+0x94
virtual void VTable0x98(); // vtable+0x98 virtual MxResult VTable0x98(LegoPathBoundary* p_boundary); // vtable+0x98
// FUNCTION: LEGO1 0x1000c990 // FUNCTION: LEGO1 0x1000c990
virtual LegoROI** GetROIMap(MxU32& p_roiMapSize) virtual LegoROI** GetROIMap(MxU32& p_roiMapSize)
@ -71,16 +72,14 @@ class LegoAnimPresenter : public MxVideoPresenter {
return m_roiMap; return m_roiMap;
} // vtable+0x9c } // vtable+0x9c
virtual void VTable0xa0(Matrix4*); // vtable+0xa0 virtual void VTable0xa0(Matrix4& p_matrix); // vtable+0xa0
MxResult FUN_1006afc0(MxMatrix*& p_matrix, float p_und); MxResult FUN_1006afc0(MxMatrix*& p_matrix, float p_und);
MxResult FUN_1006b140(LegoROI* p_roi); MxResult FUN_1006b140(LegoROI* p_roi);
void FUN_1006d680(LegoAnimActor* p_actor, MxFloat p_value); const char* GetActionObjectName();
inline LegoAnim* GetAnimation() { return m_anim; } inline LegoAnim* GetAnimation() { return m_anim; }
const char* GetActionObjectName();
protected: protected:
void Init(); void Init();
void Destroy(MxBool p_fromDestructor); void Destroy(MxBool p_fromDestructor);

View file

@ -2,7 +2,6 @@
#define LEGOEXTRAACTOR_H #define LEGOEXTRAACTOR_H
#include "legoanimactor.h" #include "legoanimactor.h"
#include "legoanimpresenter.h"
// VTABLE: LEGO1 0x100d6c00 LegoAnimActor // VTABLE: LEGO1 0x100d6c00 LegoAnimActor
// VTABLE: LEGO1 0x100d6c10 LegoPathActor // VTABLE: LEGO1 0x100d6c10 LegoPathActor

View file

@ -35,6 +35,8 @@ class LegoLocomotionAnimPresenter : public LegoLoopingAnimPresenter {
// SYNTHETIC: LEGO1 0x1006cfe0 // SYNTHETIC: LEGO1 0x1006cfe0
// LegoLocomotionAnimPresenter::`scalar deleting destructor' // LegoLocomotionAnimPresenter::`scalar deleting destructor'
void FUN_1006d680(LegoAnimActor* p_actor, MxFloat p_value);
inline void DecrementUnknown0xd4() inline void DecrementUnknown0xd4()
{ {
if (m_unk0xd4) { if (m_unk0xd4) {

View file

@ -43,6 +43,7 @@ class LegoPathController : public MxCore {
undefined4 FUN_10046770(LegoPathActor* p_actor); undefined4 FUN_10046770(LegoPathActor* p_actor);
void FUN_100468f0(LegoAnimPresenter* p_presenter); void FUN_100468f0(LegoAnimPresenter* p_presenter);
void FUN_10046930(LegoAnimPresenter* p_presenter);
MxResult FUN_10046b30(LegoPathBoundary** p_path, MxS32& p_value); MxResult FUN_10046b30(LegoPathBoundary** p_path, MxS32& p_value);
void Enable(MxBool p_enable); void Enable(MxBool p_enable);
void FUN_10046bb0(LegoWorld* p_world); void FUN_10046bb0(LegoWorld* p_world);

View file

@ -75,6 +75,7 @@ class LegoWorld : public LegoEntity {
); );
void FUN_1001fc80(IslePathActor* p_actor); void FUN_1001fc80(IslePathActor* p_actor);
void FUN_1001fda0(LegoAnimPresenter* p_presenter); void FUN_1001fda0(LegoAnimPresenter* p_presenter);
void FUN_1001fe90(LegoAnimPresenter* p_presenter);
void AddPath(LegoPathController* p_controller); void AddPath(LegoPathController* p_controller);
MxResult GetCurrPathInfo(LegoPathBoundary** p_path, MxS32& p_value); MxResult GetCurrPathInfo(LegoPathBoundary** p_path, MxS32& p_value);
MxCore* Find(const char* p_class, const char* p_name); MxCore* Find(const char* p_class, const char* p_name);

View file

@ -149,7 +149,7 @@ void LegoAnimMMPresenter::ReadyTickle()
} }
if (m_tranInfo != NULL && m_tranInfo->m_unk0x0c != NULL) { if (m_tranInfo != NULL && m_tranInfo->m_unk0x0c != NULL) {
m_presenter->VTable0xa0(m_tranInfo->m_unk0x0c); m_presenter->VTable0xa0(*m_tranInfo->m_unk0x0c);
} }
if (m_presenter != NULL) { if (m_presenter != NULL) {

View file

@ -311,6 +311,18 @@ void LegoWorld::FUN_1001fda0(LegoAnimPresenter* p_presenter)
} }
} }
// FUNCTION: LEGO1 0x1001fe90
// FUNCTION: BETA10 0x100da6b5
void LegoWorld::FUN_1001fe90(LegoAnimPresenter* p_presenter)
{
LegoPathControllerListCursor cursor(&m_list0x68);
LegoPathController* controller;
while (cursor.Next(controller)) {
controller->FUN_10046930(p_presenter);
}
}
// FUNCTION: LEGO1 0x1001ff80 // FUNCTION: LEGO1 0x1001ff80
void LegoWorld::AddPath(LegoPathController* p_controller) void LegoWorld::AddPath(LegoPathController* p_controller)
{ {

View file

@ -1,7 +1,7 @@
#include "legoanimactor.h" #include "legoanimactor.h"
#include "define.h" #include "define.h"
#include "legoanimpresenter.h" #include "legolocomotionanimpresenter.h"
#include "legoworld.h" #include "legoworld.h"
#include "misc.h" #include "misc.h"
#include "mxutilities.h" #include "mxutilities.h"
@ -200,7 +200,8 @@ void LegoAnimActor::ParseAction(char* p_extra)
char* token = strtok(value, g_parseExtraTokens); char* token = strtok(value, g_parseExtraTokens);
while (token) { while (token) {
LegoAnimPresenter* presenter = (LegoAnimPresenter*) world->Find("LegoAnimPresenter", token); LegoLocomotionAnimPresenter* presenter =
(LegoLocomotionAnimPresenter*) world->Find("LegoAnimPresenter", token);
if (presenter != NULL) { if (presenter != NULL) {
token = strtok(NULL, g_parseExtraTokens); token = strtok(NULL, g_parseExtraTokens);

View file

@ -1,5 +1,6 @@
#include "legoextraactor.h" #include "legoextraactor.h"
#include "legolocomotionanimpresenter.h"
#include "legosoundmanager.h" #include "legosoundmanager.h"
#include "misc.h" #include "misc.h"
#include "mxmisc.h" #include "mxmisc.h"
@ -11,10 +12,10 @@ DECOMP_SIZE_ASSERT(LegoExtraActor, 0x1dc)
LegoWorld* g_unk0x100f31d0 = NULL; LegoWorld* g_unk0x100f31d0 = NULL;
// GLOBAL: LEGO1 0x100f31d4 // GLOBAL: LEGO1 0x100f31d4
LegoAnimPresenter* m_assAnimP = NULL; LegoLocomotionAnimPresenter* m_assAnimP = NULL;
// GLOBAL: LEGO1 0x100f31d8 // GLOBAL: LEGO1 0x100f31d8
LegoAnimPresenter* m_disAnimP = NULL; LegoLocomotionAnimPresenter* m_disAnimP = NULL;
// GLOBAL: LEGO1 0x100f31dc // GLOBAL: LEGO1 0x100f31dc
MxS32 g_unk0x100f31dc = 0; MxS32 g_unk0x100f31dc = 0;
@ -156,8 +157,8 @@ inline void LegoExtraActor::FUN_1002ad8a()
if (g_unk0x100f31d0 != w) { if (g_unk0x100f31d0 != w) {
g_unk0x100f31d0 = w; g_unk0x100f31d0 = w;
m_assAnimP = (LegoAnimPresenter*) w->Find("LegoAnimPresenter", "BNsAss01"); m_assAnimP = (LegoLocomotionAnimPresenter*) w->Find("LegoAnimPresenter", "BNsAss01");
m_disAnimP = (LegoAnimPresenter*) w->Find("LegoAnimPresenter", "BNsDis01"); m_disAnimP = (LegoLocomotionAnimPresenter*) w->Find("LegoAnimPresenter", "BNsDis01");
} }
if (!m_assAnim) { if (!m_assAnim) {

View file

@ -39,6 +39,12 @@ void LegoPathController::FUN_100468f0(LegoAnimPresenter* p_presenter)
{ {
} }
// STUB: LEGO1 0x10046930
// FUNCTION: BETA10 0x100b737b
void LegoPathController::FUN_10046930(LegoAnimPresenter* p_presenter)
{
}
// STUB: LEGO1 0x10046b30 // STUB: LEGO1 0x10046b30
MxResult LegoPathController::FUN_10046b30(LegoPathBoundary** p_path, MxS32& p_value) MxResult LegoPathController::FUN_10046b30(LegoPathBoundary** p_path, MxS32& p_value)
{ {

View file

@ -805,10 +805,15 @@ void LegoAnimPresenter::ParseExtra()
// TODO // TODO
} }
// STUB: LEGO1 0x1006c570 // FUNCTION: LEGO1 0x1006c570
void LegoAnimPresenter::VTable0xa0(Matrix4*) // FUNCTION: BETA10 0x10051ab3
void LegoAnimPresenter::VTable0xa0(Matrix4& p_matrix)
{ {
// TODO if (m_unk0x78 != NULL) {
delete m_unk0x78;
}
m_unk0x78 = new MxMatrix(p_matrix);
} }
// FUNCTION: LEGO1 0x1006c620 // FUNCTION: LEGO1 0x1006c620
@ -882,10 +887,19 @@ void LegoAnimPresenter::VTable0x8c()
} }
} }
// STUB: LEGO1 0x1006c860 // FUNCTION: LEGO1 0x1006c860
// FUNCTION: BETA10 0x10051f45
void LegoAnimPresenter::VTable0x90() void LegoAnimPresenter::VTable0x90()
{ {
// TODO if (m_currentWorld != NULL) {
m_currentWorld->FUN_1001fe90(this);
if (m_compositePresenter != NULL && m_compositePresenter->IsA("LegoAnimMMPresenter")) {
return;
}
m_currentWorld->Remove(this);
}
} }
// FUNCTION: LEGO1 0x1006c8a0 // FUNCTION: LEGO1 0x1006c8a0
@ -914,14 +928,17 @@ MxResult LegoAnimPresenter::VTable0x94(Vector3&, Vector3&, float, float, Vector3
return SUCCESS; return SUCCESS;
} }
// STUB: LEGO1 0x1006ca50 // FUNCTION: LEGO1 0x1006ca50
void LegoAnimPresenter::VTable0x98() // FUNCTION: BETA10 0x100521d0
MxResult LegoAnimPresenter::VTable0x98(LegoPathBoundary* p_boundary)
{ {
// TODO for (MxU32 i = 1; i <= m_roiMapSize; i++) {
} LegoEntity* entity = m_roiMap[i]->GetEntity();
// STUB: LEGO1 0x1006d680 if (entity != NULL) {
void LegoAnimPresenter::FUN_1006d680(LegoAnimActor* p_actor, MxFloat p_value) p_boundary->AddActor((LegoPathActor*) entity);
{ }
// TODO }
return SUCCESS;
} }

View file

@ -113,3 +113,9 @@ void LegoLocomotionAnimPresenter::EndAction()
MxVideoPresenter::EndAction(); MxVideoPresenter::EndAction();
} }
} }
// STUB: LEGO1 0x1006d680
void LegoLocomotionAnimPresenter::FUN_1006d680(LegoAnimActor* p_actor, MxFloat p_value)
{
// TODO
}