Merge remote-tracking branch 'isle/master'

This commit is contained in:
Christian Semmler 2025-06-20 16:26:57 -07:00
commit a336a817a2
No known key found for this signature in database
GPG Key ID: 086DAA1360BEEE5C
21 changed files with 298 additions and 277 deletions

View File

@ -103,12 +103,17 @@ protected:
LegoChar* FUN_10069150(const LegoChar* p_und1); LegoChar* FUN_10069150(const LegoChar* p_und1);
void FUN_100692b0(); void FUN_100692b0();
void FUN_100695c0(); void FUN_100695c0();
LegoChar* FUN_100697c0(const LegoChar* p_und1, const LegoChar* p_und2); LegoChar* GetVariableOrIdentity(const LegoChar* p_varName, const LegoChar* p_prefix);
LegoBool FUN_100698b0(const CompoundObject& p_rois, const LegoChar* p_und2); LegoBool FUN_100698b0(const CompoundObject& p_rois, const LegoChar* p_und2);
LegoROI* FUN_100699e0(const LegoChar* p_und); LegoROI* FindROI(const LegoChar* p_name);
void FUN_10069b10(); void FUN_10069b10();
void FUN_1006a3c0(LegoAnimStructMap& p_map, LegoTreeNode* p_node, LegoROI* p_roi); void UpdateStructMapAndROIIndex(LegoAnimStructMap& p_map, LegoTreeNode* p_node, LegoROI* p_roi);
void FUN_1006a4f0(LegoAnimStructMap& p_map, LegoAnimNodeData* p_data, const LegoChar* p_und, LegoROI* p_roi); void UpdateStructMapAndROIIndexForNode(
LegoAnimStructMap& p_map,
LegoAnimNodeData* p_data,
const LegoChar* p_und,
LegoROI* p_roi
);
void FUN_1006aa60(); void FUN_1006aa60();
void FUN_1006ab70(); void FUN_1006ab70();
LegoBool FUN_1006aba0(); LegoBool FUN_1006aba0();
@ -121,8 +126,8 @@ protected:
LegoAnim* m_anim; // 0x64 LegoAnim* m_anim; // 0x64
LegoROI** m_roiMap; // 0x68 LegoROI** m_roiMap; // 0x68
MxU32 m_roiMapSize; // 0x6c MxU32 m_roiMapSize; // 0x6c
LegoROIList* m_unk0x70; // 0x70 LegoROIList* m_sceneROIs; // 0x70
LegoROIList* m_unk0x74; // 0x74 LegoROIList* m_managedActors; // 0x74
Matrix4* m_unk0x78; // 0x78 Matrix4* m_unk0x78; // 0x78
MxU32 m_flags; // 0x7c MxU32 m_flags; // 0x7c
LegoWorld* m_currentWorld; // 0x80 LegoWorld* m_currentWorld; // 0x80

View File

@ -127,10 +127,10 @@ public:
MxResult Serialize(LegoStorage* p_storage) override; // vtable+0x1c MxResult Serialize(LegoStorage* p_storage) override; // vtable+0x1c
// FUNCTION: BETA10 0x100ef470 // FUNCTION: BETA10 0x100ef470
void SetUnknown0xb0(MxU32 p_unk0xb0) { m_unk0xb0 = p_unk0xb0; } void SetPlayedAction(MxU32 p_playedAction) { m_playedAction = p_playedAction; }
// FUNCTION: BETA10 0x100ef850 // FUNCTION: BETA10 0x100ef850
MxU32 GetUnknown0xb0() { return m_unk0xb0; } MxU32 GetPlayedAction() { return m_playedAction; }
// FUNCTION: BETA10 0x10088850 // FUNCTION: BETA10 0x10088850
MxS16 GetHighScore(MxU8 p_actorId) { return GetMission(p_actorId)->m_hiScore; } MxS16 GetHighScore(MxU8 p_actorId) { return GetMission(p_actorId)->m_hiScore; }
@ -139,12 +139,12 @@ public:
// PizzaMissionState::`scalar deleting destructor' // PizzaMissionState::`scalar deleting destructor'
Mission* GetMission(MxU8 p_actorId); Mission* GetMission(MxU8 p_actorId);
MxS16 FUN_10039540(); MxS16 GetActorState();
PizzeriaState* m_pizzeriaState; // 0x08 PizzeriaState* m_pizzeriaState; // 0x08
undefined4 m_unk0x0c; // 0x0c undefined4 m_unk0x0c; // 0x0c
Mission m_missions[5]; // 0x10 Mission m_missions[5]; // 0x10
MxU32 m_unk0xb0; // 0xb0 MxU32 m_playedAction; // 0xb0
static IsleScript::Script g_pepperActions[]; static IsleScript::Script g_pepperActions[];
static IsleScript::Script g_mamaActions[]; static IsleScript::Script g_mamaActions[];
@ -204,9 +204,9 @@ private:
PizzaMissionState::Mission* m_mission; // 0x80 PizzaMissionState::Mission* m_mission; // 0x80
SkateBoard* m_skateBoard; // 0x84 SkateBoard* m_skateBoard; // 0x84
Act1State* m_act1state; // 0x88 Act1State* m_act1state; // 0x88
IsleScript::Script m_unk0x8c; // 0x8c IsleScript::Script m_speechAction; // 0x8c
MxLong m_unk0x90; // 0x90 MxLong m_startTime; // 0x90
MxLong m_unk0x94; // 0x94 MxLong m_duration; // 0x94
MxBool m_unk0x98; // 0x98 MxBool m_unk0x98; // 0x98
}; };

View File

@ -34,11 +34,11 @@ public:
// SYNTHETIC: LEGO1 0x10017ce0 // SYNTHETIC: LEGO1 0x10017ce0
// PizzeriaState::`scalar deleting destructor' // PizzeriaState::`scalar deleting destructor'
MxS16 FUN_10017d50(); MxS16 GetActorState();
MxU32 NextAction(); MxU32 NextAction();
Playlist m_unk0x08[5]; // 0x08 Playlist m_playerPlaylists[5]; // 0x08
MxS32 m_unk0x44[5]; // 0x44 MxS32 m_states[5]; // 0x44
static IsleScript::Script g_pepperActions[]; static IsleScript::Script g_pepperActions[];
static IsleScript::Script g_mamaActions[]; static IsleScript::Script g_mamaActions[];

View File

@ -39,14 +39,14 @@ public:
void SetActive(MxBool p_active) { m_active = p_active; } void SetActive(MxBool p_active) { m_active = p_active; }
undefined4 FUN_1002d090(); MxU32 NextPlaylistObjectId();
MxBool FUN_1002d0c0(const MxAtomId& p_atom, MxU32 p_objectId); MxBool IsRadioObjectId(const MxAtomId& p_atom, MxU32 p_objectId);
// TODO: Most likely getters/setters are not used according to BETA. // TODO: Most likely getters/setters are not used according to BETA.
Playlist m_unk0x08[3]; // 0x08 Playlist m_playlists[3]; // 0x08
MxS16 m_unk0x2c; // 0x2c MxS16 m_activePlaylist; // 0x2c
MxBool m_active; // 0x2e MxBool m_active; // 0x2e
}; };
// VTABLE: LEGO1 0x100d6d10 // VTABLE: LEGO1 0x100d6d10
@ -85,7 +85,7 @@ public:
private: private:
RadioState* m_state; // 0x08 RadioState* m_state; // 0x08
MxBool m_unk0x0c; // 0x0c MxBool m_enabled; // 0x0c
MxBool m_audioEnabled; // 0x0d MxBool m_audioEnabled; // 0x0d
MxLong HandleEndAction(MxEndActionNotificationParam& p_param); MxLong HandleEndAction(MxEndActionNotificationParam& p_param);

View File

@ -136,9 +136,9 @@ Pizza::Pizza()
m_mission = NULL; m_mission = NULL;
m_skateBoard = NULL; m_skateBoard = NULL;
m_act1state = NULL; m_act1state = NULL;
m_unk0x8c = IsleScript::c_noneIsle; m_speechAction = IsleScript::c_noneIsle;
m_unk0x98 = FALSE; m_unk0x98 = FALSE;
m_unk0x90 = INT_MIN; m_startTime = INT_MIN;
} }
// FUNCTION: LEGO1 0x10038100 // FUNCTION: LEGO1 0x10038100
@ -188,7 +188,7 @@ void Pizza::FUN_10038220(IsleScript::Script p_objectId)
AnimationManager()->EnableCamAnims(FALSE); AnimationManager()->EnableCamAnims(FALSE);
AnimationManager()->FUN_1005f6d0(FALSE); AnimationManager()->FUN_1005f6d0(FALSE);
PlayAction(p_objectId, FALSE); PlayAction(p_objectId, FALSE);
m_unk0x8c = IsleScript::c_noneIsle; m_speechAction = IsleScript::c_noneIsle;
} }
// FUNCTION: LEGO1 0x100382b0 // FUNCTION: LEGO1 0x100382b0
@ -196,8 +196,8 @@ void Pizza::FUN_10038220(IsleScript::Script p_objectId)
void Pizza::FUN_100382b0() void Pizza::FUN_100382b0()
{ {
if (m_state->m_unk0x0c != 8) { if (m_state->m_unk0x0c != 8) {
if (m_unk0x8c != IsleScript::c_noneIsle) { if (m_speechAction != IsleScript::c_noneIsle) {
InvokeAction(Extra::e_stop, *g_isleScript, m_unk0x8c, NULL); InvokeAction(Extra::e_stop, *g_isleScript, m_speechAction, NULL);
} }
m_act1state->m_unk0x018 = 0; m_act1state->m_unk0x018 = 0;
@ -209,10 +209,10 @@ void Pizza::FUN_100382b0()
m_mission->m_startTime = INT_MIN; m_mission->m_startTime = INT_MIN;
m_mission = NULL; m_mission = NULL;
m_unk0x98 = FALSE; m_unk0x98 = FALSE;
m_unk0x8c = IsleScript::c_noneIsle; m_speechAction = IsleScript::c_noneIsle;
BackgroundAudioManager()->RaiseVolume(); BackgroundAudioManager()->RaiseVolume();
TickleManager()->UnregisterClient(this); TickleManager()->UnregisterClient(this);
m_unk0x90 = INT_MIN; m_startTime = INT_MIN;
m_skateBoard->EnableScenePresentation(FALSE); m_skateBoard->EnableScenePresentation(FALSE);
m_skateBoard->SetPizzaVisible(FALSE); m_skateBoard->SetPizzaVisible(FALSE);
MxTrace("Pizza mission: idle\n"); MxTrace("Pizza mission: idle\n");
@ -254,7 +254,7 @@ MxLong Pizza::HandleClick()
IsleScript::Script action; IsleScript::Script action;
switch (m_state->FUN_10039540()) { switch (m_state->GetActorState()) {
case 0: case 0:
action = m_mission->m_actions[m_mission->m_numActions + 3]; action = m_mission->m_actions[m_mission->m_numActions + 3];
break; break;
@ -284,7 +284,7 @@ MxLong Pizza::HandlePathStruct(LegoPathStructNotificationParam& p_param)
if (p_param.GetTrigger() == LegoPathStruct::c_s && p_param.GetData() == 0x12e && if (p_param.GetTrigger() == LegoPathStruct::c_s && p_param.GetData() == 0x12e &&
GameState()->GetActorId() == LegoActor::c_pepper) { GameState()->GetActorId() == LegoActor::c_pepper) {
m_state->m_unk0x0c = 5; m_state->m_unk0x0c = 5;
m_state->SetUnknown0xb0(SndanimScript::c_TRS302_OpenJailDoor); m_state->SetPlayedAction(SndanimScript::c_TRS302_OpenJailDoor);
if (time < m_mission->GetRedFinishTime()) { if (time < m_mission->GetRedFinishTime()) {
m_mission->UpdateScore(LegoState::e_red); m_mission->UpdateScore(LegoState::e_red);
@ -325,26 +325,26 @@ MxLong Pizza::HandlePathStruct(LegoPathStructNotificationParam& p_param)
case IsleScript::c_pps025ni_RunAnim: case IsleScript::c_pps025ni_RunAnim:
case IsleScript::c_pps026ni_RunAnim: case IsleScript::c_pps026ni_RunAnim:
case IsleScript::c_pps027ni_RunAnim: case IsleScript::c_pps027ni_RunAnim:
m_unk0x90 = Timer()->GetTime(); m_startTime = Timer()->GetTime();
m_unk0x94 = 3800; m_duration = 3800;
break; break;
case IsleScript::c_pgs050nu_RunAnim: case IsleScript::c_pgs050nu_RunAnim:
case IsleScript::c_pgs051nu_RunAnim: case IsleScript::c_pgs051nu_RunAnim:
case IsleScript::c_pgs052nu_RunAnim: case IsleScript::c_pgs052nu_RunAnim:
m_unk0x90 = Timer()->GetTime(); m_startTime = Timer()->GetTime();
m_unk0x94 = 6400; m_duration = 6400;
break; break;
case IsleScript::c_prt072sl_RunAnim: case IsleScript::c_prt072sl_RunAnim:
case IsleScript::c_prt073sl_RunAnim: case IsleScript::c_prt073sl_RunAnim:
case IsleScript::c_prt074sl_RunAnim: case IsleScript::c_prt074sl_RunAnim:
m_unk0x90 = Timer()->GetTime(); m_startTime = Timer()->GetTime();
m_unk0x94 = 7000; m_duration = 7000;
break; break;
case IsleScript::c_pho104re_RunAnim: case IsleScript::c_pho104re_RunAnim:
case IsleScript::c_pho105re_RunAnim: case IsleScript::c_pho105re_RunAnim:
case IsleScript::c_pho106re_RunAnim: case IsleScript::c_pho106re_RunAnim:
m_unk0x90 = Timer()->GetTime(); m_startTime = Timer()->GetTime();
m_unk0x94 = 6500; m_duration = 6500;
break; break;
} }
@ -376,8 +376,8 @@ MxResult Pizza::Tickle()
{ {
MxLong time = Timer()->GetTime(); MxLong time = Timer()->GetTime();
if (m_unk0x90 != INT_MIN && m_unk0x94 + m_unk0x90 <= time) { if (m_startTime != INT_MIN && m_duration + m_startTime <= time) {
m_unk0x90 = INT_MIN; m_startTime = INT_MIN;
m_skateBoard->EnableScenePresentation(FALSE); m_skateBoard->EnableScenePresentation(FALSE);
m_skateBoard->SetPizzaVisible(FALSE); m_skateBoard->SetPizzaVisible(FALSE);
TickleManager()->UnregisterClient(this); TickleManager()->UnregisterClient(this);
@ -395,29 +395,29 @@ MxResult Pizza::Tickle()
InvokeAction(Extra::e_start, *g_isleScript, IsleScript::c_Avo917In_PlayWav, NULL); InvokeAction(Extra::e_start, *g_isleScript, IsleScript::c_Avo917In_PlayWav, NULL);
MxTrace("Pizza mission: timeout, stop\n"); MxTrace("Pizza mission: timeout, stop\n");
} }
else if (time >= m_mission->m_startTime + 35000 && m_unk0x8c == IsleScript::c_noneIsle) { else if (time >= m_mission->m_startTime + 35000 && m_speechAction == IsleScript::c_noneIsle) {
switch (GameState()->GetActorId()) { switch (GameState()->GetActorId()) {
case LegoActor::c_pepper: case LegoActor::c_pepper:
m_unk0x8c = IsleScript::c_Avo914In_PlayWav; m_speechAction = IsleScript::c_Avo914In_PlayWav;
break; break;
case LegoActor::c_mama: case LegoActor::c_mama:
m_unk0x8c = IsleScript::c_Avo910In_PlayWav; m_speechAction = IsleScript::c_Avo910In_PlayWav;
break; break;
case LegoActor::c_papa: case LegoActor::c_papa:
m_unk0x8c = IsleScript::c_Avo912In_PlayWav; m_speechAction = IsleScript::c_Avo912In_PlayWav;
break; break;
case LegoActor::c_nick: case LegoActor::c_nick:
m_unk0x8c = IsleScript::c_Avo911In_PlayWav; m_speechAction = IsleScript::c_Avo911In_PlayWav;
break; break;
case LegoActor::c_laura: case LegoActor::c_laura:
m_unk0x8c = IsleScript::c_Avo913In_PlayWav; m_speechAction = IsleScript::c_Avo913In_PlayWav;
break; break;
} }
BackgroundAudioManager()->LowerVolume(); BackgroundAudioManager()->LowerVolume();
if (m_unk0x8c != IsleScript::c_noneIsle) { if (m_speechAction != IsleScript::c_noneIsle) {
InvokeAction(Extra::e_start, *g_isleScript, m_unk0x8c, NULL); InvokeAction(Extra::e_start, *g_isleScript, m_speechAction, NULL);
} }
} }
} }
@ -447,14 +447,14 @@ MxLong Pizza::HandleEndAction(MxEndActionNotificationParam& p_param)
MxLong result = 0; MxLong result = 0;
MxU32 objectId = p_param.GetAction()->GetObjectId(); MxU32 objectId = p_param.GetAction()->GetObjectId();
if (m_unk0x8c == objectId) { if (m_speechAction == objectId) {
BackgroundAudioManager()->RaiseVolume(); BackgroundAudioManager()->RaiseVolume();
return 1; return 1;
} }
switch (m_state->m_unk0x0c) { switch (m_state->m_unk0x0c) {
case 1: case 1:
if (m_state->GetUnknown0xb0() == objectId) { if (m_state->GetPlayedAction() == objectId) {
m_state->m_unk0x0c = 2; m_state->m_unk0x0c = 2;
m_mission->m_startTime = Timer()->GetTime(); m_mission->m_startTime = Timer()->GetTime();
TickleManager()->RegisterClient(this, 200); TickleManager()->RegisterClient(this, 200);
@ -462,7 +462,7 @@ MxLong Pizza::HandleEndAction(MxEndActionNotificationParam& p_param)
} }
break; break;
case 3: case 3:
if (m_state->GetUnknown0xb0() == objectId) { if (m_state->GetPlayedAction() == objectId) {
m_mission->m_startTime = Timer()->GetTime(); m_mission->m_startTime = Timer()->GetTime();
PizzaMissionState::Mission* mission = m_mission; PizzaMissionState::Mission* mission = m_mission;
@ -471,7 +471,7 @@ MxLong Pizza::HandleEndAction(MxEndActionNotificationParam& p_param)
} }
m_state->m_unk0x0c = 4; m_state->m_unk0x0c = 4;
m_state->SetUnknown0xb0(IsleScript::c_noneIsle); m_state->SetPlayedAction(IsleScript::c_noneIsle);
UserActor()->SetActorState(LegoPathActor::c_initial); UserActor()->SetActorState(LegoPathActor::c_initial);
m_skateBoard->SetPizzaVisible(TRUE); m_skateBoard->SetPizzaVisible(TRUE);
m_world->PlaceActor(m_skateBoard, "int37", 2, 0.5, 3, 0.5); m_world->PlaceActor(m_skateBoard, "int37", 2, 0.5, 3, 0.5);
@ -490,7 +490,7 @@ MxLong Pizza::HandleEndAction(MxEndActionNotificationParam& p_param)
} }
break; break;
case 5: case 5:
if (m_state->GetUnknown0xb0() == objectId) { if (m_state->GetPlayedAction() == objectId) {
StopActions(); StopActions();
if (GameState()->GetActorId() == LegoActor::c_pepper) { if (GameState()->GetActorId() == LegoActor::c_pepper) {
@ -506,24 +506,24 @@ MxLong Pizza::HandleEndAction(MxEndActionNotificationParam& p_param)
break; break;
case 2: case 2:
action = IsleScript::c_pja129br_RunAnim; action = IsleScript::c_pja129br_RunAnim;
m_unk0x90 = Timer()->GetTime(); m_startTime = Timer()->GetTime();
m_unk0x94 = 500; m_duration = 500;
m_mission->m_unk0x14++; m_mission->m_unk0x14++;
m_state->m_unk0x0c = 6; m_state->m_unk0x0c = 6;
MxTrace("Pizza mission: succeeds\n"); MxTrace("Pizza mission: succeeds\n");
break; break;
case 3: case 3:
action = IsleScript::c_pja131br_RunAnim; action = IsleScript::c_pja131br_RunAnim;
m_unk0x90 = Timer()->GetTime(); m_startTime = Timer()->GetTime();
m_unk0x94 = 500; m_duration = 500;
m_state->m_unk0x0c = 6; m_state->m_unk0x0c = 6;
break; break;
} }
} }
else { else {
action = IsleScript::c_pja132br_RunAnim; action = IsleScript::c_pja132br_RunAnim;
m_unk0x90 = Timer()->GetTime(); m_startTime = Timer()->GetTime();
m_unk0x94 = 2300; m_duration = 2300;
m_state->m_unk0x0c = 8; m_state->m_unk0x0c = 8;
InputManager()->DisableInputProcessing(); InputManager()->DisableInputProcessing();
InputManager()->SetUnknown336(TRUE); InputManager()->SetUnknown336(TRUE);
@ -535,16 +535,16 @@ MxLong Pizza::HandleEndAction(MxEndActionNotificationParam& p_param)
else { else {
FUN_100382b0(); FUN_100382b0();
m_state->m_unk0x0c = 0; m_state->m_unk0x0c = 0;
m_state->SetUnknown0xb0(IsleScript::c_noneIsle); m_state->SetPlayedAction(IsleScript::c_noneIsle);
} }
} }
break; break;
case 6: case 6:
if (m_state->GetUnknown0xb0() == objectId) { if (m_state->GetPlayedAction() == objectId) {
if (objectId == IsleScript::c_pja126br_RunAnim) { if (objectId == IsleScript::c_pja126br_RunAnim) {
PlayAction(IsleScript::c_pja127br_RunAnim, TRUE); PlayAction(IsleScript::c_pja127br_RunAnim, TRUE);
m_unk0x90 = Timer()->GetTime(); m_startTime = Timer()->GetTime();
m_unk0x94 = 700; m_duration = 700;
} }
else if (objectId == IsleScript::c_pja129br_RunAnim) { else if (objectId == IsleScript::c_pja129br_RunAnim) {
PlayAction(IsleScript::c_pja130br_RunAnim, TRUE); PlayAction(IsleScript::c_pja130br_RunAnim, TRUE);
@ -552,12 +552,12 @@ MxLong Pizza::HandleEndAction(MxEndActionNotificationParam& p_param)
else { else {
FUN_100382b0(); FUN_100382b0();
m_state->m_unk0x0c = 0; m_state->m_unk0x0c = 0;
m_state->SetUnknown0xb0(IsleScript::c_noneIsle); m_state->SetPlayedAction(IsleScript::c_noneIsle);
} }
} }
break; break;
case 8: case 8:
if (m_state->GetUnknown0xb0() == objectId) { if (m_state->GetPlayedAction() == objectId) {
m_act1state->m_unk0x018 = 0; m_act1state->m_unk0x018 = 0;
m_state->m_unk0x0c = 0; m_state->m_unk0x0c = 0;
GameState()->m_currentArea = LegoGameState::e_isle; GameState()->m_currentArea = LegoGameState::e_isle;
@ -567,7 +567,7 @@ MxLong Pizza::HandleEndAction(MxEndActionNotificationParam& p_param)
} }
break; break;
case 9: case 9:
if (m_state->GetUnknown0xb0() == objectId) { if (m_state->GetPlayedAction() == objectId) {
FUN_100382b0(); FUN_100382b0();
} }
break; break;
@ -580,10 +580,10 @@ MxLong Pizza::HandleEndAction(MxEndActionNotificationParam& p_param)
// FUNCTION: BETA10 0x100ef520 // FUNCTION: BETA10 0x100ef520
void Pizza::PlayAction(MxU32 p_objectId, MxBool p_param7) void Pizza::PlayAction(MxU32 p_objectId, MxBool p_param7)
{ {
m_state->SetUnknown0xb0(p_objectId); m_state->SetPlayedAction(p_objectId);
if (m_unk0x8c != IsleScript::c_noneIsle) { if (m_speechAction != IsleScript::c_noneIsle) {
InvokeAction(Extra::e_stop, *g_isleScript, m_unk0x8c, NULL); InvokeAction(Extra::e_stop, *g_isleScript, m_speechAction, NULL);
} }
AnimationManager() AnimationManager()
@ -601,7 +601,7 @@ PizzaMissionState::PizzaMissionState()
m_missions[3] = Mission(LegoActor::c_nick, 2, g_nickFinishTimes, g_nickActions, 4); m_missions[3] = Mission(LegoActor::c_nick, 2, g_nickFinishTimes, g_nickActions, 4);
m_missions[4] = Mission(LegoActor::c_laura, 2, g_lauraFinishTimes, g_lauraActions, 4); m_missions[4] = Mission(LegoActor::c_laura, 2, g_lauraFinishTimes, g_lauraActions, 4);
m_pizzeriaState = (PizzeriaState*) GameState()->GetState("PizzeriaState"); m_pizzeriaState = (PizzeriaState*) GameState()->GetState("PizzeriaState");
m_unk0xb0 = IsleScript::c_noneIsle; m_playedAction = IsleScript::c_noneIsle;
} }
// FUNCTION: LEGO1 0x100393c0 // FUNCTION: LEGO1 0x100393c0
@ -645,7 +645,7 @@ PizzaMissionState::Mission* PizzaMissionState::GetMission(MxU8 p_actorId)
} }
// FUNCTION: LEGO1 0x10039540 // FUNCTION: LEGO1 0x10039540
MxS16 PizzaMissionState::FUN_10039540() MxS16 PizzaMissionState::GetActorState()
{ {
return m_pizzeriaState->FUN_10017d50(); return m_pizzeriaState->GetActorState();
} }

View File

@ -89,18 +89,18 @@ MxLong Pizzeria::HandleClick()
// FUNCTION: BETA10 0x100efd14 // FUNCTION: BETA10 0x100efd14
PizzeriaState::PizzeriaState() PizzeriaState::PizzeriaState()
{ {
m_unk0x08[0] = Playlist((MxU32*) g_pepperActions, sizeOfArray(g_pepperActions), Playlist::e_once); m_playerPlaylists[0] = Playlist((MxU32*) g_pepperActions, sizeOfArray(g_pepperActions), Playlist::e_once);
m_unk0x08[1] = Playlist((MxU32*) g_mamaActions, sizeOfArray(g_mamaActions), Playlist::e_once); m_playerPlaylists[1] = Playlist((MxU32*) g_mamaActions, sizeOfArray(g_mamaActions), Playlist::e_once);
m_unk0x08[2] = Playlist((MxU32*) g_papaActions, sizeOfArray(g_papaActions), Playlist::e_once); m_playerPlaylists[2] = Playlist((MxU32*) g_papaActions, sizeOfArray(g_papaActions), Playlist::e_once);
m_unk0x08[3] = Playlist((MxU32*) g_nickActions, sizeOfArray(g_nickActions), Playlist::e_once); m_playerPlaylists[3] = Playlist((MxU32*) g_nickActions, sizeOfArray(g_nickActions), Playlist::e_once);
m_unk0x08[4] = Playlist((MxU32*) g_lauraActions, sizeOfArray(g_lauraActions), Playlist::e_once); m_playerPlaylists[4] = Playlist((MxU32*) g_lauraActions, sizeOfArray(g_lauraActions), Playlist::e_once);
memset(m_unk0x44, -1, sizeof(m_unk0x44)); memset(m_states, -1, sizeof(m_states));
} }
// FUNCTION: LEGO1 0x10017d50 // FUNCTION: LEGO1 0x10017d50
MxS16 PizzeriaState::FUN_10017d50() MxS16 PizzeriaState::GetActorState()
{ {
return m_unk0x44[GameState()->GetActorId() - 1]; return m_states[GameState()->GetActorId() - 1];
} }
// FUNCTION: LEGO1 0x10017d70 // FUNCTION: LEGO1 0x10017d70
@ -109,11 +109,11 @@ MxU32 PizzeriaState::NextAction()
{ {
MxU8 actorId = GameState()->GetActorId(); MxU8 actorId = GameState()->GetActorId();
if (m_unk0x44[actorId - 1] < 2) { if (m_states[actorId - 1] < 2) {
m_unk0x44[actorId - 1]++; m_states[actorId - 1]++;
} }
return m_unk0x08[actorId - 1].Next(); return m_playerPlaylists[actorId - 1].Next();
} }
// FUNCTION: LEGO1 0x10017da0 // FUNCTION: LEGO1 0x10017da0
@ -124,12 +124,12 @@ MxResult PizzeriaState::Serialize(LegoStorage* p_storage)
if (p_storage->IsReadMode()) { if (p_storage->IsReadMode()) {
for (MxS16 i = 0; i < 5; i++) { for (MxS16 i = 0; i < 5; i++) {
p_storage->ReadS16(m_unk0x08[i].m_nextIndex); p_storage->ReadS16(m_playerPlaylists[i].m_nextIndex);
} }
} }
else { else {
for (MxS16 i = 0; i < 5; i++) { for (MxS16 i = 0; i < 5; i++) {
p_storage->WriteS16(m_unk0x08[i].m_nextIndex); p_storage->WriteS16(m_playerPlaylists[i].m_nextIndex);
} }
} }

View File

@ -18,7 +18,7 @@ DECOMP_SIZE_ASSERT(Radio, 0x10)
DECOMP_SIZE_ASSERT(RadioState, 0x30) DECOMP_SIZE_ASSERT(RadioState, 0x30)
// GLOBAL: LEGO1 0x100f3218 // GLOBAL: LEGO1 0x100f3218
JukeboxScript::Script g_unk0x100f3218[] = { JukeboxScript::Script g_jingles[] = {
JukeboxScript::c_sns002ra_Audio, JukeboxScript::c_sns002ra_Audio,
JukeboxScript::c_sns001ja_Audio, JukeboxScript::c_sns001ja_Audio,
JukeboxScript::c_snsc01js_Audio, JukeboxScript::c_snsc01js_Audio,
@ -28,7 +28,7 @@ JukeboxScript::Script g_unk0x100f3218[] = {
}; };
// GLOBAL: LEGO1 0x100f3230 // GLOBAL: LEGO1 0x100f3230
JukeboxScript::Script g_unk0x100f3230[] = { JukeboxScript::Script g_news[] = {
JukeboxScript::c_ham035ra_Audio, JukeboxScript::c_ham035ra_Audio,
JukeboxScript::c_ham039ra_Audio, JukeboxScript::c_ham039ra_Audio,
JukeboxScript::c_sns005ra_Audio, JukeboxScript::c_sns005ra_Audio,
@ -46,7 +46,7 @@ JukeboxScript::Script g_unk0x100f3230[] = {
}; };
// GLOBAL: LEGO1 0x100f3268 // GLOBAL: LEGO1 0x100f3268
JukeboxScript::Script g_unk0x100f3268[] = { JukeboxScript::Script g_songs[] = {
JukeboxScript::c_CentralRoads_Music, JukeboxScript::c_CentralRoads_Music,
JukeboxScript::c_BeachBlvd_Music, JukeboxScript::c_BeachBlvd_Music,
JukeboxScript::c_ResidentalArea_Music, JukeboxScript::c_ResidentalArea_Music,
@ -64,7 +64,7 @@ Radio::Radio()
NotificationManager()->Register(this); NotificationManager()->Register(this);
ControlManager()->Register(this); ControlManager()->Register(this);
m_unk0x0c = TRUE; m_enabled = TRUE;
CreateState(); CreateState();
} }
@ -86,7 +86,7 @@ MxLong Radio::Notify(MxParam& p_param)
{ {
MxLong result = 0; MxLong result = 0;
if (m_unk0x0c) { if (m_enabled) {
MxNotificationParam& param = (MxNotificationParam&) p_param; MxNotificationParam& param = (MxNotificationParam&) p_param;
switch (param.GetNotification()) { switch (param.GetNotification()) {
case c_notificationEndAction: case c_notificationEndAction:
@ -108,7 +108,7 @@ void Radio::Play()
CurrentWorld(); CurrentWorld();
MxDSAction action; MxDSAction action;
action.SetObjectId(m_state->FUN_1002d090()); action.SetObjectId(m_state->NextPlaylistObjectId());
action.SetAtomId(*g_jukeboxScript); action.SetAtomId(*g_jukeboxScript);
action.SetLoopCount(1); action.SetLoopCount(1);
@ -174,11 +174,11 @@ MxLong Radio::HandleControl(LegoControlManagerNotificationParam& p_param)
MxLong Radio::HandleEndAction(MxEndActionNotificationParam& p_param) MxLong Radio::HandleEndAction(MxEndActionNotificationParam& p_param)
{ {
if (m_state->IsActive() && if (m_state->IsActive() &&
m_state->FUN_1002d0c0(p_param.GetAction()->GetAtomId(), p_param.GetAction()->GetObjectId())) { m_state->IsRadioObjectId(p_param.GetAction()->GetAtomId(), p_param.GetAction()->GetObjectId())) {
MxDSAction action; MxDSAction action;
action.SetAtomId(*g_jukeboxScript); action.SetAtomId(*g_jukeboxScript);
action.SetObjectId(m_state->FUN_1002d090()); action.SetObjectId(m_state->NextPlaylistObjectId());
action.SetLoopCount(1); action.SetLoopCount(1);
BackgroundAudioManager()->PlayMusic(action, 3, MxPresenter::e_repeating); BackgroundAudioManager()->PlayMusic(action, 3, MxPresenter::e_repeating);
@ -191,8 +191,8 @@ MxLong Radio::HandleEndAction(MxEndActionNotificationParam& p_param)
// FUNCTION: LEGO1 0x1002cdc0 // FUNCTION: LEGO1 0x1002cdc0
void Radio::Initialize(MxBool p_und) void Radio::Initialize(MxBool p_und)
{ {
if (m_unk0x0c != p_und) { if (m_enabled != p_und) {
m_unk0x0c = p_und; m_enabled = p_und;
CreateState(); CreateState();
} }
} }
@ -217,37 +217,37 @@ RadioState::RadioState()
m_unk0x2c = SDL_rand(3); m_unk0x2c = SDL_rand(3);
m_unk0x08[0] = Playlist((MxU32*) g_unk0x100f3218, sizeOfArray(g_unk0x100f3218), Playlist::e_loop); m_unk0x08[0] = Playlist((MxU32*) g_jingles, sizeOfArray(g_jingles), Playlist::e_loop);
m_unk0x08[0].m_nextIndex = SDL_rand(sizeOfArray(g_unk0x100f3218)); m_unk0x08[0].m_nextIndex = SDL_rand(sizeOfArray(g_jingles));
m_unk0x08[1] = Playlist((MxU32*) g_unk0x100f3230, sizeOfArray(g_unk0x100f3230), Playlist::e_loop); m_unk0x08[1] = Playlist((MxU32*) g_news, sizeOfArray(g_news), Playlist::e_loop);
m_unk0x08[1].m_nextIndex = SDL_rand(sizeOfArray(g_unk0x100f3230)); m_unk0x08[1].m_nextIndex = SDL_rand(sizeOfArray(g_news));
m_unk0x08[2] = Playlist((MxU32*) g_unk0x100f3268, sizeOfArray(g_unk0x100f3268), Playlist::e_loop); m_unk0x08[2] = Playlist((MxU32*) g_songs, sizeOfArray(g_songs), Playlist::e_loop);
m_unk0x08[2].m_nextIndex = SDL_rand(sizeOfArray(g_unk0x100f3268)); m_unk0x08[2].m_nextIndex = SDL_rand(sizeOfArray(g_songs));
m_active = FALSE; m_active = FALSE;
} }
// FUNCTION: LEGO1 0x1002d090 // FUNCTION: LEGO1 0x1002d090
MxU32 RadioState::FUN_1002d090() MxU32 RadioState::NextPlaylistObjectId()
{ {
if (m_unk0x2c == 2) { if (m_activePlaylist == 2) {
m_unk0x2c = 0; m_activePlaylist = 0;
} }
else { else {
m_unk0x2c++; m_activePlaylist++;
} }
return m_unk0x08[m_unk0x2c].Next(); return m_playlists[m_activePlaylist].Next();
} }
// FUNCTION: LEGO1 0x1002d0c0 // FUNCTION: LEGO1 0x1002d0c0
MxBool RadioState::FUN_1002d0c0(const MxAtomId& p_atom, MxU32 p_objectId) MxBool RadioState::IsRadioObjectId(const MxAtomId& p_atom, MxU32 p_objectId)
{ {
if (*g_jukeboxScript == p_atom) { if (*g_jukeboxScript == p_atom) {
for (MxS16 i = 0; i < 3; i++) { for (MxS16 i = 0; i < 3; i++) {
if (m_unk0x08[i].Contains(p_objectId)) { if (m_playlists[i].Contains(p_objectId)) {
return TRUE; return TRUE;
} }
} }

View File

@ -338,9 +338,9 @@ void LegoCarBuildAnimPresenter::SwapNodesByName(LegoChar* p_name1, LegoChar* p_n
strcpy(node1->GetName(), node2->GetName()); strcpy(node1->GetName(), node2->GetName());
strcpy(node2->GetName(), buffer); strcpy(node2->GetName(), buffer);
LegoU16 val1 = node1->GetUnknown0x20(); LegoU16 val1 = node1->GetROIIndex();
node1->SetUnknown0x20(node2->GetUnknown0x20()); node1->SetROIIndex(node2->GetROIIndex());
node2->SetUnknown0x20(val1); node2->SetROIIndex(val1);
} }
} }
@ -458,7 +458,7 @@ void LegoCarBuildAnimPresenter::FUN_100795d0(LegoChar* p_param)
assert(newHideKey); assert(newHideKey);
newHideKey->SetTime(0); newHideKey->SetTime(0);
newHideKey->SetUnknown0x08(FALSE); newHideKey->SetVisible(FALSE);
data->SetNumMorphKeys(1); data->SetNumMorphKeys(1);
data->SetMorphKeys(newHideKey); data->SetMorphKeys(newHideKey);

View File

@ -645,7 +645,7 @@ MxBool LegoCharacterManager::SetHeadTexture(LegoROI* p_roi, LegoTextureInfo* p_t
lodList->Release(); lodList->Release();
lodList = dupLodList; lodList = dupLodList;
if (head->GetUnknown0xe0() >= 0) { if (head->GetLodLevel() >= 0) {
VideoManager()->Get3DManager()->GetLego3DView()->GetViewManager()->RemoveROIDetailFromScene(head); VideoManager()->Get3DManager()->GetLego3DView()->GetViewManager()->RemoveROIDetailFromScene(head);
} }
@ -846,7 +846,7 @@ MxBool LegoCharacterManager::SwitchVariant(LegoROI* p_roi)
lodList->Release(); lodList->Release();
lodList = dupLodList; lodList = dupLodList;
if (childROI->GetUnknown0xe0() >= 0) { if (childROI->GetLodLevel() >= 0) {
VideoManager()->Get3DManager()->GetLego3DView()->GetViewManager()->RemoveROIDetailFromScene(childROI); VideoManager()->Get3DManager()->GetLego3DView()->GetViewManager()->RemoveROIDetailFromScene(childROI);
} }

View File

@ -395,7 +395,7 @@ MxBool LegoPlantManager::SwitchColor(LegoEntity* p_entity)
ViewLODList* lodList = GetViewLODListManager()->Lookup(g_plantLodNames[info->m_variant][info->m_color]); ViewLODList* lodList = GetViewLODListManager()->Lookup(g_plantLodNames[info->m_variant][info->m_color]);
if (roi->GetUnknown0xe0() >= 0) { if (roi->GetLodLevel() >= 0) {
VideoManager()->Get3DManager()->GetLego3DView()->GetViewManager()->RemoveROIDetailFromScene(roi); VideoManager()->Get3DManager()->GetLego3DView()->GetViewManager()->RemoveROIDetailFromScene(roi);
} }
@ -424,7 +424,7 @@ MxBool LegoPlantManager::SwitchVariant(LegoEntity* p_entity)
ViewLODList* lodList = GetViewLODListManager()->Lookup(g_plantLodNames[info->m_variant][info->m_color]); ViewLODList* lodList = GetViewLODListManager()->Lookup(g_plantLodNames[info->m_variant][info->m_color]);
if (roi->GetUnknown0xe0() >= 0) { if (roi->GetLodLevel() >= 0) {
VideoManager()->Get3DManager()->GetLego3DView()->GetViewManager()->RemoveROIDetailFromScene(roi); VideoManager()->Get3DManager()->GetLego3DView()->GetViewManager()->RemoveROIDetailFromScene(roi);
} }

View File

@ -707,7 +707,7 @@ MxLong LegoNavController::Notify(MxParam& p_param)
Mx3DPointFloat roiPosition(roi->GetWorldPosition()); Mx3DPointFloat roiPosition(roi->GetWorldPosition());
roiPosition -= viewPosition; roiPosition -= viewPosition;
if (roiPosition.LenSquared() < 2000.0 || roi->GetUnknown0xe0() > 0) { if (roiPosition.LenSquared() < 2000.0 || roi->GetLodLevel() > 0) {
entity->ClickAnimation(); entity->ClickAnimation();
} }
} }

View File

@ -50,8 +50,8 @@ void LegoAnimPresenter::Init()
m_anim = NULL; m_anim = NULL;
m_roiMap = NULL; m_roiMap = NULL;
m_roiMapSize = 0; m_roiMapSize = 0;
m_unk0x74 = NULL; m_managedActors = NULL;
m_unk0x70 = NULL; m_sceneROIs = NULL;
m_unk0x78 = NULL; m_unk0x78 = NULL;
m_flags = 0; m_flags = 0;
m_unk0xa8.Clear(); m_unk0xa8.Clear();
@ -84,13 +84,13 @@ void LegoAnimPresenter::Destroy(MxBool p_fromDestructor)
delete[] m_roiMap; delete[] m_roiMap;
} }
if (m_unk0x70 != NULL) { if (m_sceneROIs != NULL) {
delete m_unk0x70; delete m_sceneROIs;
} }
if (m_unk0x74 != NULL) { if (m_managedActors != NULL) {
FUN_1006aa60(); FUN_1006aa60();
delete m_unk0x74; delete m_managedActors;
} }
if (m_unk0x78 != NULL) { if (m_unk0x78 != NULL) {
@ -217,13 +217,13 @@ LegoChar* LegoAnimPresenter::FUN_10069150(const LegoChar* p_und1)
// FUNCTION: LEGO1 0x100692b0 // FUNCTION: LEGO1 0x100692b0
void LegoAnimPresenter::FUN_100692b0() void LegoAnimPresenter::FUN_100692b0()
{ {
m_unk0x74 = new LegoROIList(); m_managedActors = new LegoROIList();
if (m_unk0x74) { if (m_managedActors) {
LegoU32 numActors = m_anim->GetNumActors(); LegoU32 numActors = m_anim->GetNumActors();
for (LegoU32 i = 0; i < numActors; i++) { for (LegoU32 i = 0; i < numActors; i++) {
LegoChar* str = FUN_100697c0(m_anim->GetActorName(i), NULL); LegoChar* str = GetVariableOrIdentity(m_anim->GetActorName(i), NULL);
undefined4 unk0x04 = m_anim->GetActorUnknown0x04(i); undefined4 unk0x04 = m_anim->GetActorUnknown0x04(i);
LegoROI* roi = NULL; LegoROI* roi = NULL;
@ -283,7 +283,7 @@ void LegoAnimPresenter::FUN_100692b0()
} }
if (roi != NULL) { if (roi != NULL) {
m_unk0x74->Append(roi); m_managedActors->Append(roi);
} }
delete[] str; delete[] str;
@ -295,9 +295,9 @@ void LegoAnimPresenter::FUN_100692b0()
// FUNCTION: BETA10 0x1004f359 // FUNCTION: BETA10 0x1004f359
void LegoAnimPresenter::FUN_100695c0() void LegoAnimPresenter::FUN_100695c0()
{ {
m_unk0x70 = new LegoROIList(); m_sceneROIs = new LegoROIList();
if (m_unk0x70) { if (m_sceneROIs) {
const CompoundObject& rois = VideoManager()->Get3DManager()->GetLego3DView()->GetViewManager()->GetROIs(); const CompoundObject& rois = VideoManager()->Get3DManager()->GetLego3DView()->GetViewManager()->GetROIs();
LegoU32 numActors = m_anim->GetNumActors(); LegoU32 numActors = m_anim->GetNumActors();
@ -327,23 +327,23 @@ void LegoAnimPresenter::FUN_100695c0()
} }
// FUNCTION: LEGO1 0x100697c0 // FUNCTION: LEGO1 0x100697c0
LegoChar* LegoAnimPresenter::FUN_100697c0(const LegoChar* p_und1, const LegoChar* p_und2) LegoChar* LegoAnimPresenter::GetVariableOrIdentity(const LegoChar* p_varName, const LegoChar* p_prefix)
{ {
const LegoChar* str = p_und1; const LegoChar* str = p_varName;
const char* var = VariableTable()->GetVariable(p_und1); const char* var = VariableTable()->GetVariable(p_varName);
if (*var) { if (*var) {
str = var; str = var;
} }
LegoU32 len = strlen(str) + (p_und2 ? strlen(p_und2) : 0) + 2; LegoU32 len = strlen(str) + (p_prefix ? strlen(p_prefix) : 0) + 2;
LegoChar* result = new LegoChar[len]; LegoChar* result = new LegoChar[len];
if (result != NULL) { if (result != NULL) {
*result = '\0'; *result = '\0';
if (p_und2) { if (p_prefix) {
strcpy(result, p_und2); strcpy(result, p_prefix);
strcat(result, ":"); strcat(result, ":");
} }
@ -359,7 +359,7 @@ LegoBool LegoAnimPresenter::FUN_100698b0(const CompoundObject& p_rois, const Leg
LegoBool result = FALSE; LegoBool result = FALSE;
LegoChar* str; LegoChar* str;
if (*(str = FUN_100697c0(p_und2, NULL)) == '*') { if (*(str = GetVariableOrIdentity(p_und2, NULL)) == '*') {
LegoChar* tmp = FUN_10069150(str); LegoChar* tmp = FUN_10069150(str);
delete[] str; delete[] str;
str = tmp; str = tmp;
@ -372,7 +372,7 @@ LegoBool LegoAnimPresenter::FUN_100698b0(const CompoundObject& p_rois, const Leg
if (name != NULL) { if (name != NULL) {
if (!SDL_strcasecmp(name, str)) { if (!SDL_strcasecmp(name, str)) {
m_unk0x70->Append(roi); m_sceneROIs->Append(roi);
result = TRUE; result = TRUE;
break; break;
} }
@ -385,20 +385,20 @@ LegoBool LegoAnimPresenter::FUN_100698b0(const CompoundObject& p_rois, const Leg
} }
// FUNCTION: LEGO1 0x100699e0 // FUNCTION: LEGO1 0x100699e0
LegoROI* LegoAnimPresenter::FUN_100699e0(const LegoChar* p_und) LegoROI* LegoAnimPresenter::FindROI(const LegoChar* p_name)
{ {
LegoROIListCursor cursor(m_unk0x70); LegoROIListCursor cursor(m_sceneROIs);
LegoROI* roi; LegoROI* roi;
while (cursor.Next(roi)) { while (cursor.Next(roi)) {
LegoChar* und = FUN_100697c0(roi->GetName(), NULL); LegoChar* nameOrVar = GetVariableOrIdentity(roi->GetName(), NULL);
if (und != NULL && !SDL_strcasecmp(und, p_und)) { if (nameOrVar != NULL && !SDL_strcasecmp(nameOrVar, p_name)) {
delete[] und; delete[] nameOrVar;
return roi; return roi;
} }
delete[] und; delete[] nameOrVar;
} }
return NULL; return NULL;
@ -413,7 +413,7 @@ void LegoAnimPresenter::FUN_10069b10()
memset(m_unk0x8c, 0, m_unk0x94 * sizeof(*m_unk0x8c)); memset(m_unk0x8c, 0, m_unk0x94 * sizeof(*m_unk0x8c));
} }
FUN_1006a3c0(anims, m_anim->GetRoot(), NULL); UpdateStructMapAndROIIndex(anims, m_anim->GetRoot(), NULL);
if (m_roiMap != NULL) { if (m_roiMap != NULL) {
delete[] m_roiMap; delete[] m_roiMap;
@ -446,7 +446,7 @@ void LegoAnimPresenter::FUN_10069b10()
} }
// FUNCTION: LEGO1 0x1006a3c0 // FUNCTION: LEGO1 0x1006a3c0
void LegoAnimPresenter::FUN_1006a3c0(LegoAnimStructMap& p_map, LegoTreeNode* p_node, LegoROI* p_roi) void LegoAnimPresenter::UpdateStructMapAndROIIndex(LegoAnimStructMap& p_map, LegoTreeNode* p_node, LegoROI* p_roi)
{ {
LegoROI* roi = p_roi; LegoROI* roi = p_roi;
LegoChar* und = NULL; LegoChar* und = NULL;
@ -459,27 +459,27 @@ void LegoAnimPresenter::FUN_1006a3c0(LegoAnimStructMap& p_map, LegoTreeNode* p_n
name = und2 = FUN_10069150(name); name = und2 = FUN_10069150(name);
} }
und = FUN_100697c0(name, p_roi != NULL ? p_roi->GetName() : NULL); und = GetVariableOrIdentity(name, p_roi != NULL ? p_roi->GetName() : NULL);
if (p_roi == NULL) { if (p_roi == NULL) {
roi = FUN_100699e0(und); roi = FindROI(und);
if (roi != NULL) { if (roi != NULL) {
FUN_1006a4f0(p_map, data, und, roi); UpdateStructMapAndROIIndexForNode(p_map, data, und, roi);
} }
else { else {
data->SetUnknown0x20(0); data->SetROIIndex(0);
} }
} }
else { else {
LegoROI* child = p_roi->FindChildROI(name, p_roi); LegoROI* child = p_roi->FindChildROI(name, p_roi);
if (child != NULL) { if (child != NULL) {
FUN_1006a4f0(p_map, data, und, child); UpdateStructMapAndROIIndexForNode(p_map, data, und, child);
} }
else { else {
if (FUN_100699e0(name) != NULL) { if (FindROI(name) != NULL) {
FUN_1006a3c0(p_map, p_node, NULL); UpdateStructMapAndROIIndex(p_map, p_node, NULL);
delete[] und; delete[] und;
delete[] und2; delete[] und2;
return; return;
@ -493,12 +493,12 @@ void LegoAnimPresenter::FUN_1006a3c0(LegoAnimStructMap& p_map, LegoTreeNode* p_n
MxS32 count = p_node->GetNumChildren(); MxS32 count = p_node->GetNumChildren();
for (MxS32 i = 0; i < count; i++) { for (MxS32 i = 0; i < count; i++) {
FUN_1006a3c0(p_map, p_node->GetChild(i), roi); UpdateStructMapAndROIIndex(p_map, p_node->GetChild(i), roi);
} }
} }
// FUNCTION: LEGO1 0x1006a4f0 // FUNCTION: LEGO1 0x1006a4f0
void LegoAnimPresenter::FUN_1006a4f0( void LegoAnimPresenter::UpdateStructMapAndROIIndexForNode(
LegoAnimStructMap& p_map, LegoAnimStructMap& p_map,
LegoAnimNodeData* p_data, LegoAnimNodeData* p_data,
const LegoChar* p_und, const LegoChar* p_und,
@ -513,7 +513,7 @@ void LegoAnimPresenter::FUN_1006a4f0(
animStruct.m_index = p_map.size() + 1; animStruct.m_index = p_map.size() + 1;
animStruct.m_roi = p_roi; animStruct.m_roi = p_roi;
p_data->SetUnknown0x20(animStruct.m_index); p_data->SetROIIndex(animStruct.m_index);
LegoChar* und = new LegoChar[strlen(p_und) + 1]; LegoChar* und = new LegoChar[strlen(p_und) + 1];
strcpy(und, p_und); strcpy(und, p_und);
@ -521,7 +521,7 @@ void LegoAnimPresenter::FUN_1006a4f0(
p_map[und] = animStruct; p_map[und] = animStruct;
} }
else { else {
p_data->SetUnknown0x20((*it).second.m_index); p_data->SetROIIndex((*it).second.m_index);
} }
} }
@ -529,7 +529,7 @@ void LegoAnimPresenter::FUN_1006a4f0(
// FUNCTION: BETA10 0x1004feee // FUNCTION: BETA10 0x1004feee
void LegoAnimPresenter::FUN_1006aa60() void LegoAnimPresenter::FUN_1006aa60()
{ {
LegoROIListCursor cursor(m_unk0x74); LegoROIListCursor cursor(m_managedActors);
LegoROI* roi; LegoROI* roi;
while (cursor.Next(roi)) { while (cursor.Next(roi)) {
@ -545,10 +545,10 @@ void LegoAnimPresenter::FUN_1006aa60()
void LegoAnimPresenter::FUN_1006ab70() void LegoAnimPresenter::FUN_1006ab70()
{ {
if (m_unk0x96) { if (m_unk0x96) {
AnimationManager()->FUN_10063270(m_unk0x74, this); AnimationManager()->FUN_10063270(m_managedActors, this);
} }
else { else {
AnimationManager()->FUN_10063780(m_unk0x74); AnimationManager()->FUN_10063780(m_managedActors);
} }
} }
@ -568,10 +568,10 @@ MxBool LegoAnimPresenter::FUN_1006abb0(LegoTreeNode* p_node, LegoROI* p_roi)
MxS32 i, count; MxS32 i, count;
if (name != NULL && *name != '-') { if (name != NULL && *name != '-') {
und = FUN_100697c0(name, p_roi != NULL ? p_roi->GetName() : NULL); und = GetVariableOrIdentity(name, p_roi != NULL ? p_roi->GetName() : NULL);
if (p_roi == NULL) { if (p_roi == NULL) {
roi = FUN_100699e0(und); roi = FindROI(und);
if (roi == NULL) { if (roi == NULL) {
goto done; goto done;
@ -581,7 +581,7 @@ MxBool LegoAnimPresenter::FUN_1006abb0(LegoTreeNode* p_node, LegoROI* p_roi)
LegoROI* child = p_roi->FindChildROI(name, p_roi); LegoROI* child = p_roi->FindChildROI(name, p_roi);
if (child == NULL) { if (child == NULL) {
if (FUN_100699e0(name) != NULL) { if (FindROI(name) != NULL) {
if (FUN_1006abb0(p_node, NULL)) { if (FUN_1006abb0(p_node, NULL)) {
result = TRUE; result = TRUE;
} }
@ -831,9 +831,9 @@ void LegoAnimPresenter::StartingTickle()
VTable0x8c(); VTable0x8c();
done: done:
if (m_unk0x70 != NULL) { if (m_sceneROIs != NULL) {
delete m_unk0x70; delete m_sceneROIs;
m_unk0x70 = NULL; m_sceneROIs = NULL;
} }
} }
@ -896,7 +896,7 @@ void LegoAnimPresenter::FUN_1006b900(LegoAnim* p_anim, MxLong p_time, Matrix4* p
mat = *p_matrix; mat = *p_matrix;
} }
else { else {
LegoROI* roi = m_roiMap[data->GetUnknown0x20()]; LegoROI* roi = m_roiMap[data->GetROIIndex()];
if (roi != NULL) { if (roi != NULL) {
mat = roi->GetLocal2World(); mat = roi->GetLocal2World();
@ -921,7 +921,7 @@ void LegoAnimPresenter::FUN_1006b9a0(LegoAnim* p_anim, MxLong p_time, Matrix4* p
mat = *p_matrix; mat = *p_matrix;
} }
else { else {
LegoROI* roi = m_roiMap[data->GetUnknown0x20()]; LegoROI* roi = m_roiMap[data->GetROIIndex()];
if (roi != NULL) { if (roi != NULL) {
mat = roi->GetLocal2World(); mat = roi->GetLocal2World();

View File

@ -104,10 +104,10 @@ void LegoHideAnimPresenter::FUN_1006db60(LegoTreeNode* p_node, LegoTime p_time)
MxBool previousB = FALSE; MxBool previousB = FALSE;
if (m_roiMap != NULL) { if (m_roiMap != NULL) {
LegoROI* roi = m_roiMap[data->GetUnknown0x20()]; LegoROI* roi = m_roiMap[data->GetROIIndex()];
if (roi != NULL) { if (roi != NULL) {
newB = data->FUN_100a0990(p_time); newB = data->GetVisibility(p_time);
previousB = roi->GetVisibility(); previousB = roi->GetVisibility();
roi->SetVisibility(newB); roi->SetVisibility(newB);
} }
@ -117,7 +117,7 @@ void LegoHideAnimPresenter::FUN_1006db60(LegoTreeNode* p_node, LegoTime p_time)
LegoPathBoundary* boundary = m_boundaryMap[data->GetUnknown0x22()]; LegoPathBoundary* boundary = m_boundaryMap[data->GetUnknown0x22()];
if (boundary != NULL) { if (boundary != NULL) {
newB = data->FUN_100a0990(p_time); newB = data->GetVisibility(p_time);
previousB = boundary->GetFlag0x10(); previousB = boundary->GetFlag0x10();
boundary->SetFlag0x10(newB); boundary->SetFlag0x10(newB);
} }

View File

@ -157,8 +157,8 @@ void LegoLocomotionAnimPresenter::FUN_1006d680(LegoAnimActor* p_actor, MxFloat p
variableTable->SetVariable(key, ""); variableTable->SetVariable(key, "");
if (m_unk0x70 != NULL) { if (m_sceneROIs != NULL) {
delete m_unk0x70; delete m_sceneROIs;
m_unk0x70 = NULL; m_sceneROIs = NULL;
} }
} }

View File

@ -348,7 +348,7 @@ LegoResult LegoTranslationKey::Read(LegoStorage* p_storage)
} }
if (m_x > 1e-05F || m_x < -1e-05F || m_y > 1e-05F || m_y < -1e-05F || m_z > 1e-05F || m_z < -1e-05F) { if (m_x > 1e-05F || m_x < -1e-05F || m_y > 1e-05F || m_y < -1e-05F || m_z > 1e-05F || m_z < -1e-05F) {
m_flags |= c_bit1; m_flags |= c_active;
} }
return SUCCESS; return SUCCESS;
@ -415,7 +415,7 @@ LegoResult LegoRotationKey::Read(LegoStorage* p_storage)
} }
if (m_angle != 1.0F) { if (m_angle != 1.0F) {
m_flags |= c_bit1; m_flags |= c_active;
} }
return SUCCESS; return SUCCESS;
@ -480,7 +480,7 @@ LegoResult LegoScaleKey::Read(LegoStorage* p_storage)
} }
if (m_x > 1.00001 || m_x < 0.99999 || m_y > 1.00001 || m_y < 0.99999 || m_z > 1.00001 || m_z < 0.99999) { if (m_x > 1.00001 || m_x < 0.99999 || m_y > 1.00001 || m_y < 0.99999 || m_z > 1.00001 || m_z < 0.99999) {
m_flags |= c_bit1; m_flags |= c_active;
} }
return SUCCESS; return SUCCESS;
@ -522,7 +522,7 @@ LegoAnimNodeData::LegoAnimNodeData()
m_name = NULL; m_name = NULL;
m_translationKeys = NULL; m_translationKeys = NULL;
m_unk0x20 = 0; m_roiIndex = 0;
m_rotationKeys = NULL; m_rotationKeys = NULL;
m_unk0x22 = 0; m_unk0x22 = 0;
m_scaleKeys = NULL; m_scaleKeys = NULL;
@ -785,7 +785,7 @@ inline void LegoAnimNodeData::GetTranslation(
case 0: case 0:
return; return;
case 1: case 1:
if (!p_translationKeys[i].TestBit1()) { if (!p_translationKeys[i].IsActive()) {
return; return;
} }
@ -794,7 +794,7 @@ inline void LegoAnimNodeData::GetTranslation(
z = p_translationKeys[i].GetZ(); z = p_translationKeys[i].GetZ();
break; break;
case 2: case 2:
if (!p_translationKeys[i].TestBit1() && !p_translationKeys[i + 1].TestBit1()) { if (!p_translationKeys[i].IsActive() && !p_translationKeys[i + 1].IsActive()) {
return; return;
} }
@ -841,7 +841,7 @@ inline void LegoAnimNodeData::GetTranslation(
case 0: case 0:
return; return;
case 1: case 1:
if (p_rotationKeys[i].TestBit1()) { if (p_rotationKeys[i].IsActive()) {
p_matrix.FromQuaternion(Mx4DPointFloat( p_matrix.FromQuaternion(Mx4DPointFloat(
p_rotationKeys[i].GetX(), p_rotationKeys[i].GetX(),
p_rotationKeys[i].GetY(), p_rotationKeys[i].GetY(),
@ -854,19 +854,19 @@ inline void LegoAnimNodeData::GetTranslation(
Mx4DPointFloat a; Mx4DPointFloat a;
MxQuaternionTransformer b; MxQuaternionTransformer b;
if (p_rotationKeys[i].TestBit1() || p_rotationKeys[i + 1].TestBit1()) { if (p_rotationKeys[i].IsActive() || p_rotationKeys[i + 1].IsActive()) {
a[0] = p_rotationKeys[i].GetX(); a[0] = p_rotationKeys[i].GetX();
a[1] = p_rotationKeys[i].GetY(); a[1] = p_rotationKeys[i].GetY();
a[2] = p_rotationKeys[i].GetZ(); a[2] = p_rotationKeys[i].GetZ();
a[3] = p_rotationKeys[i].GetAngle(); a[3] = p_rotationKeys[i].GetAngle();
if (p_rotationKeys[i + 1].TestBit3()) { if (p_rotationKeys[i + 1].ShouldSkipInterpolation()) {
p_matrix.FromQuaternion(a); p_matrix.FromQuaternion(a);
return; return;
} }
Mx4DPointFloat c; Mx4DPointFloat c;
if (p_rotationKeys[i + 1].TestBit2()) { if (p_rotationKeys[i + 1].ShouldNegateRotation()) {
c[0] = -p_rotationKeys[i + 1].GetX(); c[0] = -p_rotationKeys[i + 1].GetX();
c[1] = -p_rotationKeys[i + 1].GetY(); c[1] = -p_rotationKeys[i + 1].GetY();
c[2] = -p_rotationKeys[i + 1].GetZ(); c[2] = -p_rotationKeys[i + 1].GetZ();
@ -920,7 +920,7 @@ inline void LegoAnimNodeData::GetScale(
} }
// FUNCTION: LEGO1 0x100a0990 // FUNCTION: LEGO1 0x100a0990
LegoBool LegoAnimNodeData::FUN_100a0990(LegoFloat p_time) LegoBool LegoAnimNodeData::GetVisibility(LegoFloat p_time)
{ {
LegoU32 i, n; LegoU32 i, n;
LegoU32 index = GetMorphIndex(); LegoU32 index = GetMorphIndex();
@ -935,7 +935,7 @@ LegoBool LegoAnimNodeData::FUN_100a0990(LegoFloat p_time)
break; break;
case 1: case 1:
case 2: case 2:
result = m_morphKeys[i].GetUnknown0x08(); result = m_morphKeys[i].IsVisible();
break; break;
} }
@ -1171,7 +1171,7 @@ undefined4 LegoAnim::GetActorUnknown0x04(LegoU32 p_index)
// FUNCTION: BETA10 0x1018027c // FUNCTION: BETA10 0x1018027c
LegoMorphKey::LegoMorphKey() LegoMorphKey::LegoMorphKey()
{ {
m_unk0x08 = 0; m_visible = FALSE;
} }
// FUNCTION: LEGO1 0x100a0f70 // FUNCTION: LEGO1 0x100a0f70
@ -1183,7 +1183,7 @@ LegoResult LegoMorphKey::Read(LegoStorage* p_storage)
return result; return result;
} }
if ((result = p_storage->Read(&m_unk0x08, sizeof(LegoU8))) != SUCCESS) { if ((result = p_storage->Read(&m_visible, sizeof(LegoU8))) != SUCCESS) {
return result; return result;
} }
@ -1200,7 +1200,7 @@ LegoResult LegoMorphKey::Write(LegoStorage* p_storage)
return result; return result;
} }
if ((result = p_storage->Write(&m_unk0x08, sizeof(LegoU8))) != SUCCESS) { if ((result = p_storage->Write(&m_visible, sizeof(LegoU8))) != SUCCESS) {
return result; return result;
} }

View File

@ -11,9 +11,9 @@ class Matrix4;
class LegoAnimKey { class LegoAnimKey {
public: public:
enum Flags { enum Flags {
c_bit1 = 0x01, c_active = 0x01,
c_bit2 = 0x02, c_negateRotation = 0x02,
c_bit3 = 0x04 c_skipInterpolation = 0x04
}; };
LegoAnimKey(); LegoAnimKey();
@ -25,18 +25,18 @@ public:
// FUNCTION: BETA10 0x100738a0 // FUNCTION: BETA10 0x100738a0
void SetTime(MxS32 p_time) { m_time = p_time; } void SetTime(MxS32 p_time) { m_time = p_time; }
LegoU32 TestBit1() { return m_flags & c_bit1; } LegoU32 IsActive() { return m_flags & c_active; }
LegoU32 TestBit2() { return m_flags & c_bit2; } LegoU32 ShouldNegateRotation() { return m_flags & c_negateRotation; }
LegoU32 TestBit3() { return m_flags & c_bit3; } LegoU32 ShouldSkipInterpolation() { return m_flags & c_skipInterpolation; }
// FUNCTION: BETA10 0x100739a0 // FUNCTION: BETA10 0x100739a0
void FUN_100739a0(MxS32 p_param) void FUN_100739a0(MxS32 p_param)
{ {
if (p_param) { if (p_param) {
m_flags |= c_bit1; m_flags |= c_active;
} }
else { else {
m_flags &= ~c_bit1; m_flags &= ~c_active;
} }
} }
@ -127,13 +127,13 @@ public:
LegoMorphKey(); LegoMorphKey();
LegoResult Read(LegoStorage* p_storage); LegoResult Read(LegoStorage* p_storage);
LegoResult Write(LegoStorage* p_storage); LegoResult Write(LegoStorage* p_storage);
LegoBool GetUnknown0x08() { return m_unk0x08; } LegoBool IsVisible() { return m_visible; }
// FUNCTION: BETA10 0x100738d0 // FUNCTION: BETA10 0x100738d0
void SetUnknown0x08(LegoBool p_unk0x08) { m_unk0x08 = p_unk0x08; } void SetVisible(LegoBool p_visible) { m_visible = p_visible; }
protected: protected:
LegoBool m_unk0x08; // 0x08 LegoBool m_visible; // 0x08
}; };
// SIZE 0x0c // SIZE 0x0c
@ -160,7 +160,7 @@ public:
void SetName(LegoChar* p_name); void SetName(LegoChar* p_name);
LegoResult CreateLocalTransform(LegoFloat p_time, Matrix4& p_matrix); LegoResult CreateLocalTransform(LegoFloat p_time, Matrix4& p_matrix);
LegoBool FUN_100a0990(LegoFloat p_time); LegoBool GetVisibility(LegoFloat p_time);
// FUNCTION: BETA10 0x100595d0 // FUNCTION: BETA10 0x100595d0
LegoChar* GetName() { return m_name; } LegoChar* GetName() { return m_name; }
@ -187,7 +187,7 @@ public:
LegoU32 GetMorphIndex() { return m_morphIndex; } LegoU32 GetMorphIndex() { return m_morphIndex; }
// FUNCTION: BETA10 0x1005abc0 // FUNCTION: BETA10 0x1005abc0
LegoU16 GetUnknown0x20() { return m_unk0x20; } LegoU16 GetROIIndex() { return m_roiIndex; }
// FUNCTION: BETA10 0x1005d5c0 // FUNCTION: BETA10 0x1005d5c0
LegoU16 GetUnknown0x22() { return m_unk0x22; } LegoU16 GetUnknown0x22() { return m_unk0x22; }
@ -214,7 +214,7 @@ public:
void SetNumMorphKeys(LegoU16 p_numMorphKeys) { m_numMorphKeys = p_numMorphKeys; } void SetNumMorphKeys(LegoU16 p_numMorphKeys) { m_numMorphKeys = p_numMorphKeys; }
// FUNCTION: BETA10 0x10059600 // FUNCTION: BETA10 0x10059600
void SetUnknown0x20(LegoU16 p_unk0x20) { m_unk0x20 = p_unk0x20; } void SetROIIndex(LegoU16 p_roiIndex) { m_roiIndex = p_roiIndex; }
// FUNCTION: BETA10 0x1005f2e0 // FUNCTION: BETA10 0x1005f2e0
void SetUnknown0x22(LegoU16 p_unk0x22) { m_unk0x22 = p_unk0x22; } void SetUnknown0x22(LegoU16 p_unk0x22) { m_unk0x22 = p_unk0x22; }
@ -225,7 +225,7 @@ public:
} }
// FUNCTION: BETA10 0x1005d580 // FUNCTION: BETA10 0x1005d580
LegoBool FUN_100a0990(LegoTime p_time) { return FUN_100a0990((LegoFloat) p_time); } LegoBool GetVisibility(LegoTime p_time) { return GetVisibility((LegoFloat) p_time); }
inline static void GetTranslation( inline static void GetTranslation(
LegoU16 p_numTranslationKeys, LegoU16 p_numTranslationKeys,
@ -279,7 +279,7 @@ protected:
LegoRotationKey* m_rotationKeys; // 0x14 LegoRotationKey* m_rotationKeys; // 0x14
LegoScaleKey* m_scaleKeys; // 0x18 LegoScaleKey* m_scaleKeys; // 0x18
LegoMorphKey* m_morphKeys; // 0x1c LegoMorphKey* m_morphKeys; // 0x1c
LegoU16 m_unk0x20; // 0x20 LegoU16 m_roiIndex; // 0x20
LegoU16 m_unk0x22; // 0x22 LegoU16 m_unk0x22; // 0x22
LegoU32 m_translationIndex; // 0x24 LegoU32 m_translationIndex; // 0x24
LegoU32 m_rotationIndex; // 0x28 LegoU32 m_rotationIndex; // 0x28

View File

@ -338,7 +338,7 @@ done:
} }
// FUNCTION: LEGO1 0x100a8cb0 // FUNCTION: LEGO1 0x100a8cb0
LegoResult LegoROI::FUN_100a8cb0(LegoAnimNodeData* p_data, LegoTime p_time, Matrix4& p_matrix) LegoResult LegoROI::CreateLocalTransform(LegoAnimNodeData* p_data, LegoTime p_time, Matrix4& p_matrix)
{ {
p_matrix.SetIdentity(); p_matrix.SetIdentity();
p_data->CreateLocalTransform(p_time, p_matrix); p_data->CreateLocalTransform(p_time, p_matrix);
@ -380,27 +380,32 @@ LegoROI* LegoROI::FindChildROI(const LegoChar* p_name, LegoROI* p_roi)
} }
// FUNCTION: LEGO1 0x100a8da0 // FUNCTION: LEGO1 0x100a8da0
LegoResult LegoROI::FUN_100a8da0(LegoTreeNode* p_node, const Matrix4& p_matrix, LegoTime p_time, LegoROI* p_roi) LegoResult LegoROI::ApplyAnimationTransformation(
LegoTreeNode* p_node,
const Matrix4& p_matrix,
LegoTime p_time,
LegoROI* p_parentROI
)
{ {
MxMatrix mat; MxMatrix mat;
LegoAnimNodeData* data = (LegoAnimNodeData*) p_node->GetData(); LegoAnimNodeData* data = (LegoAnimNodeData*) p_node->GetData();
const LegoChar* name = data->GetName(); const LegoChar* name = data->GetName();
LegoROI* roi = FindChildROI(name, p_roi); LegoROI* roi = FindChildROI(name, p_parentROI);
if (roi == NULL) { if (roi == NULL) {
roi = FindChildROI(name, this); roi = FindChildROI(name, this);
} }
if (roi != NULL) { if (roi != NULL) {
FUN_100a8cb0(data, p_time, mat); CreateLocalTransform(data, p_time, mat);
roi->m_local2world.Product(mat, p_matrix); roi->m_local2world.Product(mat, p_matrix);
roi->UpdateWorldData(); roi->UpdateWorldData();
LegoBool und = data->FUN_100a0990(p_time); LegoBool und = data->GetVisibility(p_time);
roi->SetVisibility(und); roi->SetVisibility(und);
for (LegoU32 i = 0; i < p_node->GetNumChildren(); i++) { for (LegoU32 i = 0; i < p_node->GetNumChildren(); i++) {
FUN_100a8da0(p_node->GetChild(i), roi->m_local2world, p_time, roi); ApplyAnimationTransformation(p_node->GetChild(i), roi->m_local2world, p_time, roi);
} }
} }
else { else {
@ -417,14 +422,14 @@ void LegoROI::FUN_100a8e80(LegoTreeNode* p_node, Matrix4& p_matrix, LegoTime p_t
MxMatrix mat; MxMatrix mat;
LegoAnimNodeData* data = (LegoAnimNodeData*) p_node->GetData(); LegoAnimNodeData* data = (LegoAnimNodeData*) p_node->GetData();
FUN_100a8cb0(data, p_time, mat); CreateLocalTransform(data, p_time, mat);
LegoROI* roi = p_roiMap[data->GetUnknown0x20()]; LegoROI* roi = p_roiMap[data->GetROIIndex()];
if (roi != NULL) { if (roi != NULL) {
roi->m_local2world.Product(mat, p_matrix); roi->m_local2world.Product(mat, p_matrix);
roi->UpdateWorldData(); roi->UpdateWorldData();
LegoBool und = data->FUN_100a0990(p_time); LegoBool und = data->GetVisibility(p_time);
roi->SetVisibility(und); roi->SetVisibility(und);
for (LegoU32 i = 0; i < p_node->GetNumChildren(); i++) { for (LegoU32 i = 0; i < p_node->GetNumChildren(); i++) {
@ -448,9 +453,9 @@ void LegoROI::FUN_100a8fd0(LegoTreeNode* p_node, Matrix4& p_matrix, LegoTime p_t
MxMatrix mat; MxMatrix mat;
LegoAnimNodeData* data = (LegoAnimNodeData*) p_node->GetData(); LegoAnimNodeData* data = (LegoAnimNodeData*) p_node->GetData();
FUN_100a8cb0(data, p_time, mat); CreateLocalTransform(data, p_time, mat);
LegoROI* roi = p_roiMap[data->GetUnknown0x20()]; LegoROI* roi = p_roiMap[data->GetROIIndex()];
if (roi != NULL) { if (roi != NULL) {
roi->m_local2world.Product(mat, p_matrix); roi->m_local2world.Product(mat, p_matrix);
@ -475,9 +480,9 @@ LegoResult LegoROI::SetFrame(LegoAnim* p_anim, LegoTime p_time)
MxMatrix mat; MxMatrix mat;
mat = m_local2world; mat = m_local2world;
mat.SetIdentity(); mat.SetIdentity(); // this clears the matrix, assignment above is redundant
return FUN_100a8da0(root, mat, p_time, this); return ApplyAnimationTransformation(root, mat, p_time, this);
} }
// FUNCTION: LEGO1 0x100a9170 // FUNCTION: LEGO1 0x100a9170

View File

@ -33,7 +33,12 @@ public:
LegoStorage* p_storage LegoStorage* p_storage
); );
LegoROI* FindChildROI(const LegoChar* p_name, LegoROI* p_roi); LegoROI* FindChildROI(const LegoChar* p_name, LegoROI* p_roi);
LegoResult FUN_100a8da0(LegoTreeNode* p_node, const Matrix4& p_matrix, LegoTime p_time, LegoROI* p_roi); LegoResult ApplyAnimationTransformation(
LegoTreeNode* p_node,
const Matrix4& p_matrix,
LegoTime p_time,
LegoROI* p_roi
);
static void FUN_100a8e80(LegoTreeNode* p_node, Matrix4& p_matrix, LegoTime p_time, LegoROI** p_roiMap); static void FUN_100a8e80(LegoTreeNode* p_node, Matrix4& p_matrix, LegoTime p_time, LegoROI** p_roiMap);
static void FUN_100a8fd0(LegoTreeNode* p_node, Matrix4& p_matrix, LegoTime p_time, LegoROI** p_roiMap); static void FUN_100a8fd0(LegoTreeNode* p_node, Matrix4& p_matrix, LegoTime p_time, LegoROI** p_roiMap);
LegoResult SetFrame(LegoAnim* p_anim, LegoTime p_time); LegoResult SetFrame(LegoAnim* p_anim, LegoTime p_time);
@ -52,7 +57,7 @@ public:
void ClearMeshOffset(); void ClearMeshOffset();
void SetDisplayBB(int p_displayBB); void SetDisplayBB(int p_displayBB);
static LegoResult FUN_100a8cb0(LegoAnimNodeData* p_data, LegoTime p_time, Matrix4& p_matrix); static LegoResult CreateLocalTransform(LegoAnimNodeData* p_data, LegoTime p_time, Matrix4& p_matrix);
static void FUN_100a81b0(const LegoChar* p_error, const LegoChar* p_name); static void FUN_100a81b0(const LegoChar* p_error, const LegoChar* p_name);
LEGO1_EXPORT static void configureLegoROI(int p_roi); LEGO1_EXPORT static void configureLegoROI(int p_roi);
static void SetColorOverride(ColorOverride p_colorOverride); static void SetColorOverride(ColorOverride p_colorOverride);

View File

@ -25,7 +25,7 @@ float g_minLODThreshold = 0.00097656297;
int g_maxLODLevels = 6; int g_maxLODLevels = 6;
// GLOBAL: LEGO1 0x1010105c // GLOBAL: LEGO1 0x1010105c
float g_unk0x1010105c = 0.000125F; float g_viewDistance = 0.000125F;
// GLOBAL: LEGO1 0x10101060 // GLOBAL: LEGO1 0x10101060
float g_elapsedSeconds = 0; float g_elapsedSeconds = 0;
@ -65,19 +65,19 @@ unsigned int ViewManager::IsBoundingBoxInFrustum(const BoundingBox& p_bounding_b
{ {
const Vector3* box[] = {&p_bounding_box.Min(), &p_bounding_box.Max()}; const Vector3* box[] = {&p_bounding_box.Min(), &p_bounding_box.Max()};
float und[8][3]; float box_corners[8][3];
int i, j, k; int i, j, k;
for (i = 0; i < 8; i++) { for (i = 0; i < 8; i++) {
for (j = 0; j < 3; j++) { for (j = 0; j < 3; j++) {
und[i][j] = box[g_boundingBoxCornerMap[i][j]]->operator[](j); box_corners[i][j] = box[g_boundingBoxCornerMap[i][j]]->operator[](j);
} }
} }
for (i = 0; i < 6; i++) { for (i = 0; i < 6; i++) {
for (k = 0; k < 8; k++) { for (k = 0; k < 8; k++) {
if (frustum_planes[i][0] * und[k][0] + frustum_planes[i][2] * und[k][2] + frustum_planes[i][1] * und[k][1] + if (frustum_planes[i][0] * box_corners[k][0] + frustum_planes[i][2] * box_corners[k][2] +
frustum_planes[i][3] >= frustum_planes[i][1] * box_corners[k][1] + frustum_planes[i][3] >=
0.0f) { 0.0f) {
break; break;
} }
@ -98,7 +98,7 @@ void ViewManager::Remove(ViewROI* p_roi)
if (*it == p_roi) { if (*it == p_roi) {
rois.erase(it); rois.erase(it);
if (p_roi->GetUnknown0xe0() >= 0) { if (p_roi->GetLodLevel() >= 0) {
RemoveROIDetailFromScene(p_roi); RemoveROIDetailFromScene(p_roi);
} }
@ -106,7 +106,7 @@ void ViewManager::Remove(ViewROI* p_roi)
if (comp != NULL) { if (comp != NULL) {
for (CompoundObject::const_iterator it = comp->begin(); !(it == comp->end()); it++) { for (CompoundObject::const_iterator it = comp->begin(); !(it == comp->end()); it++) {
if (((ViewROI*) *it)->GetUnknown0xe0() >= 0) { if (((ViewROI*) *it)->GetLodLevel() >= 0) {
RemoveROIDetailFromScene((ViewROI*) *it); RemoveROIDetailFromScene((ViewROI*) *it);
} }
} }
@ -128,11 +128,11 @@ void ViewManager::RemoveAll(ViewROI* p_roi)
rois.erase(rois.begin(), rois.end()); rois.erase(rois.begin(), rois.end());
} }
else { else {
if (p_roi->GetUnknown0xe0() >= 0) { if (p_roi->GetLodLevel() >= 0) {
RemoveROIDetailFromScene(p_roi); RemoveROIDetailFromScene(p_roi);
} }
p_roi->SetUnknown0xe0(-1); p_roi->SetLodLevel(ViewROI::c_lodLevelUnset);
const CompoundObject* comp = p_roi->GetComp(); const CompoundObject* comp = p_roi->GetComp();
if (comp != NULL) { if (comp != NULL) {
@ -146,15 +146,15 @@ void ViewManager::RemoveAll(ViewROI* p_roi)
} }
// FUNCTION: LEGO1 0x100a65b0 // FUNCTION: LEGO1 0x100a65b0
void ViewManager::UpdateROIDetailBasedOnLOD(ViewROI* p_roi, int p_und) void ViewManager::UpdateROIDetailBasedOnLOD(ViewROI* p_roi, int p_lodLevel)
{ {
if (p_roi->GetLODCount() <= p_und) { if (p_roi->GetLODCount() <= p_lodLevel) {
p_und = p_roi->GetLODCount() - 1; p_lodLevel = p_roi->GetLODCount() - 1;
} }
int unk0xe0 = p_roi->GetUnknown0xe0(); int lodLevel = p_roi->GetLodLevel();
if (unk0xe0 == p_und) { if (lodLevel == p_lodLevel) {
return; return;
} }
@ -162,8 +162,8 @@ void ViewManager::UpdateROIDetailBasedOnLOD(ViewROI* p_roi, int p_und)
Tgl::MeshBuilder* meshBuilder; Tgl::MeshBuilder* meshBuilder;
ViewLOD* lod; ViewLOD* lod;
if (unk0xe0 < 0) { if (lodLevel < 0) {
lod = (ViewLOD*) p_roi->GetLOD(p_und); lod = (ViewLOD*) p_roi->GetLOD(p_lodLevel);
if (lod->GetUnknown0x08() & ViewLOD::c_bit4) { if (lod->GetUnknown0x08() & ViewLOD::c_bit4) {
scene->Add(group); scene->Add(group);
@ -171,7 +171,7 @@ void ViewManager::UpdateROIDetailBasedOnLOD(ViewROI* p_roi, int p_und)
} }
} }
else { else {
lod = (ViewLOD*) p_roi->GetLOD(unk0xe0); lod = (ViewLOD*) p_roi->GetLOD(lodLevel);
if (lod != NULL) { if (lod != NULL) {
meshBuilder = lod->GetMeshBuilder(); meshBuilder = lod->GetMeshBuilder();
@ -181,7 +181,7 @@ void ViewManager::UpdateROIDetailBasedOnLOD(ViewROI* p_roi, int p_und)
} }
} }
lod = (ViewLOD*) p_roi->GetLOD(p_und); lod = (ViewLOD*) p_roi->GetLOD(p_lodLevel);
} }
if (lod->GetUnknown0x08() & ViewLOD::c_bit4) { if (lod->GetUnknown0x08() & ViewLOD::c_bit4) {
@ -190,18 +190,18 @@ void ViewManager::UpdateROIDetailBasedOnLOD(ViewROI* p_roi, int p_und)
if (meshBuilder != NULL) { if (meshBuilder != NULL) {
group->Add(meshBuilder); group->Add(meshBuilder);
SetAppData(p_roi, reinterpret_cast<LPD3DRM_APPDATA>(p_roi)); SetAppData(p_roi, reinterpret_cast<LPD3DRM_APPDATA>(p_roi));
p_roi->SetUnknown0xe0(p_und); p_roi->SetLodLevel(p_lodLevel);
return; return;
} }
} }
p_roi->SetUnknown0xe0(-1); p_roi->SetLodLevel(ViewROI::c_lodLevelUnset);
} }
// FUNCTION: LEGO1 0x100a66a0 // FUNCTION: LEGO1 0x100a66a0
void ViewManager::RemoveROIDetailFromScene(ViewROI* p_roi) void ViewManager::RemoveROIDetailFromScene(ViewROI* p_roi)
{ {
const ViewLOD* lod = (const ViewLOD*) p_roi->GetLOD(p_roi->GetUnknown0xe0()); const ViewLOD* lod = (const ViewLOD*) p_roi->GetLOD(p_roi->GetLodLevel());
if (lod != NULL) { if (lod != NULL) {
const Tgl::MeshBuilder* meshBuilder = NULL; const Tgl::MeshBuilder* meshBuilder = NULL;
@ -216,60 +216,61 @@ void ViewManager::RemoveROIDetailFromScene(ViewROI* p_roi)
scene->Remove(roiGeometry); scene->Remove(roiGeometry);
} }
p_roi->SetUnknown0xe0(-1); p_roi->SetLodLevel(ViewROI::c_lodLevelUnset);
} }
// FUNCTION: LEGO1 0x100a66f0 // FUNCTION: LEGO1 0x100a66f0
// FUNCTION: BETA10 0x1017297f // FUNCTION: BETA10 0x1017297f
inline void ViewManager::ManageVisibilityAndDetailRecursively(ViewROI* p_from, int p_und) inline void ViewManager::ManageVisibilityAndDetailRecursively(ViewROI* p_from, int p_lodLevel)
{ {
assert(p_from); assert(p_from);
if (!p_from->GetVisibility() && p_und != -2) { if (!p_from->GetVisibility() && p_lodLevel != ViewROI::c_lodLevelInvisible) {
ManageVisibilityAndDetailRecursively(p_from, -2); ManageVisibilityAndDetailRecursively(p_from, ViewROI::c_lodLevelInvisible);
} }
else { else {
const CompoundObject* comp = p_from->GetComp(); const CompoundObject* comp = p_from->GetComp();
if (p_und == -1) { if (p_lodLevel == ViewROI::c_lodLevelUnset) {
if (p_from->GetWorldBoundingSphere().Radius() > 0.001F) { if (p_from->GetWorldBoundingSphere().Radius() > 0.001F) {
float und = ProjectedSize(p_from->GetWorldBoundingSphere()); float projectedSize = ProjectedSize(p_from->GetWorldBoundingSphere());
if (und < seconds_allowed * g_unk0x1010105c) { if (projectedSize < seconds_allowed * g_viewDistance) {
if (p_from->GetUnknown0xe0() != -2) { if (p_from->GetLodLevel() != ViewROI::c_lodLevelInvisible) {
ManageVisibilityAndDetailRecursively(p_from, -2); ManageVisibilityAndDetailRecursively(p_from, ViewROI::c_lodLevelInvisible);
} }
return; return;
} }
else { else {
p_und = CalculateLODLevel(und, RealtimeView::GetUserMaxLodPower() * seconds_allowed, p_from); p_lodLevel =
CalculateLODLevel(projectedSize, RealtimeView::GetUserMaxLodPower() * seconds_allowed, p_from);
} }
} }
} }
if (p_und == -2) { if (p_lodLevel == ViewROI::c_lodLevelInvisible) {
if (p_from->GetUnknown0xe0() >= 0) { if (p_from->GetLodLevel() >= 0) {
RemoveROIDetailFromScene(p_from); RemoveROIDetailFromScene(p_from);
p_from->SetUnknown0xe0(-2); p_from->SetLodLevel(ViewROI::c_lodLevelInvisible);
} }
if (comp != NULL) { if (comp != NULL) {
for (CompoundObject::const_iterator it = comp->begin(); it != comp->end(); it++) { for (CompoundObject::const_iterator it = comp->begin(); it != comp->end(); it++) {
ManageVisibilityAndDetailRecursively((ViewROI*) *it, p_und); ManageVisibilityAndDetailRecursively((ViewROI*) *it, p_lodLevel);
} }
} }
} }
else if (comp == NULL) { else if (comp == NULL) {
if (p_from->GetLODs() != NULL && p_from->GetLODCount() > 0) { if (p_from->GetLODs() != NULL && p_from->GetLODCount() > 0) {
UpdateROIDetailBasedOnLOD(p_from, p_und); UpdateROIDetailBasedOnLOD(p_from, p_lodLevel);
} }
} }
else { else {
p_from->SetUnknown0xe0(-1); p_from->SetLodLevel(ViewROI::c_lodLevelUnset);
for (CompoundObject::const_iterator it = comp->begin(); it != comp->end(); it++) { for (CompoundObject::const_iterator it = comp->begin(); it != comp->end(); it++) {
ManageVisibilityAndDetailRecursively((ViewROI*) *it, p_und); ManageVisibilityAndDetailRecursively((ViewROI*) *it, p_lodLevel);
} }
} }
} }
@ -292,7 +293,7 @@ void ViewManager::Update(float p_previousRenderTime, float)
} }
for (CompoundObject::iterator it = rois.begin(); it != rois.end(); it++) { for (CompoundObject::iterator it = rois.begin(); it != rois.end(); it++) {
ManageVisibilityAndDetailRecursively((ViewROI*) *it, -1); ManageVisibilityAndDetailRecursively((ViewROI*) *it, ViewROI::c_lodLevelUnset);
} }
stopWatch.Stop(); stopWatch.Stop();
@ -353,37 +354,37 @@ inline int ViewManager::CalculateFrustumTransformations()
} }
// FUNCTION: BETA10 0x10172be5 // FUNCTION: BETA10 0x10172be5
inline int ViewManager::CalculateLODLevel(float p_und1, float p_und2, ViewROI* from) inline int ViewManager::CalculateLODLevel(float p_maximumScale, float p_initialScale, ViewROI* from)
{ {
int result; int lodLevel;
assert(from); assert(from);
if (IsROIVisibleAtLOD(from) != 0) { if (GetFirstLODIndex(from) != 0) {
if (p_und1 < g_minLODThreshold) { if (p_maximumScale < g_minLODThreshold) {
return 0; return 0;
} }
else { else {
result = 1; lodLevel = 1;
} }
} }
else { else {
result = 0; lodLevel = 0;
} }
for (float i = p_und2; result < g_maxLODLevels; result++) { for (float i = p_initialScale; lodLevel < g_maxLODLevels; lodLevel++) {
if (i >= p_und1) { if (i >= p_maximumScale) {
break; break;
} }
i *= g_LODScaleFactor; i *= g_LODScaleFactor;
} }
return result; return lodLevel;
} }
// FUNCTION: BETA10 0x10172cb0 // FUNCTION: BETA10 0x10172cb0
inline int ViewManager::IsROIVisibleAtLOD(ViewROI* p_roi) inline int ViewManager::GetFirstLODIndex(ViewROI* p_roi)
{ {
const LODListBase* lods = p_roi->GetLODs(); const LODListBase* lods = p_roi->GetLODs();

View File

@ -29,20 +29,20 @@ public:
void Remove(ViewROI* p_roi); void Remove(ViewROI* p_roi);
LEGO1_EXPORT void RemoveAll(ViewROI* p_roi); LEGO1_EXPORT void RemoveAll(ViewROI* p_roi);
unsigned int IsBoundingBoxInFrustum(const BoundingBox& p_bounding_box); unsigned int IsBoundingBoxInFrustum(const BoundingBox& p_bounding_box);
void UpdateROIDetailBasedOnLOD(ViewROI* p_roi, int p_und); void UpdateROIDetailBasedOnLOD(ViewROI* p_roi, int p_lodLevel);
void RemoveROIDetailFromScene(ViewROI* p_roi); void RemoveROIDetailFromScene(ViewROI* p_roi);
void SetPOVSource(const OrientableROI* point_of_view); void SetPOVSource(const OrientableROI* point_of_view);
float ProjectedSize(const BoundingSphere& p_bounding_sphere); float ProjectedSize(const BoundingSphere& p_bounding_sphere);
ViewROI* Pick(Tgl::View* p_view, unsigned int x, unsigned int y); ViewROI* Pick(Tgl::View* p_view, unsigned int x, unsigned int y);
void SetResolution(int width, int height); void SetResolution(int width, int height);
void SetFrustrum(float fov, float front, float back); void SetFrustrum(float fov, float front, float back);
inline void ManageVisibilityAndDetailRecursively(ViewROI* p_from, int p_und); inline void ManageVisibilityAndDetailRecursively(ViewROI* p_from, int p_lodLevel);
void Update(float p_previousRenderTime, float); void Update(float p_previousRenderTime, float);
inline int CalculateFrustumTransformations(); inline int CalculateFrustumTransformations();
void UpdateViewTransformations(); void UpdateViewTransformations();
inline static int CalculateLODLevel(float p_und1, float p_und2, ViewROI* from); inline static int CalculateLODLevel(float p_maximumScale, float p_initalScale, ViewROI* from);
inline static int IsROIVisibleAtLOD(ViewROI* p_roi); inline static int GetFirstLODIndex(ViewROI* p_roi);
// FUNCTION: BETA10 0x100576b0 // FUNCTION: BETA10 0x100576b0
const CompoundObject& GetROIs() { return rois; } const CompoundObject& GetROIs() { return rois; }

View File

@ -16,11 +16,16 @@
// SIZE 0xe4 // SIZE 0xe4
class ViewROI : public OrientableROI { class ViewROI : public OrientableROI {
public: public:
enum {
c_lodLevelUnset = -1,
c_lodLevelInvisible = -2,
};
ViewROI(Tgl::Renderer* pRenderer, ViewLODList* lodList) ViewROI(Tgl::Renderer* pRenderer, ViewLODList* lodList)
{ {
SetLODList(lodList); SetLODList(lodList);
geometry = pRenderer->CreateGroup(); geometry = pRenderer->CreateGroup();
m_unk0xe0 = -1; m_lodLevel = c_lodLevelUnset;
} }
// FUNCTION: LEGO1 0x100a9e20 // FUNCTION: LEGO1 0x100a9e20
@ -56,8 +61,8 @@ public:
virtual Tgl::Group* GetGeometry(); // vtable+0x30 virtual Tgl::Group* GetGeometry(); // vtable+0x30
virtual const Tgl::Group* GetGeometry() const; // vtable+0x34 virtual const Tgl::Group* GetGeometry() const; // vtable+0x34
int GetUnknown0xe0() { return m_unk0xe0; } int GetLodLevel() { return m_lodLevel; }
void SetUnknown0xe0(int p_unk0xe0) { m_unk0xe0 = p_unk0xe0; } void SetLodLevel(int p_lodLevel) { m_lodLevel = p_lodLevel; }
static unsigned char SetLightSupport(unsigned char p_lightSupport); static unsigned char SetLightSupport(unsigned char p_lightSupport);
@ -65,7 +70,7 @@ protected:
void UpdateWorldDataWithTransformAndChildren(const Matrix4& parent2world) override; // vtable+0x28 void UpdateWorldDataWithTransformAndChildren(const Matrix4& parent2world) override; // vtable+0x28
Tgl::Group* geometry; // 0xdc Tgl::Group* geometry; // 0xdc
int m_unk0xe0; // 0xe0 int m_lodLevel; // 0xe0
}; };
// SYNTHETIC: LEGO1 0x100aa250 // SYNTHETIC: LEGO1 0x100aa250