mirror of
https://github.com/isledecomp/isle.git
synced 2024-11-23 05:19:47 +00:00
Implement LegoRaceCar::FUN_10012ff0()
, refactoring (#1063)
* Implement `LegoRaceCar::FUN_10012ff0()`, refactor based on BETA10 * Add BETA10 annotations * Rename functions and variables based on BETA10 assertions * Address issues raised by linter * Rename variable, add BETA10 vtables * Rename legoracecar files to legoracers --------- Co-authored-by: jonschz <jonschz@users.noreply.github.com>
This commit is contained in:
parent
a75ace8a53
commit
afa5b90117
@ -373,7 +373,7 @@ add_library(lego1 SHARED
|
||||
LEGO1/lego/legoomni/src/race/jetskirace.cpp
|
||||
LEGO1/lego/legoomni/src/race/legorace.cpp
|
||||
LEGO1/lego/legoomni/src/race/legoraceactor.cpp
|
||||
LEGO1/lego/legoomni/src/race/legoracecar.cpp
|
||||
LEGO1/lego/legoomni/src/race/legoracers.cpp
|
||||
LEGO1/lego/legoomni/src/race/legoracemap.cpp
|
||||
LEGO1/lego/legoomni/src/race/raceskel.cpp
|
||||
LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp
|
||||
|
@ -15,6 +15,10 @@ struct LegoAnimActorStruct {
|
||||
|
||||
float GetUnknown0x00() { return m_unk0x00; }
|
||||
|
||||
// FUNCTION: BETA10 0x10012210
|
||||
LegoAnim* GetAnimTreePtr() { return m_AnimTreePtr; }
|
||||
|
||||
// TODO: Possibly private
|
||||
float m_unk0x00; // 0x00
|
||||
LegoAnim* m_AnimTreePtr; // 0x04
|
||||
LegoROI** m_roiMap; // 0x08
|
||||
|
@ -1,5 +1,5 @@
|
||||
#ifndef LEGORACECAR_H
|
||||
#define LEGORACECAR_H
|
||||
#ifndef LEGORACERS_H
|
||||
#define LEGORACERS_H
|
||||
|
||||
#include "legocarraceactor.h"
|
||||
#include "legoracemap.h"
|
||||
@ -15,6 +15,11 @@ struct EdgeReference {
|
||||
// VTABLE: LEGO1 0x100d58b8 LegoPathActor
|
||||
// VTABLE: LEGO1 0x100d5984 LegoRaceMap
|
||||
// VTABLE: LEGO1 0x100d5988 LegoCarRaceActor
|
||||
// VTABLE: BETA10 0x101be6ec LegoRaceActor
|
||||
// VTABLE: BETA10 0x101be6f0 LegoAnimActor
|
||||
// VTABLE: BETA10 0x101be708 LegoPathActor
|
||||
// VTABLE: BETA10 0x101be7f8 LegoRaceMap
|
||||
// VTABLE: BETA10 0x101be800 LegoCarRaceActor
|
||||
// SIZE 0x200
|
||||
class LegoRaceCar : public LegoCarRaceActor, public LegoRaceMap {
|
||||
public:
|
||||
@ -60,8 +65,8 @@ public:
|
||||
// LegoRaceCar::`scalar deleting destructor'
|
||||
|
||||
private:
|
||||
undefined m_unk0x54; // 0x54
|
||||
undefined4 m_unk0x58; // 0x58
|
||||
undefined m_userState; // 0x54
|
||||
float m_unk0x58; // 0x58
|
||||
Mx3DPointFloat m_unk0x5c; // 0x5c
|
||||
LegoAnimActorStruct* m_unk0x70; // 0x70
|
||||
LegoAnimActorStruct* m_unk0x74; // 0x74
|
||||
@ -72,4 +77,4 @@ private:
|
||||
static const EdgeReference* g_pEdgeReferences;
|
||||
};
|
||||
|
||||
#endif // LEGORACECAR_H
|
||||
#endif // LEGORACERS_H
|
@ -97,7 +97,9 @@ public:
|
||||
MxCore* Find(const char* p_class, const char* p_name);
|
||||
MxCore* Find(const MxAtomId& p_atom, MxS32 p_entityId);
|
||||
|
||||
// FUNCTION: BETA10 0x1002b4f0
|
||||
LegoCameraController* GetCamera() { return m_cameraController; }
|
||||
|
||||
LegoEntityList* GetEntityList() { return m_entityList; }
|
||||
MxS32 GetWorldId() { return m_worldId; }
|
||||
MxBool GetUnknown0xd0Empty() { return m_set0xd0.empty(); }
|
||||
|
@ -1220,7 +1220,7 @@ void LegoAnimationManager::FUN_10061010(MxBool p_und)
|
||||
|
||||
if (tranInfo->m_presenter->GetPresenter() != NULL &&
|
||||
(anim = tranInfo->m_presenter->GetPresenter()->GetAnimation()) != NULL &&
|
||||
anim->GetScene() != NULL) {
|
||||
anim->GetCamAnim() != NULL) {
|
||||
if (flags & LegoTranInfo::c_bit2) {
|
||||
BackgroundAudioManager()->RaiseVolume();
|
||||
tranInfo->m_flags &= ~LegoTranInfo::c_bit2;
|
||||
|
@ -57,7 +57,7 @@
|
||||
#include "legopathactor.h"
|
||||
#include "legopathpresenter.h"
|
||||
#include "legophonemepresenter.h"
|
||||
#include "legoracecar.h"
|
||||
#include "legoracers.h"
|
||||
#include "legotexturepresenter.h"
|
||||
#include "legoworld.h"
|
||||
#include "legoworldpresenter.h"
|
||||
|
@ -73,8 +73,10 @@ LegoPathActor* UserActor()
|
||||
}
|
||||
|
||||
// FUNCTION: LEGO1 0x100157a0
|
||||
// FUNCTION: BETA10 0x100e4a46
|
||||
LegoWorld* CurrentWorld()
|
||||
{
|
||||
assert(LegoOmni::GetInstance());
|
||||
return LegoOmni::GetInstance()->GetCurrentWorld();
|
||||
}
|
||||
|
||||
|
@ -140,6 +140,7 @@ void LegoCameraController::FUN_10012320(float p_angle)
|
||||
}
|
||||
|
||||
// FUNCTION: LEGO1 0x100123e0
|
||||
// FUNCTION: BETA10 0x10068cb2
|
||||
void LegoCameraController::FUN_100123e0(const Matrix4& p_transform, MxU32 p_und)
|
||||
{
|
||||
if (m_lego3DView != NULL) {
|
||||
|
@ -29,8 +29,10 @@ LegoAnimActorStruct::~LegoAnimActorStruct()
|
||||
}
|
||||
|
||||
// FUNCTION: LEGO1 0x1001c130
|
||||
// FUNCTION: BETA10 0x1003df5f
|
||||
float LegoAnimActorStruct::GetDuration()
|
||||
{
|
||||
assert(m_AnimTreePtr);
|
||||
return m_AnimTreePtr->GetDuration();
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,8 @@
|
||||
#include "legoracecar.h"
|
||||
#include "legoracers.h"
|
||||
|
||||
#include "anim/legoanim.h"
|
||||
#include "define.h"
|
||||
#include "legocameracontroller.h"
|
||||
#include "legorace.h"
|
||||
#include "misc.h"
|
||||
#include "mxmisc.h"
|
||||
@ -44,7 +46,7 @@ const EdgeReference* LegoRaceCar::g_pEdgeReferences = g_edgeReferences;
|
||||
// FUNCTION: LEGO1 0x10012950
|
||||
LegoRaceCar::LegoRaceCar()
|
||||
{
|
||||
m_unk0x54 = 0;
|
||||
m_userState = 0;
|
||||
m_unk0x70 = 0;
|
||||
m_unk0x74 = 0;
|
||||
m_unk0x5c.Clear();
|
||||
@ -131,10 +133,60 @@ void LegoRaceCar::ParseAction(char* p_extra)
|
||||
}
|
||||
}
|
||||
|
||||
// STUB: LEGO1 0x10012ff0
|
||||
void LegoRaceCar::FUN_10012ff0(float)
|
||||
// FUNCTION: LEGO1 0x10012ff0
|
||||
// FUNCTION: BETA10 0x100cb60e
|
||||
void LegoRaceCar::FUN_10012ff0(float p_param)
|
||||
{
|
||||
// TODO
|
||||
LegoAnimActorStruct* a; // called `a` in BETA10
|
||||
float deltaTime;
|
||||
|
||||
if (m_userState == 2) {
|
||||
a = m_unk0x70;
|
||||
}
|
||||
else {
|
||||
// TODO: Possibly an enum?
|
||||
const char legoracecarKick2 = 4; // original name: LEGORACECAR_KICK2
|
||||
assert(m_userState == legoracecarKick2);
|
||||
a = m_unk0x74;
|
||||
}
|
||||
|
||||
assert(a && a->GetAnimTreePtr() && a->GetAnimTreePtr()->GetCamAnim());
|
||||
|
||||
if (a->GetAnimTreePtr()) {
|
||||
deltaTime = p_param - m_unk0x58;
|
||||
|
||||
if (a->GetDuration() <= deltaTime || deltaTime < 0.0) {
|
||||
if (m_userState == 2) {
|
||||
LegoEdge** edges = m_unk0x78->GetEdges();
|
||||
m_destEdge = (LegoUnknown100db7f4*) (edges[2]);
|
||||
m_boundary = m_unk0x78;
|
||||
}
|
||||
else {
|
||||
LegoEdge** edges = m_unk0x78->GetEdges();
|
||||
m_destEdge = (LegoUnknown100db7f4*) (edges[1]);
|
||||
m_boundary = m_unk0x7c;
|
||||
}
|
||||
|
||||
m_userState = 0;
|
||||
}
|
||||
else if (a->GetAnimTreePtr()->GetCamAnim()) {
|
||||
MxMatrix transformationMatrix;
|
||||
|
||||
LegoWorld* r = CurrentWorld(); // called `r` in BETA10
|
||||
assert(r);
|
||||
|
||||
transformationMatrix.SetIdentity();
|
||||
|
||||
// Possible bug in the original code: The first argument is not initialized
|
||||
a->GetAnimTreePtr()->GetCamAnim()->FUN_1009f490(deltaTime, transformationMatrix);
|
||||
|
||||
if (r->GetCamera()) {
|
||||
r->GetCamera()->FUN_100123e0(transformationMatrix, 0);
|
||||
}
|
||||
|
||||
m_roi->FUN_100a58f0(transformationMatrix);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// STUB: LEGO1 0x10013130
|
@ -922,9 +922,9 @@ void LegoAnimPresenter::FUN_1006b9a0(LegoAnim* p_anim, MxLong p_time, Matrix4* p
|
||||
}
|
||||
}
|
||||
|
||||
if (p_anim->GetScene() != NULL) {
|
||||
if (p_anim->GetCamAnim() != NULL) {
|
||||
MxMatrix transform(mat);
|
||||
p_anim->GetScene()->FUN_1009f490(p_time, transform);
|
||||
p_anim->GetCamAnim()->FUN_1009f490(p_time, transform);
|
||||
|
||||
if (m_currentWorld != NULL && m_currentWorld->GetCamera() != NULL) {
|
||||
m_currentWorld->GetCamera()->FUN_100123e0(transform, 0);
|
||||
|
@ -785,7 +785,7 @@ LegoAnim::LegoAnim()
|
||||
m_duration = 0;
|
||||
m_actors = NULL;
|
||||
m_numActors = 0;
|
||||
m_scene = NULL;
|
||||
m_camAnim = NULL;
|
||||
}
|
||||
|
||||
// FUNCTION: LEGO1 0x100a0bc0
|
||||
@ -799,8 +799,8 @@ LegoAnim::~LegoAnim()
|
||||
delete[] m_actors;
|
||||
}
|
||||
|
||||
if (m_scene != NULL) {
|
||||
delete m_scene;
|
||||
if (m_camAnim != NULL) {
|
||||
delete m_camAnim;
|
||||
}
|
||||
}
|
||||
|
||||
@ -845,9 +845,9 @@ LegoResult LegoAnim::Read(LegoStorage* p_storage, LegoS32 p_parseScene)
|
||||
}
|
||||
|
||||
if (p_parseScene) {
|
||||
m_scene = new LegoAnimScene();
|
||||
m_camAnim = new LegoAnimScene();
|
||||
|
||||
result = m_scene->Read(p_storage);
|
||||
result = m_camAnim->Read(p_storage);
|
||||
|
||||
if (result != SUCCESS) {
|
||||
goto done;
|
||||
|
@ -208,6 +208,7 @@ struct LegoAnimActorEntry {
|
||||
undefined4 m_unk0x04; // 0x04
|
||||
};
|
||||
|
||||
// TODO: Possibly called `LegoCameraAnim(ation)`?
|
||||
// SIZE 0x24
|
||||
class LegoAnimScene {
|
||||
public:
|
||||
@ -242,7 +243,10 @@ class LegoAnim : public LegoTree {
|
||||
public:
|
||||
LegoAnim();
|
||||
~LegoAnim() override;
|
||||
|
||||
// FUNCTION: BETA10 0x100284c0
|
||||
LegoTime GetDuration() { return m_duration; }
|
||||
|
||||
LegoU32 GetNumActors() { return m_numActors; }
|
||||
LegoResult Write(LegoStorage* p_storage) override; // vtable+0x08
|
||||
virtual LegoResult Read(LegoStorage* p_storage, LegoS32 p_parseScene); // vtable+0x10
|
||||
@ -250,7 +254,8 @@ public:
|
||||
const LegoChar* GetActorName(LegoU32 p_index);
|
||||
undefined4 GetActorUnknown0x04(LegoU32 p_index);
|
||||
|
||||
LegoAnimScene* GetScene() { return m_scene; }
|
||||
// FUNCTION: BETA10 0x1005abf0
|
||||
LegoAnimScene* GetCamAnim() { return m_camAnim; }
|
||||
|
||||
// SYNTHETIC: LEGO1 0x100a0ba0
|
||||
// LegoAnim::`scalar deleting destructor'
|
||||
@ -259,7 +264,7 @@ protected:
|
||||
LegoTime m_duration; // 0x08
|
||||
LegoAnimActorEntry* m_actors; // 0x0c
|
||||
LegoU32 m_numActors; // 0x10
|
||||
LegoAnimScene* m_scene; // 0x14
|
||||
LegoAnimScene* m_camAnim; // 0x14
|
||||
|
||||
// FUNCTION: LEGO1 0x100a1040
|
||||
LegoTreeNodeData* CreateData() override { return new LegoAnimNodeData(); } // vtable+0x0c
|
||||
|
@ -16,7 +16,10 @@ public:
|
||||
virtual LegoResult VTable0x04(); // vtable+0x04
|
||||
|
||||
LegoU8 GetNumEdges() { return m_numEdges; }
|
||||
|
||||
// FUNCTION: BETA10 0x1001cc30
|
||||
LegoEdge** GetEdges() { return m_edges; }
|
||||
|
||||
LegoU32 IsEqual(LegoWEEdge& p_other) { return this == &p_other; }
|
||||
|
||||
void SetEdges(LegoEdge** p_edges, LegoU8 p_numEdges)
|
||||
|
@ -4,6 +4,7 @@
|
||||
#include "realtime/matrix.h"
|
||||
|
||||
// VTABLE: LEGO1 0x100d4300
|
||||
// VTABLE: BETA10 0x101b82e0
|
||||
// SIZE 0x48
|
||||
class MxMatrix : public Matrix4 {
|
||||
public:
|
||||
|
@ -13,6 +13,7 @@ struct UnknownMatrixType {
|
||||
// The class needs to undergo a very careful refactoring to fix that (no matches should break).
|
||||
|
||||
// VTABLE: LEGO1 0x100d4350
|
||||
// VTABLE: BETA10 0x101b8340
|
||||
// SIZE 0x08
|
||||
class Matrix4 {
|
||||
public:
|
||||
|
@ -98,6 +98,7 @@ void OrientableROI::GetLocalTransform(Matrix4& p_transform)
|
||||
}
|
||||
|
||||
// FUNCTION: LEGO1 0x100a58f0
|
||||
// FUNCTION: BETA10 0x10167b77
|
||||
void OrientableROI::FUN_100a58f0(const Matrix4& p_transform)
|
||||
{
|
||||
m_local2world = p_transform;
|
||||
|
@ -47,6 +47,7 @@ public:
|
||||
|
||||
void SetParentROI(OrientableROI* p_parentROI) { m_parentROI = p_parentROI; }
|
||||
|
||||
// FUNCTION: BETA10 0x10168800
|
||||
void ToggleUnknown0xd8(BOOL p_enable)
|
||||
{
|
||||
if (p_enable) {
|
||||
|
Loading…
Reference in New Issue
Block a user