Implement/match LegoPathController::Read (#904)

* Implement/match LegoPathController::Read

* Add size asserts
This commit is contained in:
Christian Semmler
2024-05-11 12:23:18 -04:00
committed by GitHub
parent 5df947dbb9
commit f442f1a2f7
11 changed files with 276 additions and 27 deletions

View File

@@ -26,6 +26,7 @@ typedef set<LegoAnimPresenter*, LegoAnimPresenterSetCompare> LegoAnimPresenterSe
class LegoPathBoundary : public LegoWEGEdge {
public:
LegoPathBoundary();
~LegoPathBoundary() override;
MxResult AddActor(LegoPathActor* p_actor);
void FUN_100575b0(Vector3& p_point1, Vector3& p_point2, LegoPathActor* p_actor);
@@ -35,7 +36,7 @@ public:
inline LegoAnimPresenterSet* GetPresenters() { return &m_presenters; }
// SYNTHETIC: LEGO1 0x10047a80
// LegoPathBoundary::`scalar deleting destructor'
// LegoPathBoundary::`vector deleting destructor'
private:
LegoPathActorSet m_actors; // 0x54

View File

@@ -2,20 +2,31 @@
#define LEGOPATHCONTROLLER_H
#include "decomp.h"
#include "geom/legounkown100db7f4.h"
#include "legopathactor.h"
#include "legopathboundary.h"
#include "mxcore.h"
#include "mxstl/stlcompat.h"
class LegoAnimPresenter;
class LegoPathStruct;
class LegoWorld;
class MxAtomId;
class Vector3;
struct LegoPathControllerComparator {
MxBool operator()(const undefined*, const undefined*) const { return 0; }
// VTABLE: LEGO1 0x100d7da8
// SIZE 0x40
class LegoPathCtrlEdge : public LegoUnknown100db7f4 {};
struct LegoPathCtrlEdgeCompare {
MxU32 operator()(const LegoPathCtrlEdge* p_lhs, const LegoPathCtrlEdge* p_rhs) const
{
return (MxS32) p_lhs < (MxS32) p_rhs;
}
};
typedef set<LegoPathCtrlEdge*, LegoPathCtrlEdgeCompare> LegoPathCtrlEdgeSet;
// VTABLE: LEGO1 0x100d7d60
// SIZE 0x40
class LegoPathController : public MxCore {
@@ -41,8 +52,8 @@ public:
// SYNTHETIC: LEGO1 0x10045740
// LegoPathController::`scalar deleting destructor'
virtual void VTable0x14(MxU8* p_data, Vector3& p_location, MxAtomId& p_trigger); // vtable+0x14
virtual void Destroy(); // vtable+0x18
virtual void Create(MxU8* p_data, Vector3& p_location, MxAtomId& p_trigger); // vtable+0x14
virtual void Destroy(); // vtable+0x18
MxResult FUN_10045c20(
LegoPathActor* p_actor,
@@ -61,30 +72,66 @@ public:
void FUN_10046bb0(LegoWorld* p_world);
private:
LegoPathBoundary* m_unk0x08; // 0x08
undefined4 m_unk0x0c; // 0x0c
undefined4 m_unk0x10; // 0x10
undefined4 m_unk0x14; // 0x14
MxU16 m_numL; // 0x18
MxU16 m_numE; // 0x1a
MxU16 m_numN; // 0x1c
MxU16 m_numT; // 0x1e
set<undefined*, LegoPathControllerComparator> m_pfsE; // 0x20
LegoPathActorSet m_actors; // 0x30
MxResult Read(LegoStorage* p_storage);
MxResult FUN_10047b30(LegoStorage* p_storage);
MxResult FUN_10047c10(LegoStorage* p_storage);
MxResult FUN_10047e90(LegoStorage* p_storage);
static MxResult FUN_100482b0(LegoStorage* p_storage, Mx3DPointFloat&);
LegoPathBoundary* m_unk0x08; // 0x08
LegoPathCtrlEdge* m_unk0x0c; // 0x0c
Mx3DPointFloat* m_unk0x10; // 0x10
LegoPathStruct* m_unk0x14; // 0x14
MxU16 m_numL; // 0x18
MxU16 m_numE; // 0x1a
MxU16 m_numN; // 0x1c
MxU16 m_numT; // 0x1e
LegoPathCtrlEdgeSet m_pfsE; // 0x20
LegoPathActorSet m_actors; // 0x30
};
// clang-format off
// TEMPLATE: LEGO1 0x100451a0
// _Tree<unsigned char *,unsigned char *,set<unsigned char *,LegoPathControllerComparator,allocator<unsigned char *> >::_Kfn,LegoPathControllerComparator,allocator<unsigned char *> >::~_Tree<unsigned char *,unsigned char *,set<unsigned char *,LegoPathControl
// _Tree<LegoPathCtrlEdge *,LegoPathCtrlEdge *,set<LegoPathCtrlEdge *,LegoPathCtrlEdgeCompare,allocator<LegoPathCtrlEdge *> >::_Kfn,LegoPathCtrlEdgeCompare,allocator<LegoPathCtrlEdge *> >::~_Tree<LegoPathCtrlEdge *,LegoPathCtrlEdge *,set<LegoPathCtrlEdge *,LegoPathControl
// TEMPLATE: LEGO1 0x100457e0
// Set<unsigned char *,LegoPathControllerComparator>::~Set<unsigned char *,LegoPathControllerComparator>
// Set<LegoPathCtrlEdge *,LegoPathCtrlEdgeCompare>::~Set<LegoPathCtrlEdge *,LegoPathCtrlEdgeCompare>
// TEMPLATE: LEGO1 0x10045830
// set<unsigned char *,LegoPathControllerComparator,allocator<unsigned char *> >::~set<unsigned char *,LegoPathControllerComparator,allocator<unsigned char *> >
// set<LegoPathCtrlEdge *,LegoPathCtrlEdgeCompare,allocator<LegoPathCtrlEdge *> >::~set<LegoPathCtrlEdge *,LegoPathCtrlEdgeCompare,allocator<LegoPathCtrlEdge *> >
// TEMPLATE: LEGO1 0x10047550
// _Tree<LegoPathCtrlEdge *,LegoPathCtrlEdge *,set<LegoPathCtrlEdge *,LegoPathCtrlEdgeCompare,allocator<LegoPathCtrlEdge *> >::_Kfn,LegoPathCtrlEdgeCompare,allocator<LegoPathCtrlEdge *> >::_Insert
// TEMPLATE: LEGO1 0x100474e0
// _Tree<LegoPathCtrlEdge *,LegoPathCtrlEdge *,set<LegoPathCtrlEdge *,LegoPathCtrlEdgeCompare,allocator<LegoPathCtrlEdge *> >::_Kfn,LegoPathCtrlEdgeCompare,allocator<LegoPathCtrlEdge *> >::iterator::_Dec
// TEMPLATE: LEGO1 0x10047530
// _Tree<LegoPathCtrlEdge *,LegoPathCtrlEdge *,set<LegoPathCtrlEdge *,LegoPathCtrlEdgeCompare,allocator<LegoPathCtrlEdge *> >::_Kfn,LegoPathCtrlEdgeCompare,allocator<LegoPathCtrlEdge *> >::_Buynode
// TEMPLATE: LEGO1 0x100477d0
// _Tree<LegoPathCtrlEdge *,LegoPathCtrlEdge *,set<LegoPathCtrlEdge *,LegoPathCtrlEdgeCompare,allocator<LegoPathCtrlEdge *> >::_Kfn,LegoPathCtrlEdgeCompare,allocator<LegoPathCtrlEdge *> >::_Lrotate
// TEMPLATE: LEGO1 0x10047830
// _Tree<LegoPathCtrlEdge *,LegoPathCtrlEdge *,set<LegoPathCtrlEdge *,LegoPathCtrlEdgeCompare,allocator<LegoPathCtrlEdge *> >::_Kfn,LegoPathCtrlEdgeCompare,allocator<LegoPathCtrlEdge *> >::_Rrotate
// SYNTHETIC: LEGO1 0x10047940
// LegoPathCtrlEdge::`vector deleting destructor'
// SYNTHETIC: LEGO1 0x100479d0
// LegoPathCtrlEdge::LegoPathCtrlEdge
// SYNTHETIC: LEGO1 0x10047a30
// LegoPathCtrlEdge::~LegoPathCtrlEdge
// SYNTHETIC: LEGO1 0x10047ae0
// LegoUnknown100db7f4::~LegoUnknown100db7f4
// TEMPLATE: LEGO1 0x1004a780
// _Construct
// GLOBAL: LEGO1 0x100f4360
// _Tree<unsigned char *,unsigned char *,set<unsigned char *,LegoPathControllerComparator,allocator<unsigned char *> >::_Kfn,LegoPathControllerComparator,allocator<unsigned char *> >::_Nil
// _Tree<LegoPathCtrlEdge *,LegoPathCtrlEdge *,set<LegoPathCtrlEdge *,LegoPathCtrlEdgeCompare,allocator<LegoPathCtrlEdge *> >::_Kfn,LegoPathCtrlEdgeCompare,allocator<LegoPathCtrlEdge *> >::_Nil
// clang-format on
#endif // LEGOPATHCONTROLLER_H

View File

@@ -0,0 +1,50 @@
#ifndef LEGOPATHSTRUCT_H
#define LEGOPATHSTRUCT_H
#include "decomp.h"
#include "mxatom.h"
#include "mxtypes.h"
// VTABLE: LEGO1 0x100d7d9c
// SIZE 0x0c
class LegoPathStructBase {
public:
LegoPathStructBase() : m_unk0x04(NULL), m_unk0x08(0) {}
// FUNCTION: LEGO1 0x10047420
virtual ~LegoPathStructBase()
{
if (m_unk0x04 != NULL) {
delete m_unk0x04;
}
}
private:
undefined* m_unk0x04; // 0x04
undefined4 m_unk0x08; // 0x08
};
// VTABLE: LEGO1 0x100d7da0
// SIZE 0x14
class LegoPathStruct : public LegoPathStructBase {
public:
// FUNCTION: LEGO1 0x100473a0
LegoPathStruct() : m_unk0x0c(0) {}
// FUNCTION: LEGO1 0x10047470
~LegoPathStruct() override {}
void VTable0x04(undefined4, undefined4, undefined4); // vtable+0x04
private:
undefined4 m_unk0x0c; // 0x0c
MxAtomId m_atomId; // 0x10
};
// SYNTHETIC: LEGO1 0x10047440
// LegoPathStructBase::`scalar deleting destructor'
// SYNTHETIC: LEGO1 0x10047890
// LegoPathStruct::`vector deleting destructor'
#endif // LEGOPATHSTRUCT_H