Merge pull request from foxtacles/isle-merge

Merge from isledecomp/isle
This commit is contained in:
Christian Semmler 2024-12-25 09:05:20 -07:00 committed by GitHub
commit d3cdec8b5d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
48 changed files with 313 additions and 273 deletions

View file

@ -145,11 +145,9 @@ else()
endif() endif()
add_lego1_static_library(realtime add_lego1_static_library(realtime
LEGO1/realtime/matrix.cpp
LEGO1/realtime/orientableroi.cpp LEGO1/realtime/orientableroi.cpp
LEGO1/realtime/realtime.cpp LEGO1/realtime/realtime.cpp
LEGO1/realtime/realtimeview.cpp LEGO1/realtime/realtimeview.cpp
LEGO1/realtime/vector.cpp
) )
target_include_directories(realtime-interface INTERFACE "${CMAKE_SOURCE_DIR}/LEGO1" "${CMAKE_SOURCE_DIR}/util") target_include_directories(realtime-interface INTERFACE "${CMAKE_SOURCE_DIR}/LEGO1" "${CMAKE_SOURCE_DIR}/util")
target_link_libraries(realtime-interface INTERFACE Vec::Vec) target_link_libraries(realtime-interface INTERFACE Vec::Vec)

View file

@ -41,7 +41,7 @@ public:
void Mute(MxBool p_muted); void Mute(MxBool p_muted);
private: private:
static LegoChar* g_lodNames[]; static const LegoChar* g_lodNames[];
static MxLong g_lastHitActorTime; static MxLong g_lastHitActorTime;
LegoCacheSound* m_whistleSound; // 0x154 LegoCacheSound* m_whistleSound; // 0x154

View file

@ -29,22 +29,28 @@ public:
MxResult Serialize(LegoFile* p_file) override; // vtable+0x1c MxResult Serialize(LegoFile* p_file) override; // vtable+0x1c
// FUNCTION: BETA10 0x10088770
MxS16 GetHighScore(MxU8 p_actorId) MxS16 GetHighScore(MxU8 p_actorId)
{ {
switch (p_actorId) { switch (p_actorId) {
case LegoActor::c_pepper: case LegoActor::c_pepper:
return m_peHighScore; return m_peHighScore;
break;
case LegoActor::c_mama: case LegoActor::c_mama:
return m_maHighScore; return m_maHighScore;
break;
case LegoActor::c_papa: case LegoActor::c_papa:
return m_paHighScore; return m_paHighScore;
break;
case LegoActor::c_nick: case LegoActor::c_nick:
return m_niHighScore; return m_niHighScore;
break;
case LegoActor::c_laura: case LegoActor::c_laura:
return m_laHighScore; return m_laHighScore;
default: break;
return 0;
} }
return 0;
} }
// FUNCTION: BETA10 0x100242d0 // FUNCTION: BETA10 0x100242d0

View file

@ -167,7 +167,7 @@ public:
MxBool FindVehicle(const char* p_name, MxU32& p_index); MxBool FindVehicle(const char* p_name, MxU32& p_index);
MxResult ReadAnimInfo(LegoFile* p_file, AnimInfo* p_info); MxResult ReadAnimInfo(LegoFile* p_file, AnimInfo* p_info);
MxResult ReadModelInfo(LegoFile* p_file, ModelInfo* p_info); MxResult ReadModelInfo(LegoFile* p_file, ModelInfo* p_info);
void FUN_10060480(LegoChar* p_characterNames[], MxU32 p_numCharacterNames); void FUN_10060480(const LegoChar* p_characterNames[], MxU32 p_numCharacterNames);
void FUN_100604d0(MxBool p_unk0x08); void FUN_100604d0(MxBool p_unk0x08);
void FUN_100604f0(MxS32 p_objectIds[], MxU32 p_numObjectIds); void FUN_100604f0(MxS32 p_objectIds[], MxU32 p_numObjectIds);
void FUN_10060540(MxBool p_unk0x29); void FUN_10060540(MxBool p_unk0x29);

View file

@ -86,6 +86,8 @@ public:
MxBool GetUnknown0x10IsSet(MxU8 p_flag) { return m_unk0x10 & p_flag; } MxBool GetUnknown0x10IsSet(MxU8 p_flag) { return m_unk0x10 & p_flag; }
MxBool GetFlagsIsSet(MxU8 p_flag) { return m_flags & p_flag; } MxBool GetFlagsIsSet(MxU8 p_flag) { return m_flags & p_flag; }
MxU8 GetFlags() { return m_flags; } MxU8 GetFlags() { return m_flags; }
// FUNCTION: BETA10 0x10049db0
MxFloat GetWorldSpeed() { return m_worldSpeed; } MxFloat GetWorldSpeed() { return m_worldSpeed; }
// FUNCTION: BETA10 0x1000f2f0 // FUNCTION: BETA10 0x1000f2f0

View file

@ -34,6 +34,8 @@ public:
} }
MxS16 GetUnknown0x02() { return m_unk0x02; } MxS16 GetUnknown0x02() { return m_unk0x02; }
// FUNCTION: BETA10 0x10088970
MxS16 GetHighScore() { return m_score; } MxS16 GetHighScore() { return m_score; }
// FUNCTION: BETA10 0x100c96f0 // FUNCTION: BETA10 0x100c96f0

View file

@ -148,6 +148,7 @@ public:
// FUNCTION: BETA10 0x100ef850 // FUNCTION: BETA10 0x100ef850
MxU32 GetUnknown0xb0() { return m_unk0xb0; } MxU32 GetUnknown0xb0() { return m_unk0xb0; }
// 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; }
// SYNTHETIC: LEGO1 0x10039350 // SYNTHETIC: LEGO1 0x10039350

View file

@ -59,6 +59,9 @@ public:
~Score() override; ~Score() override;
MxLong Notify(MxParam& p_param) override; // vtable+0x04 MxLong Notify(MxParam& p_param) override; // vtable+0x04
// FUNCTION: LEGO1 0x100010b0
MxBool VTable0x5c() override { return TRUE; } // vtable+0x5c
// FUNCTION: LEGO1 0x100010c0 // FUNCTION: LEGO1 0x100010c0
// FUNCTION: BETA10 0x100f4f20 // FUNCTION: BETA10 0x100f4f20
const char* ClassName() const override // vtable+0x0c const char* ClassName() const override // vtable+0x0c
@ -78,14 +81,13 @@ public:
MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18
void ReadyWorld() override; // vtable+0x50 void ReadyWorld() override; // vtable+0x50
MxBool VTable0x5c() override; // vtable+0x5c
MxBool Escape() override; // vtable+0x64 MxBool Escape() override; // vtable+0x64
void Enable(MxBool p_enable) override; // vtable+0x68 void Enable(MxBool p_enable) override; // vtable+0x68
void Paint(); void Paint();
MxLong FUN_10001510(MxEndActionNotificationParam& p_param); MxLong FUN_10001510(MxEndActionNotificationParam& p_param);
MxLong FUN_100016d0(LegoControlManagerNotificationParam& p_param); MxLong FUN_100016d0(LegoControlManagerNotificationParam& p_param);
void FillArea(MxU32 i_activity, MxU32 i_actor, MxS16 score); void FillArea(MxS32 i_activity, MxS32 i_actor, MxS16 score);
protected: protected:
void DeleteScript(); void DeleteScript();

View file

@ -34,7 +34,7 @@ public:
MxLong HandleControl(LegoControlManagerNotificationParam& p_param) override; // vtable+0xd4 MxLong HandleControl(LegoControlManagerNotificationParam& p_param) override; // vtable+0xd4
void Exit() override; // vtable+0xe4 void Exit() override; // vtable+0xe4
void SetUnknown0x160(MxBool p_unk0x160) { m_unk0x160 = p_unk0x160; } void SetPizzaVisible(MxBool p_pizzaVisible) { m_pizzaVisible = p_pizzaVisible; }
void ActivateSceneActions(); void ActivateSceneActions();
void EnableScenePresentation(MxBool p_enable); void EnableScenePresentation(MxBool p_enable);
@ -43,7 +43,7 @@ public:
// SkateBoard::`scalar deleting destructor' // SkateBoard::`scalar deleting destructor'
private: private:
MxBool m_unk0x160; // 0x160 MxBool m_pizzaVisible; // 0x160
Act1State* m_act1state; // 0x164 Act1State* m_act1state; // 0x164
}; };

View file

@ -30,22 +30,28 @@ public:
MxResult Serialize(LegoFile* p_file) override; // vtable+0x1c MxResult Serialize(LegoFile* p_file) override; // vtable+0x1c
// FUNCTION: BETA10 0x10088890
MxS16 GetHighScore(MxU8 p_actorId) MxS16 GetHighScore(MxU8 p_actorId)
{ {
switch (p_actorId) { switch (p_actorId) {
case LegoActor::c_pepper: case LegoActor::c_pepper:
return m_peHighScore; return m_peHighScore;
break;
case LegoActor::c_mama: case LegoActor::c_mama:
return m_maHighScore; return m_maHighScore;
break;
case LegoActor::c_papa: case LegoActor::c_papa:
return m_paHighScore; return m_paHighScore;
break;
case LegoActor::c_nick: case LegoActor::c_nick:
return m_niHighScore; return m_niHighScore;
break;
case LegoActor::c_laura: case LegoActor::c_laura:
return m_laHighScore; return m_laHighScore;
default: break;
return 0;
} }
return 0;
} }
// FUNCTION: BETA10 0x100f8530 // FUNCTION: BETA10 0x100f8530

View file

@ -311,7 +311,7 @@ void Act2Actor::Animate(float p_time)
local30 -= local60; local30 -= local60;
local30.Unitize(); local30.Unitize();
MxFloat dotproduct = local18.Dot(&local30, &local18); MxFloat dotproduct = local18.Dot(local30, local18);
if (dotproduct >= 0.0) { if (dotproduct >= 0.0) {
const MxFloat* pepperWorldPosition = roiPepper->GetWorldPosition(); const MxFloat* pepperWorldPosition = roiPepper->GetWorldPosition();
@ -613,9 +613,9 @@ MxU32 Act2Actor::FUN_10019700(MxFloat p_param)
col2 = col3; col2 = col3;
col2 -= m_unk0x4c->GetROI()->GetWorldPosition(); col2 -= m_unk0x4c->GetROI()->GetWorldPosition();
col2.Unitize(); col2.Unitize();
col0.EqualsCross(&col1, &col2); col0.EqualsCross(col1, col2);
col0.Unitize(); col0.Unitize();
col1.EqualsCross(&col2, &col0); col1.EqualsCross(col2, col0);
assert(!m_cameraFlag); assert(!m_cameraFlag);

View file

@ -239,7 +239,7 @@ void Act3Cop::ParseAction(char* p_extra)
for (MxS32 j = 0; j < boundary->GetNumEdges(); j++) { for (MxS32 j = 0; j < boundary->GetNumEdges(); j++) {
Mx4DPointFloat* edgeNormal = boundary->GetEdgeNormal(j); Mx4DPointFloat* edgeNormal = boundary->GetEdgeNormal(j);
if (point.Dot(edgeNormal, &point) + edgeNormal->index_operator(3) < -0.001) { if (point.Dot(*edgeNormal, point) + edgeNormal->index_operator(3) < -0.001) {
MxTrace("Bad Act3 cop destination %d\n", i); MxTrace("Bad Act3 cop destination %d\n", i);
break; break;
} }
@ -247,8 +247,8 @@ void Act3Cop::ParseAction(char* p_extra)
Mx4DPointFloat* boundary0x14 = boundary->GetUnknown0x14(); Mx4DPointFloat* boundary0x14 = boundary->GetUnknown0x14();
if (point.Dot(&point, boundary0x14) + boundary0x14->index_operator(3) <= 0.001 && if (point.Dot(point, *boundary0x14) + boundary0x14->index_operator(3) <= 0.001 &&
point.Dot(&point, boundary0x14) + boundary0x14->index_operator(3) >= -0.001) { point.Dot(point, *boundary0x14) + boundary0x14->index_operator(3) >= -0.001) {
continue; continue;
} }
@ -497,9 +497,9 @@ MxResult Act3Cop::FUN_10040360()
v3 = v4; v3 = v4;
v3 -= vecUnk; v3 -= vecUnk;
v3.Unitize(); v3.Unitize();
v1.EqualsCross(&v2, &v3); v1.EqualsCross(v2, v3);
v1.Unitize(); v1.Unitize();
v2.EqualsCross(&v3, &v1); v2.EqualsCross(v3, v1);
VTable0x9c(); VTable0x9c();
} }
@ -629,9 +629,9 @@ void Act3Brickster::Animate(float p_time)
localc = local20; localc = local20;
localc -= m_pInfo->m_position; localc -= m_pInfo->m_position;
localc.Unitize(); localc.Unitize();
local14.EqualsCross(&local28, &localc); local14.EqualsCross(local28, localc);
local14.Unitize(); local14.Unitize();
local28.EqualsCross(&localc, &local14); local28.EqualsCross(localc, local14);
assert(!m_cameraFlag); assert(!m_cameraFlag);
@ -676,9 +676,9 @@ void Act3Brickster::Animate(float p_time)
local80 -= m_unk0x3c; local80 -= m_unk0x3c;
local80.Unitize(); local80.Unitize();
local88.EqualsCross(&local9c, &local80); local88.EqualsCross(local9c, local80);
local88.Unitize(); local88.Unitize();
local9c.EqualsCross(&local80, &local88); local9c.EqualsCross(local80, local88);
assert(!m_cameraFlag); assert(!m_cameraFlag);
@ -992,9 +992,9 @@ MxResult Act3Brickster::FUN_100417c0()
v3 = v4; v3 = v4;
v3 -= vecUnk; v3 -= vecUnk;
v3.Unitize(); v3.Unitize();
v1.EqualsCross(&v2, &v3); v1.EqualsCross(v2, v3);
v1.Unitize(); v1.Unitize();
v2.EqualsCross(&v3, &v1); v2.EqualsCross(v3, v1);
VTable0x9c(); VTable0x9c();
@ -1088,7 +1088,7 @@ MxS32 Act3Brickster::FUN_10042300()
local18 = local64[local1c]; local18 = local64[local1c];
local18 -= local38; local18 -= local38;
if (maxE == NULL || (local18.Dot(&local94, &local18) < 0.0f && local78 < local98)) { if (maxE == NULL || (local18.Dot(local94, local18) < 0.0f && local78 < local98)) {
maxE = e; maxE = e;
m_boundary = boundaries[i]; m_boundary = boundaries[i];
local78 = local98; local78 = local98;

View file

@ -227,12 +227,12 @@ MxResult Act3Ammo::FUN_10053db0(float p_param1, const Matrix4& p_param2)
local14[1] = local14[2] = 0.0f; local14[1] = local14[2] = 0.0f;
local14[0] = 1.0f; local14[0] = 1.0f;
local3c.EqualsCross(&localc, &local14); local3c.EqualsCross(localc, local14);
if (local3c.Unitize() != 0) { if (local3c.Unitize() != 0) {
local14[0] = local14[1] = 0.0f; local14[0] = local14[1] = 0.0f;
local14[2] = 1.0f; local14[2] = 1.0f;
local3c.EqualsCross(&localc, &local14); local3c.EqualsCross(localc, local14);
if (local3c.Unitize() != 0) { if (local3c.Unitize() != 0) {
assert(0); assert(0);
@ -240,7 +240,7 @@ MxResult Act3Ammo::FUN_10053db0(float p_param1, const Matrix4& p_param2)
} }
} }
local14.EqualsCross(&local3c, &localc); local14.EqualsCross(local3c, localc);
return SUCCESS; return SUCCESS;
} }
@ -340,17 +340,17 @@ void Act3Ammo::Animate(float p_time)
local184 = *m_boundary->GetUnknown0x14(); local184 = *m_boundary->GetUnknown0x14();
local17c[0] = 1.0f; local17c[0] = 1.0f;
local17c[1] = local17c[2] = 0.0f; local17c[1] = local17c[2] = 0.0f;
local174.EqualsCross(&local17c, &local184); local174.EqualsCross(local17c, local184);
local174.Unitize(); local174.Unitize();
local17c.EqualsCross(&local184, &local174); local17c.EqualsCross(local184, local174);
} }
else { else {
local17c = *m_boundary->GetUnknown0x14(); local17c = *m_boundary->GetUnknown0x14();
local184[0] = 1.0f; local184[0] = 1.0f;
local184[1] = local184[2] = 0.0f; local184[1] = local184[2] = 0.0f;
local174.EqualsCross(&local17c, &local184); local174.EqualsCross(local17c, local184);
local174.Unitize(); local174.Unitize();
local184.EqualsCross(&local174, &local17c); local184.EqualsCross(local174, local17c);
} }
} }

View file

@ -21,8 +21,12 @@
DECOMP_SIZE_ASSERT(Helicopter, 0x230) DECOMP_SIZE_ASSERT(Helicopter, 0x230)
DECOMP_SIZE_ASSERT(HelicopterState, 0x0c) DECOMP_SIZE_ASSERT(HelicopterState, 0x0c)
DECOMP_SIZE_ASSERT(Vector2, 0x08)
DECOMP_SIZE_ASSERT(Vector3, 0x08)
DECOMP_SIZE_ASSERT(Vector4, 0x08)
DECOMP_SIZE_ASSERT(Mx3DPointFloat, 0x14) DECOMP_SIZE_ASSERT(Mx3DPointFloat, 0x14)
DECOMP_SIZE_ASSERT(Mx4DPointFloat, 0x18) DECOMP_SIZE_ASSERT(Mx4DPointFloat, 0x18)
DECOMP_SIZE_ASSERT(Matrix4, 0x08)
DECOMP_SIZE_ASSERT(MxMatrix, 0x48) DECOMP_SIZE_ASSERT(MxMatrix, 0x48)
// FUNCTION: LEGO1 0x10001e60 // FUNCTION: LEGO1 0x10001e60
@ -247,8 +251,8 @@ MxLong Helicopter::HandleControl(LegoControlManagerNotificationParam& p_param)
Mx3DPointFloat v68, va4, up; Mx3DPointFloat v68, va4, up;
Mx3DPointFloat v90(0, 1, 0); Mx3DPointFloat v90(0, 1, 0);
v68 = m_world->GetCamera()->GetWorldUp(); v68 = m_world->GetCamera()->GetWorldUp();
va4.EqualsCross(&v68, &direction); va4.EqualsCross(v68, direction);
up.EqualsCross(&va4, &v90); up.EqualsCross(va4, v90);
if (isPizza) { if (isPizza) {
if (((Act3*) m_world)->ShootPizza(m_pathController, location, direction, up) != SUCCESS) { if (((Act3*) m_world)->ShootPizza(m_pathController, location, direction, up) != SUCCESS) {
@ -453,9 +457,9 @@ void Helicopter::FUN_100042a0(const Matrix4& p_matrix)
vec5[0] = vec5[2] = 0.0f; vec5[0] = vec5[2] = 0.0f;
vec5[1] = -1.0f; vec5[1] = -1.0f;
vec3.EqualsCross(&vec4, &vec5); vec3.EqualsCross(vec4, vec5);
vec3.Unitize(); vec3.Unitize();
vec4.EqualsCross(&vec5, &vec3); vec4.EqualsCross(vec5, vec3);
vec6 = vec2; vec6 = vec2;
local90 = m_unk0x1a8; local90 = m_unk0x1a8;

View file

@ -133,7 +133,7 @@ void IslePathActor::Exit()
for (j = 0; j < m_boundary->GetNumEdges(); j++) { for (j = 0; j < m_boundary->GetNumEdges(); j++) {
Mx4DPointFloat& normal = *m_boundary->GetEdgeNormal(j); Mx4DPointFloat& normal = *m_boundary->GetEdgeNormal(j);
if (local20.Dot(&normal, &local20) + normal[3] < -0.001) { if (local20.Dot(normal, local20) + normal[3] < -0.001) {
break; break;
} }
} }
@ -645,7 +645,7 @@ void IslePathActor::FUN_1001b660()
Vector3 up(transform[2]); Vector3 up(transform[2]);
up *= -1.0f; up *= -1.0f;
position.EqualsCross(&direction, &up); position.EqualsCross(direction, up);
m_roi->FUN_100a58f0(transform); m_roi->FUN_100a58f0(transform);
m_roi->VTable0x14(); m_roi->VTable0x14();
} }

View file

@ -214,7 +214,7 @@ void Pizza::FUN_100382b0()
TickleManager()->UnregisterClient(this); TickleManager()->UnregisterClient(this);
m_unk0x90 = INT_MIN; m_unk0x90 = INT_MIN;
m_skateBoard->EnableScenePresentation(FALSE); m_skateBoard->EnableScenePresentation(FALSE);
m_skateBoard->SetUnknown0x160(FALSE); m_skateBoard->SetPizzaVisible(FALSE);
MxTrace("Pizza mission: idle\n"); MxTrace("Pizza mission: idle\n");
} }
} }
@ -379,7 +379,7 @@ MxResult Pizza::Tickle()
if (m_unk0x90 != INT_MIN && m_unk0x94 + m_unk0x90 <= time) { if (m_unk0x90 != INT_MIN && m_unk0x94 + m_unk0x90 <= time) {
m_unk0x90 = INT_MIN; m_unk0x90 = INT_MIN;
m_skateBoard->EnableScenePresentation(FALSE); m_skateBoard->EnableScenePresentation(FALSE);
m_skateBoard->SetUnknown0x160(FALSE); m_skateBoard->SetPizzaVisible(FALSE);
TickleManager()->UnregisterClient(this); TickleManager()->UnregisterClient(this);
} }
@ -425,7 +425,7 @@ MxResult Pizza::Tickle()
assert(m_mission); assert(m_mission);
if (Timer()->GetTime() > m_mission->m_startTime + 5000) { if (Timer()->GetTime() > m_mission->m_startTime + 5000) {
m_skateBoard->SetUnknown0x160(FALSE); m_skateBoard->SetPizzaVisible(FALSE);
m_skateBoard->EnableScenePresentation(FALSE); m_skateBoard->EnableScenePresentation(FALSE);
TickleManager()->UnregisterClient(this); TickleManager()->UnregisterClient(this);
m_mission->UpdateScore(LegoState::e_grey); m_mission->UpdateScore(LegoState::e_grey);
@ -473,7 +473,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->SetUnknown0xb0(IsleScript::c_noneIsle);
UserActor()->SetActorState(LegoPathActor::c_initial); UserActor()->SetActorState(LegoPathActor::c_initial);
m_skateBoard->SetUnknown0x160(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);
#ifdef COMPAT_MODE #ifdef COMPAT_MODE
@ -624,6 +624,7 @@ MxResult PizzaMissionState::Serialize(LegoFile* p_file)
} }
// FUNCTION: LEGO1 0x10039510 // FUNCTION: LEGO1 0x10039510
// FUNCTION: BETA10 0x100eed45
PizzaMissionState::Mission* PizzaMissionState::GetMission(MxU8 p_actorId) PizzaMissionState::Mission* PizzaMissionState::GetMission(MxU8 p_actorId)
{ {
for (MxS16 i = 0; i < 5; i++) { for (MxS16 i = 0; i < 5; i++) {

View file

@ -20,7 +20,7 @@ DECOMP_SIZE_ASSERT(SkateBoard, 0x168)
// FUNCTION: LEGO1 0x1000fd40 // FUNCTION: LEGO1 0x1000fd40
SkateBoard::SkateBoard() SkateBoard::SkateBoard()
{ {
m_unk0x160 = FALSE; m_pizzaVisible = FALSE;
m_maxLinearVel = 15.0; m_maxLinearVel = 15.0;
m_unk0x150 = 3.5; m_unk0x150 = 3.5;
m_unk0x148 = 1; m_unk0x148 = 1;
@ -60,7 +60,7 @@ void SkateBoard::Exit()
Pizza* pizza = (Pizza*) CurrentWorld()->Find(*g_isleScript, IsleScript::c_Pizza_Actor); Pizza* pizza = (Pizza*) CurrentWorld()->Find(*g_isleScript, IsleScript::c_Pizza_Actor);
pizza->StopActions(); pizza->StopActions();
pizza->FUN_100382b0(); pizza->FUN_100382b0();
m_unk0x160 = FALSE; m_pizzaVisible = FALSE;
} }
IslePathActor::Exit(); IslePathActor::Exit();
@ -97,7 +97,7 @@ MxLong SkateBoard::HandleClick()
ControlManager()->Register(this); ControlManager()->Register(this);
} }
EnableScenePresentation(m_unk0x160); EnableScenePresentation(m_pizzaVisible);
Vector3 position = m_roi->GetWorldPosition(); Vector3 position = m_roi->GetWorldPosition();
AnimationManager()->FUN_10064670(&position); AnimationManager()->FUN_10064670(&position);
@ -132,7 +132,7 @@ void SkateBoard::EnableScenePresentation(MxBool p_enable)
if (presenter) { if (presenter) {
presenter->Enable(p_enable); presenter->Enable(p_enable);
} }
else if (m_unk0x160) { else if (m_pizzaVisible) {
NotificationManager()->Send(this, MxNotificationParam(c_notificationType0, NULL)); NotificationManager()->Send(this, MxNotificationParam(c_notificationType0, NULL));
} }
} }
@ -141,7 +141,7 @@ void SkateBoard::EnableScenePresentation(MxBool p_enable)
// FUNCTION: BETA10 0x100f5472 // FUNCTION: BETA10 0x100f5472
MxLong SkateBoard::HandleNotification0() MxLong SkateBoard::HandleNotification0()
{ {
EnableScenePresentation(m_unk0x160); EnableScenePresentation(m_pizzaVisible);
return 1; return 1;
} }

View file

@ -552,7 +552,7 @@ void LegoCarBuildAnimPresenter::RotateAroundYAxis(MxFloat p_angle)
Mx4DPointFloat newRotation; Mx4DPointFloat newRotation;
additionalRotation.NormalizeQuaternion(); additionalRotation.NormalizeQuaternion();
newRotation.EqualsHamiltonProduct(&currentRotation, &additionalRotation); newRotation.EqualsHamiltonProduct(currentRotation, additionalRotation);
if (newRotation[3] < 0.9999) { if (newRotation[3] < 0.9999) {
rotationKey->FUN_100739a0(TRUE); rotationKey->FUN_100739a0(TRUE);

View file

@ -883,7 +883,7 @@ void LegoAnimationManager::DeleteAnimations()
// FUNCTION: LEGO1 0x10060480 // FUNCTION: LEGO1 0x10060480
// FUNCTION: BETA10 0x100412a9 // FUNCTION: BETA10 0x100412a9
void LegoAnimationManager::FUN_10060480(LegoChar* p_characterNames[], MxU32 p_numCharacterNames) void LegoAnimationManager::FUN_10060480(const LegoChar* p_characterNames[], MxU32 p_numCharacterNames)
{ {
for (MxS32 i = 0; i < p_numCharacterNames; i++) { for (MxS32 i = 0; i < p_numCharacterNames; i++) {
for (MxS32 j = 0; j < sizeOfArray(g_characters); j++) { for (MxS32 j = 0; j < sizeOfArray(g_characters); j++) {
@ -1598,7 +1598,7 @@ MxU16 LegoAnimationManager::FUN_10062110(
if (GetViewManager()->IsBoundingBoxInFrustum(p_roi->GetWorldBoundingBox())) { if (GetViewManager()->IsBoundingBoxInFrustum(p_roi->GetWorldBoundingBox())) {
Mx3DPointFloat direction(p_roi->GetWorldDirection()); Mx3DPointFloat direction(p_roi->GetWorldDirection());
if (direction.Dot(&direction, &p_direction) > 0.707) { if (direction.Dot(direction, p_direction) > 0.707) {
Mx3DPointFloat position(p_roi->GetWorldPosition()); Mx3DPointFloat position(p_roi->GetWorldPosition());
position -= p_position; position -= p_position;
@ -2527,7 +2527,7 @@ MxBool LegoAnimationManager::FUN_10064120(LegoLocation::Boundary* p_boundary, Mx
for (i = 0; i < numEdges; i++) { for (i = 0; i < numEdges; i++) {
e = (LegoUnknown100db7f4*) boundary->GetEdges()[i]; e = (LegoUnknown100db7f4*) boundary->GetEdges()[i];
e->FUN_1002ddc0(*boundary, vec); e->FUN_1002ddc0(*boundary, vec);
float dot = vec.Dot(&direction, &vec); float dot = vec.Dot(direction, vec);
if (dot > local4c) { if (dot > local4c) {
local50 = e; local50 = e;

View file

@ -809,7 +809,7 @@ MxResult LegoBuildingManager::FUN_10030630()
for (MxS32 j = 0; j < boundary->GetNumEdges(); j++) { for (MxS32 j = 0; j < boundary->GetNumEdges(); j++) {
Mx4DPointFloat* normal = boundary->GetEdgeNormal(j); Mx4DPointFloat* normal = boundary->GetEdgeNormal(j);
if (position.Dot(normal, &position) + (*normal).index_operator(3) < -0.001) { if (position.Dot(*normal, position) + (*normal).index_operator(3) < -0.001) {
MxTrace( MxTrace(
"Building %d shot location (%g, %g, %g) is not in boundary %s.\n", "Building %d shot location (%g, %g, %g) is not in boundary %s.\n",
i, i,
@ -826,8 +826,8 @@ MxResult LegoBuildingManager::FUN_10030630()
if (g_buildingInfo[i].m_boundary != NULL) { if (g_buildingInfo[i].m_boundary != NULL) {
Mx4DPointFloat& unk0x14 = *g_buildingInfo[i].m_boundary->GetUnknown0x14(); Mx4DPointFloat& unk0x14 = *g_buildingInfo[i].m_boundary->GetUnknown0x14();
if (position.Dot(&position, &unk0x14) + unk0x14.index_operator(3) > 0.001 || if (position.Dot(position, unk0x14) + unk0x14.index_operator(3) > 0.001 ||
position.Dot(&position, &unk0x14) + unk0x14.index_operator(3) < -0.001) { position.Dot(position, unk0x14) + unk0x14.index_operator(3) < -0.001) {
g_buildingInfo[i].m_y = g_buildingInfo[i].m_y =
-((position[0] * unk0x14.index_operator(0) + unk0x14.index_operator(3) + -((position[0] * unk0x14.index_operator(0) + unk0x14.index_operator(3) +

View file

@ -145,7 +145,7 @@ MxResult LegoPlantManager::FUN_10026410()
for (MxS32 j = 0; j < boundary->GetNumEdges(); j++) { for (MxS32 j = 0; j < boundary->GetNumEdges(); j++) {
Mx4DPointFloat* normal = boundary->GetEdgeNormal(j); Mx4DPointFloat* normal = boundary->GetEdgeNormal(j);
if (position.Dot(normal, &position) + (*normal).index_operator(3) < -0.001) { if (position.Dot(*normal, position) + (*normal).index_operator(3) < -0.001) {
MxTrace( MxTrace(
"Plant %d shot location (%g, %g, %g) is not in boundary %s.\n", "Plant %d shot location (%g, %g, %g) is not in boundary %s.\n",
i, i,
@ -162,8 +162,8 @@ MxResult LegoPlantManager::FUN_10026410()
if (g_plantInfo[i].m_boundary != NULL) { if (g_plantInfo[i].m_boundary != NULL) {
Mx4DPointFloat& unk0x14 = *g_plantInfo[i].m_boundary->GetUnknown0x14(); Mx4DPointFloat& unk0x14 = *g_plantInfo[i].m_boundary->GetUnknown0x14();
if (position.Dot(&position, &unk0x14) + unk0x14.index_operator(3) > 0.001 || if (position.Dot(position, unk0x14) + unk0x14.index_operator(3) > 0.001 ||
position.Dot(&position, &unk0x14) + unk0x14.index_operator(3) < -0.001) { position.Dot(position, unk0x14) + unk0x14.index_operator(3) < -0.001) {
g_plantInfo[i].m_y = g_plantInfo[i].m_y =
-((position[0] * unk0x14.index_operator(0) + unk0x14.index_operator(3) + -((position[0] * unk0x14.index_operator(0) + unk0x14.index_operator(3) +

View file

@ -19,7 +19,7 @@
DECOMP_SIZE_ASSERT(Act2Brick, 0x194) DECOMP_SIZE_ASSERT(Act2Brick, 0x194)
// GLOBAL: LEGO1 0x100f7a38 // GLOBAL: LEGO1 0x100f7a38
LegoChar* Act2Brick::g_lodNames[] = const LegoChar* Act2Brick::g_lodNames[] =
{"xchbase1", "xchblad1", "xchseat1", "xchtail1", "xhback1", "xhljet1", "xhmidl1", "xhmotr1", "xhsidl1", "xhsidr1"}; {"xchbase1", "xchblad1", "xchseat1", "xchtail1", "xhback1", "xhljet1", "xhmidl1", "xhmotr1", "xhsidl1", "xhsidr1"};
// GLOBAL: LEGO1 0x100f7a60 // GLOBAL: LEGO1 0x100f7a60

View file

@ -90,7 +90,7 @@ MxS32 LegoJetskiRaceActor::VTable0x1c(LegoPathBoundary* p_boundary, LegoEdge* p_
LERP3(a, *v1, *v2, m_unk0xe4); LERP3(a, *v1, *v2, m_unk0xe4);
m_destEdge->FUN_1002ddc0(*m_boundary, bbb); m_destEdge->FUN_1002ddc0(*m_boundary, bbb);
c.EqualsCross(&bbb, m_boundary->GetUnknown0x14()); c.EqualsCross(bbb, *m_boundary->GetUnknown0x14());
c.Unitize(); c.Unitize();
Mx3DPointFloat worldDirection(m_roi->GetWorldDirection()); Mx3DPointFloat worldDirection(m_roi->GetWorldDirection());

View file

@ -138,7 +138,7 @@ MxResult LegoExtraActor::FUN_1002aae0()
Vector3 positionRef(m_unk0xec[3]); Vector3 positionRef(m_unk0xec[3]);
dirRef *= -1.0f; dirRef *= -1.0f;
rightRef.EqualsCross(&upRef, &dirRef); rightRef.EqualsCross(upRef, dirRef);
if (m_boundary == m_destEdge->m_faceA) { if (m_boundary == m_destEdge->m_faceA) {
m_boundary = (LegoPathBoundary*) m_destEdge->m_faceB; m_boundary = (LegoPathBoundary*) m_destEdge->m_faceB;
@ -191,9 +191,10 @@ inline void LegoExtraActor::FUN_1002ad8a()
} }
// FUNCTION: LEGO1 0x1002aba0 // FUNCTION: LEGO1 0x1002aba0
// FUNCTION: BETA10 0x1008114a
MxResult LegoExtraActor::HitActor(LegoPathActor* p_actor, MxBool p_bool) MxResult LegoExtraActor::HitActor(LegoPathActor* p_actor, MxBool p_bool)
{ {
if (p_actor->GetActorState() != c_initial || m_actorState != c_initial) { if (p_actor->GetActorState() != c_initial || GetActorState() != c_initial) {
return FAILURE; return FAILURE;
} }
@ -222,7 +223,7 @@ MxResult LegoExtraActor::HitActor(LegoPathActor* p_actor, MxBool p_bool)
for (MxS32 i = 0; i < m_boundary->GetNumEdges(); i++) { for (MxS32 i = 0; i < m_boundary->GetNumEdges(); i++) {
Mx4DPointFloat* normal = m_boundary->GetEdgeNormal(i); Mx4DPointFloat* normal = m_boundary->GetEdgeNormal(i);
if (positionRef.Dot(normal, &positionRef) + (*normal)[3] < -0.001) { if (positionRef.Dot(*normal, positionRef) + normal->index_operator(3) < -0.001) {
b = TRUE; b = TRUE;
break; break;
} }
@ -232,41 +233,34 @@ MxResult LegoExtraActor::HitActor(LegoPathActor* p_actor, MxBool p_bool)
m_roi->FUN_100a58f0(matrix2); m_roi->FUN_100a58f0(matrix2);
m_roi->VTable0x14(); m_roi->VTable0x14();
FUN_1002ad8a(); FUN_1002ad8a();
assert(m_roi);
assert(SoundManager()->GetCacheSoundManager());
SoundManager()->GetCacheSoundManager()->Play("crash5", m_roi->GetName(), FALSE); SoundManager()->GetCacheSoundManager()->Play("crash5", m_roi->GetName(), FALSE);
m_scheduledTime = Timer()->GetTime() + m_disAnim->GetDuration(); m_scheduledTime = Timer()->GetTime() + m_disAnim->GetDuration();
m_prevWorldSpeed = m_worldSpeed; m_prevWorldSpeed = GetWorldSpeed();
VTable0xc4(); VTable0xc4();
SetWorldSpeed(0); SetWorldSpeed(0);
m_whichAnim = 1; m_whichAnim = 1;
m_actorState = c_one | c_noCollide; SetActorState(c_one | c_noCollide);
} }
} }
if (b) { if (b) {
LegoROI* roi = m_roi; LegoROI* roi = GetROI();
assert(roi);
SoundManager()->GetCacheSoundManager()->Play("crash5", m_roi->GetName(), FALSE); SoundManager()->GetCacheSoundManager()->Play("crash5", m_roi->GetName(), FALSE);
VTable0xc4(); VTable0xc4();
m_actorState = c_two | c_noCollide; SetActorState(c_two | c_noCollide);
Mx3DPointFloat dir = p_actor->GetWorldDirection(); Mx3DPointFloat dir = p_actor->GetWorldDirection();
MxMatrix matrix3 = MxMatrix(roi->GetLocal2World()); MxMatrix matrix3 = MxMatrix(roi->GetLocal2World());
Vector3 positionRef(matrix3[3]); Vector3 positionRef(matrix3[3]);
positionRef += g_unk0x10104c18; positionRef += g_unk0x10104c18;
roi->FUN_100a58f0(matrix3); roi->FUN_100a58f0(matrix3);
#ifdef COMPAT_MODE float dotX = dir.Dot(dir, Mx3DPointFloat(1.0f, 0, 0));
float dotX, dotZ; float dotZ = dir.Dot(dir, Mx3DPointFloat(0, 0, 1.0f));
{
Mx3DPointFloat tmp(1.0f, 0, 0);
dotX = dir.Dot(&dir, &tmp);
Mx3DPointFloat tmp2(0, 0, 1.0f);
dotZ = dir.Dot(&dir, &tmp2);
}
#else
float dotX = dir.Dot(&dir, &Mx3DPointFloat(1.0f, 0, 0));
float dotZ = dir.Dot(&dir, &Mx3DPointFloat(0, 0, 1.0f));
#endif
if (abs(dotZ) < abs(dotX)) { if (fabs(dotZ) < fabs(dotX)) {
m_axis = dotX > 0.0 ? e_posz : e_negz; m_axis = dotX > 0.0 ? e_posz : e_negz;
} }
else { else {
@ -463,9 +457,9 @@ MxU32 LegoExtraActor::VTable0x6c(
Mx3DPointFloat local54(p_v1); Mx3DPointFloat local54(p_v1);
local54 -= local60; local54 -= local60;
float local1c = p_v2.Dot(&p_v2, &p_v2); float local1c = p_v2.Dot(p_v2, p_v2);
float local24 = p_v2.Dot(&p_v2, &local54) * 2.0f; float local24 = p_v2.Dot(p_v2, local54) * 2.0f;
float local20 = local54.Dot(&local54, &local54); float local20 = local54.Dot(local54, local54);
if (m_unk0x15 != 0 && local20 < 10.0f) { if (m_unk0x15 != 0 && local20 < 10.0f) {
return 0; return 0;

View file

@ -142,11 +142,11 @@ MxResult LegoPathActor::VTable0x88(
dir *= -1.0f; dir *= -1.0f;
} }
right.EqualsCross(&up, &dir); right.EqualsCross(up, dir);
m_roi->UpdateTransformationRelativeToParent(matrix); m_roi->UpdateTransformationRelativeToParent(matrix);
if (!m_cameraFlag || !m_userNavFlag) { if (!m_cameraFlag || !m_userNavFlag) {
p5.EqualsCross(p_boundary->GetUnknown0x14(), &p3); p5.EqualsCross(*p_boundary->GetUnknown0x14(), p3);
p5.Unitize(); p5.Unitize();
if (VTable0x80(p1, p4, p2, p5) == SUCCESS) { if (VTable0x80(p1, p4, p2, p5) == SUCCESS) {
@ -208,11 +208,11 @@ MxResult LegoPathActor::VTable0x84(
dir *= -1.0f; dir *= -1.0f;
} }
right.EqualsCross(&up, &dir); right.EqualsCross(up, dir);
m_roi->UpdateTransformationRelativeToParent(matrix); m_roi->UpdateTransformationRelativeToParent(matrix);
if (!m_cameraFlag || !m_userNavFlag) { if (!m_cameraFlag || !m_userNavFlag) {
p5.EqualsCross(p_boundary->GetUnknown0x14(), &p3); p5.EqualsCross(*p_boundary->GetUnknown0x14(), p3);
p5.Unitize(); p5.Unitize();
if (VTable0x80(p_p1, p_p4, p2, p5) == SUCCESS) { if (VTable0x80(p_p1, p_p4, p2, p5) == SUCCESS) {
@ -308,9 +308,9 @@ MxS32 LegoPathActor::VTable0x8c(float p_time, Matrix4& p_transform)
dir = p1; dir = p1;
up = *m_boundary->GetUnknown0x14(); up = *m_boundary->GetUnknown0x14();
right.EqualsCross(&up, &dir); right.EqualsCross(up, dir);
right.Unitize(); right.Unitize();
dir.EqualsCross(&right, &up); dir.EqualsCross(right, up);
pos = p2; pos = p2;
return result; return result;
} }
@ -636,7 +636,7 @@ MxResult LegoPathActor::VTable0x9c()
LERP3(local34, v1, v2, m_unk0xe4); LERP3(local34, v1, v2, m_unk0xe4);
m_destEdge->FUN_1002ddc0(*m_boundary, local78); m_destEdge->FUN_1002ddc0(*m_boundary, local78);
local48.EqualsCross(m_boundary->GetUnknown0x14(), &local78); local48.EqualsCross(*m_boundary->GetUnknown0x14(), local78);
local48.Unitize(); local48.Unitize();
} }
@ -646,10 +646,10 @@ MxResult LegoPathActor::VTable0x9c()
upRef = *m_boundary->GetUnknown0x14(); upRef = *m_boundary->GetUnknown0x14();
rightRef.EqualsCross(&upRef, &dirRef); rightRef.EqualsCross(upRef, dirRef);
rightRef.Unitize(); rightRef.Unitize();
dirRef.EqualsCross(&rightRef, &upRef); dirRef.EqualsCross(rightRef, upRef);
dirRef.Unitize(); dirRef.Unitize();
Mx3DPointFloat localc0(m_unk0xec[3]); Mx3DPointFloat localc0(m_unk0xec[3]);

View file

@ -54,11 +54,11 @@ void LegoPathBoundary::FUN_100575b0(Vector3& p_point1, Vector3& p_point2, LegoPa
v = p_point1; v = p_point1;
v -= *ccwV; v -= *ccwV;
float dot1 = v.Dot(&v, m_unk0x50); float dot1 = v.Dot(v, *m_unk0x50);
v = p_point2; v = p_point2;
v -= *ccwV; v -= *ccwV;
float dot2 = v.Dot(&v, m_unk0x50); float dot2 = v.Dot(v, *m_unk0x50);
if (dot2 > dot1) { if (dot2 > dot1) {
for (MxS32 i = 0; i < m_numTriggers; i++) { for (MxS32 i = 0; i < m_numTriggers; i++) {
@ -197,7 +197,7 @@ MxU32 LegoPathBoundary::Intersect(
for (MxS32 i = 0; i < m_numEdges; i++) { for (MxS32 i = 0; i < m_numEdges; i++) {
LegoUnknown100db7f4* edge = (LegoUnknown100db7f4*) m_edges[i]; LegoUnknown100db7f4* edge = (LegoUnknown100db7f4*) m_edges[i];
if (p_point2.Dot(&m_edgeNormals[i], &p_point2) + m_edgeNormals[i][3] <= -1e-07) { if (p_point2.Dot(m_edgeNormals[i], p_point2) + m_edgeNormals[i][3] <= -1e-07) {
if (local10 == 0) { if (local10 == 0) {
local10 = 1; local10 = 1;
vec = p_point2; vec = p_point2;
@ -212,9 +212,9 @@ MxU32 LegoPathBoundary::Intersect(
vec /= len; vec /= len;
} }
float dot = vec.Dot(&vec, &m_edgeNormals[i]); float dot = vec.Dot(vec, m_edgeNormals[i]);
if (dot != 0.0f) { if (dot != 0.0f) {
float local34 = (-m_edgeNormals[i][3] - p_point1.Dot(&p_point1, &m_edgeNormals[i])) / dot; float local34 = (-m_edgeNormals[i][3] - p_point1.Dot(p_point1, m_edgeNormals[i])) / dot;
if (local34 >= -0.001 && local34 <= len && (e == NULL || local34 < localc)) { if (local34 >= -0.001 && local34 <= len && (e == NULL || local34 < localc)) {
e = edge; e = edge;
@ -242,7 +242,7 @@ MxU32 LegoPathBoundary::Intersect(
e->FUN_1002ddc0(*this, local70); e->FUN_1002ddc0(*this, local70);
float local58 = local50.Dot(&local50, &local70); float local58 = local50.Dot(local50, local70);
LegoUnknown100db7f4* local54 = NULL; LegoUnknown100db7f4* local54 = NULL;
if (local58 < 0.0f) { if (local58 < 0.0f) {
@ -252,7 +252,7 @@ MxU32 LegoPathBoundary::Intersect(
local88 = (LegoUnknown100db7f4*) local88->GetClockwiseEdge(*this)) { local88 = (LegoUnknown100db7f4*) local88->GetClockwiseEdge(*this)) {
local88->FUN_1002ddc0(*this, local84); local88->FUN_1002ddc0(*this, local84);
if (local84.Dot(&local84, &local70) <= 0.9) { if (local84.Dot(local84, local70) <= 0.9) {
break; break;
} }
@ -260,7 +260,7 @@ MxU32 LegoPathBoundary::Intersect(
Mx3DPointFloat locala4(p_point3); Mx3DPointFloat locala4(p_point3);
locala4 -= *local90; locala4 -= *local90;
float local8c = locala4.Dot(&locala4, &local84); float local8c = locala4.Dot(locala4, local84);
if (local8c > local58 && local8c < local88->m_unk0x3c) { if (local8c > local58 && local8c < local88->m_unk0x3c) {
local54 = local88; local54 = local88;
@ -279,7 +279,7 @@ MxU32 LegoPathBoundary::Intersect(
locala8 = (LegoUnknown100db7f4*) locala8->GetCounterclockwiseEdge(*this)) { locala8 = (LegoUnknown100db7f4*) locala8->GetCounterclockwiseEdge(*this)) {
locala8->FUN_1002ddc0(*this, localbc); locala8->FUN_1002ddc0(*this, localbc);
if (localbc.Dot(&localbc, &local70) <= 0.9) { if (localbc.Dot(localbc, local70) <= 0.9) {
break; break;
} }
@ -287,7 +287,7 @@ MxU32 LegoPathBoundary::Intersect(
Mx3DPointFloat locald8(p_point3); Mx3DPointFloat locald8(p_point3);
locald8 -= *localc4; locald8 -= *localc4;
float localc0 = locald8.Dot(&locald8, &localbc); float localc0 = locald8.Dot(locald8, localbc);
if (localc0 < local58 && localc0 >= 0.0f) { if (localc0 < local58 && localc0 >= 0.0f) {
local54 = locala8; local54 = locala8;

View file

@ -258,7 +258,7 @@ MxResult LegoPathController::PlaceActor(
for (j = 0; j < b.GetNumEdges(); j++) { for (j = 0; j < b.GetNumEdges(); j++) {
Mx4DPointFloat normal(*b.GetEdgeNormal(j)); Mx4DPointFloat normal(*b.GetEdgeNormal(j));
if (p_position.Dot(&p_position, &normal) + normal[3] < 0.0f) { if (p_position.Dot(p_position, normal) + normal[3] < 0.0f) {
break; break;
} }
} }
@ -284,7 +284,7 @@ MxResult LegoPathController::PlaceActor(
Mx3DPointFloat vec; Mx3DPointFloat vec;
if (((LegoUnknown100db7f4*) edge->GetClockwiseEdge(*boundary))->FUN_1002ddc0(*boundary, vec) == SUCCESS && if (((LegoUnknown100db7f4*) edge->GetClockwiseEdge(*boundary))->FUN_1002ddc0(*boundary, vec) == SUCCESS &&
vec.Dot(&vec, &p_direction) < 0.0f) { vec.Dot(vec, p_direction) < 0.0f) {
edge = edge =
(LegoUnknown100db7f4*) edge->GetCounterclockwiseEdge(*boundary)->GetCounterclockwiseEdge(*boundary); (LegoUnknown100db7f4*) edge->GetCounterclockwiseEdge(*boundary)->GetCounterclockwiseEdge(*boundary);
} }
@ -951,7 +951,7 @@ MxS32 LegoPathController::FUN_1004a240(
p_v1 *= p_f1; p_v1 *= p_f1;
p_v1 += *p_edge->CWVertex(*p_boundary); p_v1 += *p_edge->CWVertex(*p_boundary);
p_edge->FUN_1002ddc0(*p_boundary, vec); p_edge->FUN_1002ddc0(*p_boundary, vec);
p_v2.EqualsCross(p_boundary->GetUnknown0x14(), &vec); p_v2.EqualsCross(*p_boundary->GetUnknown0x14(), vec);
return 0; return 0;
} }
@ -976,14 +976,14 @@ MxResult LegoPathController::FUN_1004a380(
LegoPathBoundary* b = &m_boundaries[i]; LegoPathBoundary* b = &m_boundaries[i];
Mx4DPointFloat* unk0x14 = b->GetUnknown0x14(); Mx4DPointFloat* unk0x14 = b->GetUnknown0x14();
float local28 = p_param3[0].Dot(&p_param3[0], unk0x14); float local28 = p_param3[0].Dot(p_param3[0], *unk0x14);
if (local28 < 0.001 && local28 > -0.001) { if (local28 < 0.001 && local28 > -0.001) {
continue; continue;
} }
float local2c = p_param3[1].Dot(&p_param3[1], unk0x14); float local2c = p_param3[1].Dot(p_param3[1], *unk0x14);
float local34 = p_param3[2].Dot(&p_param3[2], unk0x14) + unk0x14->index_operator(3); float local34 = p_param3[2].Dot(p_param3[2], *unk0x14) + unk0x14->index_operator(3);
float local3c = local2c * local2c - local34 * local28 * 4.0f; float local3c = local2c * local2c - local34 * local28 * 4.0f;
if (local3c < -0.001) { if (local3c < -0.001) {
@ -1024,7 +1024,7 @@ MxResult LegoPathController::FUN_1004a380(
for (j = b->GetNumEdges() - 1; j >= 0; j--) { for (j = b->GetNumEdges() - 1; j >= 0; j--) {
Mx4DPointFloat* local60 = b->GetEdgeNormal(j); Mx4DPointFloat* local60 = b->GetEdgeNormal(j);
if (local24.Dot(local60, &local24) + local60->index_operator(3) < -0.001) { if (local24.Dot(*local60, local24) + local60->index_operator(3) < -0.001) {
break; break;
} }
} }
@ -1033,7 +1033,7 @@ MxResult LegoPathController::FUN_1004a380(
Mx3DPointFloat local74(p_param1); Mx3DPointFloat local74(p_param1);
local74 -= local24; local74 -= local24;
if (local74.Dot(&local74, unk0x14) >= 0.0f) { if (local74.Dot(local74, *unk0x14) >= 0.0f) {
p_param5 = local38; p_param5 = local38;
p_boundary = b; p_boundary = b;
local8 = FALSE; local8 = FALSE;

View file

@ -61,11 +61,11 @@ MxS32 CarRace::g_unk0x100d5d60[] =
// GLOBAL: LEGO1 0x100f0c70 // GLOBAL: LEGO1 0x100f0c70
// STRING: LEGO1 0x100f0c48 // STRING: LEGO1 0x100f0c48
LegoChar* g_strCRCFRNTY6 = "C_RCFRNTY6"; const LegoChar* g_strCRCFRNTY6 = "C_RCFRNTY6";
// GLOBAL: LEGO1 0x100f0c74 // GLOBAL: LEGO1 0x100f0c74
// STRING: LEGO1 0x100f0c3c // STRING: LEGO1 0x100f0c3c
LegoChar* g_strCRCEDGEY0 = "C_RCEDGEY0"; const LegoChar* g_strCRCEDGEY0 = "C_RCEDGEY0";
// GLOBAL: LEGO1 0x100f0c7c // GLOBAL: LEGO1 0x100f0c7c
MxS32 g_unk0x100f0c7c = 2; MxS32 g_unk0x100f0c7c = 2;

View file

@ -165,6 +165,7 @@ MxResult RaceState::Serialize(LegoFile* p_file)
} }
// FUNCTION: LEGO1 0x10016280 // FUNCTION: LEGO1 0x10016280
// FUNCTION: BETA10 0x100c7dfd
RaceState::Entry* RaceState::GetState(MxU8 p_id) RaceState::Entry* RaceState::GetState(MxU8 p_id)
{ {
for (MxS16 i = 0;; i++) { for (MxS16 i = 0;; i++) {

View file

@ -167,7 +167,7 @@ MxS32 LegoCarRaceActor::VTable0x1c(LegoPathBoundary* p_boundary, LegoEdge* p_edg
m_destEdge->FUN_1002ddc0(*m_boundary, destEdgeUnknownVector); m_destEdge->FUN_1002ddc0(*m_boundary, destEdgeUnknownVector);
crossProduct.EqualsCross(m_boundary->GetUnknown0x14(), &destEdgeUnknownVector); crossProduct.EqualsCross(*m_boundary->GetUnknown0x14(), destEdgeUnknownVector);
crossProduct.Unitize(); crossProduct.Unitize();
Mx3DPointFloat worldDirection(Vector3(m_roi->GetWorldDirection())); Mx3DPointFloat worldDirection(Vector3(m_roi->GetWorldDirection()));
@ -261,8 +261,8 @@ MxResult LegoCarRaceActor::VTable0x9c()
d->FUN_1002ddc0(*b, point2); d->FUN_1002ddc0(*b, point2);
m_destEdge->FUN_1002ddc0(*m_boundary, point3); m_destEdge->FUN_1002ddc0(*m_boundary, point3);
point4.EqualsCross(&point2, m_boundary->GetUnknown0x14()); point4.EqualsCross(point2, *m_boundary->GetUnknown0x14());
point5.EqualsCross(m_boundary->GetUnknown0x14(), &point3); point5.EqualsCross(*m_boundary->GetUnknown0x14(), point3);
point4.Unitize(); point4.Unitize();
point5.Unitize(); point5.Unitize();

View file

@ -655,9 +655,9 @@ void LegoAnimPresenter::PutFrame()
up -= m_currentWorld->GetCamera()->GetWorldLocation(); up -= m_currentWorld->GetCamera()->GetWorldLocation();
dir /= dirsqr; dir /= dirsqr;
pos.EqualsCross(&dir, &up); pos.EqualsCross(dir, up);
pos.Unitize(); pos.Unitize();
up.EqualsCross(&pos, &dir); up.EqualsCross(pos, dir);
pos *= possqr; pos *= possqr;
dir *= dirsqr; dir *= dirsqr;
up *= upsqr; up *= upsqr;

View file

@ -68,9 +68,9 @@ void LegoLoopingAnimPresenter::PutFrame()
up -= m_currentWorld->GetCamera()->GetWorldLocation(); up -= m_currentWorld->GetCamera()->GetWorldLocation();
dir /= dirsqr; dir /= dirsqr;
pos.EqualsCross(&dir, &up); pos.EqualsCross(dir, up);
pos.Unitize(); pos.Unitize();
up.EqualsCross(&pos, &dir); up.EqualsCross(pos, dir);
pos *= possqr; pos *= possqr;
dir *= dirsqr; dir *= dirsqr;
up *= upsqr; up *= upsqr;

View file

@ -1226,7 +1226,7 @@ MxBool Isle::Escape()
if (UserActor()) { if (UserActor()) {
if (UserActor()->GetActorId() != GameState()->GetActorId()) { if (UserActor()->GetActorId() != GameState()->GetActorId()) {
((IslePathActor*) UserActor())->Exit(); ((IslePathActor*) UserActor())->Exit();
m_skateboard->SetUnknown0x160(FALSE); m_skateboard->SetPizzaVisible(FALSE);
} }
} }
@ -1272,7 +1272,7 @@ void Isle::FUN_10033350()
if (UserActor()) { if (UserActor()) {
if (UserActor()->GetActorId() != GameState()->GetActorId()) { if (UserActor()->GetActorId() != GameState()->GetActorId()) {
((IslePathActor*) UserActor())->Exit(); ((IslePathActor*) UserActor())->Exit();
m_skateboard->SetUnknown0x160(FALSE); m_skateboard->SetPizzaVisible(FALSE);
} }
} }

View file

@ -49,7 +49,7 @@ MxS32 g_unk0x100f43f0[] = {
}; };
// GLOBAL: LEGO1 0x100f4410 // GLOBAL: LEGO1 0x100f4410
LegoChar* g_unk0x100f4410[] = {"bd", "pg", "rd", "sy", "ro", "cl"}; const LegoChar* g_unk0x100f4410[] = {"bd", "pg", "rd", "sy", "ro", "cl"};
// GLOBAL: LEGO1 0x100f4428 // GLOBAL: LEGO1 0x100f4428
MxS32 g_unk0x100f4428[] = { MxS32 g_unk0x100f4428[] = {
@ -68,7 +68,7 @@ MxS32 g_unk0x100f4428[] = {
}; };
// GLOBAL: LEGO1 0x100f4458 // GLOBAL: LEGO1 0x100f4458
LegoChar* g_unk0x100f4458[] = {"papa", "nick", "laura", "cl", "pg", "rd", "sy"}; const LegoChar* g_unk0x100f4458[] = {"papa", "nick", "laura", "cl", "pg", "rd", "sy"};
// FUNCTION: LEGO1 0x1004fce0 // FUNCTION: LEGO1 0x1004fce0
// FUNCTION: BETA10 0x1003a5a0 // FUNCTION: BETA10 0x1003a5a0
@ -327,7 +327,7 @@ MxLong LegoAct2::Notify(MxParam& p_param)
local90 *= 1.25f; local90 *= 1.25f;
locala4 += local90; locala4 += local90;
locala4[1] += 0.25; locala4[1] += 0.25;
local30.EqualsCross(&localac, &local28); local30.EqualsCross(localac, local28);
local30.Unitize(); local30.Unitize();
Mx3DPointFloat locald4(local2world[2]); Mx3DPointFloat locald4(local2world[2]);
@ -1155,7 +1155,7 @@ MxResult LegoAct2::FUN_10052560(
Vector3 secondColumn(matrix[1]); Vector3 secondColumn(matrix[1]);
Vector3 thirdColumn(matrix[2]); Vector3 thirdColumn(matrix[2]);
firstColumn.EqualsCross(&secondColumn, &thirdColumn); firstColumn.EqualsCross(secondColumn, thirdColumn);
firstColumn.Unitize(); firstColumn.Unitize();
MxMatrix* pmatrix = NULL; MxMatrix* pmatrix = NULL;

View file

@ -32,12 +32,6 @@ Score::Score()
NotificationManager()->Register(this); NotificationManager()->Register(this);
} }
// FUNCTION: LEGO1 0x100010b0
MxBool Score::VTable0x5c()
{
return TRUE;
}
// FUNCTION: LEGO1 0x10001200 // FUNCTION: LEGO1 0x10001200
Score::~Score() Score::~Score()
{ {
@ -260,7 +254,8 @@ void Score::Paint()
memset(&desc, 0, sizeof(desc)); memset(&desc, 0, sizeof(desc));
desc.dwSize = sizeof(desc); desc.dwSize = sizeof(desc);
if (cube->m_surface->Lock(NULL, &desc, 0, NULL) == DD_OK) { HRESULT result = cube->m_surface->Lock(NULL, &desc, DDLOCK_SURFACEMEMORYPTR, NULL);
if (result == DD_OK) {
if (desc.lPitch != desc.dwWidth) { if (desc.lPitch != desc.dwWidth) {
cube->m_surface->Unlock(desc.lpSurface); cube->m_surface->Unlock(desc.lpSurface);
return; return;
@ -296,7 +291,7 @@ void Score::Paint()
// FUNCTION: LEGO1 0x10001d20 // FUNCTION: LEGO1 0x10001d20
// FUNCTION: BETA10 0x100f4a52 // FUNCTION: BETA10 0x100f4a52
void Score::FillArea(MxU32 i_activity, MxU32 i_actor, MxS16 score) void Score::FillArea(MxS32 i_activity, MxS32 i_actor, MxS16 score)
{ {
MxS32 local3c[] = {0x2b00, 0x5700, 0x8000, 0xab00, 0xd600}; MxS32 local3c[] = {0x2b00, 0x5700, 0x8000, 0xab00, 0xd600};
MxS32 local14[] = {0x2a, 0x27, 0x29, 0x29, 0x2a}; MxS32 local14[] = {0x2a, 0x27, 0x29, 0x29, 0x2a};
@ -304,6 +299,10 @@ void Score::FillArea(MxU32 i_activity, MxU32 i_actor, MxS16 score)
MxS32 local28[] = {0x25, 0x29, 0x27, 0x28, 0x28}; MxS32 local28[] = {0x25, 0x29, 0x27, 0x28, 0x28};
MxS32 colors[] = {0x11, 0x0f, 0x08, 0x05}; MxS32 colors[] = {0x11, 0x0f, 0x08, 0x05};
assert(i_activity >= 0 && i_activity < 5);
assert(i_actor >= 0 && i_actor < 5);
assert(score >= 0 && score < 4);
MxU8* ptr = m_surface + local3c[i_actor] + local50[i_activity]; MxU8* ptr = m_surface + local3c[i_actor] + local50[i_activity];
MxS32 color = colors[score]; MxS32 color = colors[score];
MxS32 size = local28[i_activity]; MxS32 size = local28[i_activity];

View file

@ -231,10 +231,10 @@ LegoResult LegoAnimScene::FUN_1009f490(LegoFloat p_time, Matrix4& p_matrix)
local54 -= localb8; local54 -= localb8;
if (local54.Unitize() == 0) { if (local54.Unitize() == 0) {
local5c.EqualsCross(&local68, &local54); local5c.EqualsCross(local68, local54);
if (local5c.Unitize() == 0) { if (local5c.Unitize() == 0) {
local68.EqualsCross(&local54, &local5c); local68.EqualsCross(local54, local5c);
localcc = p_matrix[3]; localcc = p_matrix[3];
localcc += localb0[3]; localcc += localb0[3];

View file

@ -139,10 +139,10 @@ LegoS32 LegoWEGEdge::VTable0x04()
Mx3DPointFloat local58; Mx3DPointFloat local58;
Vector3 local64(&m_edgeNormals[i][0]); Vector3 local64(&m_edgeNormals[i][0]);
edge->FUN_1002ddc0(*this, local58); edge->FUN_1002ddc0(*this, local58);
local64.EqualsCross(&local58, &m_unk0x14); local64.EqualsCross(local58, m_unk0x14);
m_edgeNormals[i][3] = -local64.Dot(m_edges[i]->m_pointA, &local64); m_edgeNormals[i][3] = -local64.Dot(*m_edges[i]->m_pointA, local64);
if (m_edgeNormals[i][3] + m_unk0x30.Dot(&m_unk0x30, &local64) < 0.0f) { if (m_edgeNormals[i][3] + m_unk0x30.Dot(m_unk0x30, local64) < 0.0f) {
m_edgeNormals[i] *= -1.0f; m_edgeNormals[i] *= -1.0f;
} }
@ -178,12 +178,12 @@ LegoS32 LegoWEGEdge::VTable0x04()
localb8 -= *vTrig1; localb8 -= *vTrig1;
local80 -= *vTrig1; local80 -= *vTrig1;
float locala4 = localb8.Dot(m_unk0x50, &localb8); float locala4 = localb8.Dot(*m_unk0x50, localb8);
if (local98 < locala4) { if (local98 < locala4) {
local98 = locala4; local98 = locala4;
} }
locala4 = local80.Dot(m_unk0x50, &local80); locala4 = local80.Dot(*m_unk0x50, local80);
if (locala4 < local9c) { if (locala4 < local9c) {
local9c = locala4; local9c = locala4;
} }
@ -244,7 +244,7 @@ LegoS32 LegoWEGEdge::FUN_1009aea0()
local50 = *local8[i - 2]; local50 = *local8[i - 2];
local50 -= *local8[i - 1]; local50 -= *local8[i - 1];
local24.EqualsCross(&local50, &local3c); local24.EqualsCross(local50, local3c);
local28 = local24.LenSquared(); local28 = local24.LenSquared();
if (local28 < 0.00001f) { if (local28 < 0.00001f) {
@ -255,7 +255,7 @@ LegoS32 LegoWEGEdge::FUN_1009aea0()
local24 /= local58; local24 /= local58;
if (localc) { if (localc) {
float local54 = local24.Dot(&m_unk0x14, &local24); float local54 = local24.Dot(m_unk0x14, local24);
if (local54 < 0.98) { if (local54 < 0.98) {
delete[] local8; delete[] local8;
return -2; return -2;
@ -265,7 +265,7 @@ LegoS32 LegoWEGEdge::FUN_1009aea0()
m_unk0x14[0] = local24[0]; m_unk0x14[0] = local24[0];
m_unk0x14[1] = local24[1]; m_unk0x14[1] = local24[1];
m_unk0x14[2] = local24[2]; m_unk0x14[2] = local24[2];
m_unk0x14[3] = -local8[i]->Dot(local8[i], &local24); m_unk0x14[3] = -local8[i]->Dot(*local8[i], local24);
localc = TRUE; localc = TRUE;
} }
} }

View file

@ -57,7 +57,6 @@ public:
} }
} }
// FUNCTION: BETA10 0x1007bc00
T* Get(const char* p_name) T* Get(const char* p_name)
{ {
T* value = NULL; T* value = NULL;
@ -197,4 +196,7 @@ protected:
// _Tree<char const *,pair<char const * const,LegoTextureInfo *>,map<char const *,LegoTextureInfo *,LegoContainerInfoComparator,allocator<LegoTextureInfo *> >::_Kfn,LegoContainerInfoComparator,allocator<LegoTextureInfo *> >::_Nil // _Tree<char const *,pair<char const * const,LegoTextureInfo *>,map<char const *,LegoTextureInfo *,LegoContainerInfoComparator,allocator<LegoTextureInfo *> >::_Kfn,LegoContainerInfoComparator,allocator<LegoTextureInfo *> >::_Nil
// clang-format on // clang-format on
// TEMPLATE: BETA10 0x1007bc00
// LegoContainer<LegoTextureInfo>::Get
#endif // LEGOCONTAINER_H #endif // LEGOCONTAINER_H

View file

@ -68,11 +68,11 @@ LegoResult LegoUnknown::FUN_1009a1e0(float p_f1, Matrix4& p_mat, Vector3& p_v, L
return FAILURE; return FAILURE;
} }
v2.EqualsCross(&p_v, &v4); v2.EqualsCross(p_v, v4);
if (v2.Unitize() != 0) { if (v2.Unitize() != 0) {
return FAILURE; return FAILURE;
} }
v3.EqualsCross(&v4, &v2); v3.EqualsCross(v4, v2);
return SUCCESS; return SUCCESS;
} }

View file

@ -627,13 +627,13 @@ LegoU32 LegoROI::FUN_100a9410(
local38 *= 0.5f; local38 *= 0.5f;
local70 = localc0; local70 = localc0;
localc0.SetMatrixProduct(&local70, (float*) m_local2world.GetData()); localc0.SetMatrixProduct(local70, (float*) m_local2world.GetData());
local70 = local9c; local70 = local9c;
local9c.SetMatrixProduct(&local70, (float*) m_local2world.GetData()); local9c.SetMatrixProduct(local70, (float*) m_local2world.GetData());
local70 = local168; local70 = local168;
local168.SetMatrixProduct(&local70, (float*) m_local2world.GetData()); local168.SetMatrixProduct(local70, (float*) m_local2world.GetData());
p_v3 = m_local2world[3]; p_v3 = m_local2world[3];
@ -642,22 +642,22 @@ LegoU32 LegoROI::FUN_100a9410(
local150[i] = m_local2world[i % 3]; local150[i] = m_local2world[i % 3];
if (i > 2) { if (i > 2) {
local150[i][3] = -local58.Dot(&local58, &local150[i]); local150[i][3] = -local58.Dot(local58, local150[i]);
} }
else { else {
local150[i][3] = -locala8.Dot(&locala8, &local150[i]); local150[i][3] = -locala8.Dot(locala8, local150[i]);
} }
if (local150[i][3] + local38.Dot(&local38, &local150[i]) < 0.0f) { if (local150[i][3] + local38.Dot(local38, local150[i]) < 0.0f) {
local150[i] *= -1.0f; local150[i] *= -1.0f;
} }
} }
for (i = 0; i < 6; i++) { for (i = 0; i < 6; i++) {
float local50 = p_v2.Dot(&p_v2, &local150[i]); float local50 = p_v2.Dot(p_v2, local150[i]);
if (local50 >= 0.01 || local50 < -0.01) { if (local50 >= 0.01 || local50 < -0.01) {
local50 = -((local150[i][3] + local4c.Dot(&local4c, &local150[i])) / local50); local50 = -((local150[i][3] + local4c.Dot(local4c, local150[i])) / local50);
if (local50 >= 0.0f && local50 <= p_f1) { if (local50 >= 0.0f && local50 <= p_f1) {
Mx3DPointFloat local17c(p_v2); Mx3DPointFloat local17c(p_v2);
@ -667,7 +667,7 @@ LegoU32 LegoROI::FUN_100a9410(
LegoS32 j; LegoS32 j;
for (j = 0; j < 6; j++) { for (j = 0; j < 6; j++) {
if (i != j && i - j != 3 && j - i != 3) { if (i != j && i - j != 3 && j - i != 3) {
if (local150[j][3] + local17c.Dot(&local17c, &local150[j]) < 0.0f) { if (local150[j][3] + local17c.Dot(local17c, local150[j]) < 0.0f) {
break; break;
} }
} }
@ -685,9 +685,9 @@ LegoU32 LegoROI::FUN_100a9410(
v1 -= GetWorldBoundingSphere().Center(); v1 -= GetWorldBoundingSphere().Center();
float local10 = GetWorldBoundingSphere().Radius(); float local10 = GetWorldBoundingSphere().Radius();
float local8 = p_v2.Dot(&p_v2, &p_v2); float local8 = p_v2.Dot(p_v2, p_v2);
float localc = p_v2.Dot(&p_v2, &v1) * 2.0f; float localc = p_v2.Dot(p_v2, v1) * 2.0f;
float local14 = v1.Dot(&v1, &v1) - (local10 * local10); float local14 = v1.Dot(v1, v1) - (local10 * local10);
if (local8 >= 0.001 || local8 <= -0.001) { if (local8 >= 0.001 || local8 <= -0.001) {
float local1c = -1.0f; float local1c = -1.0f;

View file

@ -185,7 +185,7 @@ inline long UnknownMx4DPointFloat::FUN_10004520()
v2 = m_unk0x00; v2 = m_unk0x00;
v2 -= m_unk0x18; v2 -= m_unk0x18;
if (v1.Dot(&v1, &v1) < v2.Dot(&v2, &v2)) { if (v1.Dot(v1, v1) < v2.Dot(v2, v2)) {
m_unk0x18 *= -1.0f; m_unk0x18 *= -1.0f;
} }
@ -208,7 +208,7 @@ inline int UnknownMx4DPointFloat::FUN_100040a0(Vector4& p_v, float p_f)
} }
else if (m_unk0x30 == (c_bit1 | c_bit2)) { else if (m_unk0x30 == (c_bit1 | c_bit2)) {
int i; int i;
double d1 = p_v.Dot(&m_unk0x00, &m_unk0x18); double d1 = p_v.Dot(m_unk0x00, m_unk0x18);
double a; double a;
double b; double b;

View file

@ -138,4 +138,10 @@ protected:
// TEMPLATE: LEGO1 0x100c1bc0 // TEMPLATE: LEGO1 0x100c1bc0
// list<MxDSObject *,allocator<MxDSObject *> >::insert // list<MxDSObject *,allocator<MxDSObject *> >::insert
// TEMPLATE: BETA10 0x10150b90
// MxUtilityList<MxDSSubscriber *>::PushBack
// TEMPLATE: BETA10 0x10150cf0
// MxUtilityList<MxDSSubscriber *>::Remove
#endif // MXSTREAMCONTROLLER_H #endif // MXSTREAMCONTROLLER_H

View file

@ -21,6 +21,7 @@ public:
// Note: does not take a reference // Note: does not take a reference
void PushBack(T p_obj) { this->push_back(p_obj); } void PushBack(T p_obj) { this->push_back(p_obj); }
void Remove(T p_obj) { this->remove(p_obj); }
}; };
#endif // MXUTILITYLIST_H #endif // MXUTILITYLIST_H

View file

@ -72,20 +72,22 @@ MxResult MxStreamController::Open(const char* p_filename)
AUTOLOCK(m_criticalSection); AUTOLOCK(m_criticalSection);
MakeSourceName(sourceName, p_filename); MakeSourceName(sourceName, p_filename);
this->m_atom = MxAtomId(sourceName, e_lowerCase2); m_atom = MxAtomId(sourceName, e_lowerCase2);
return SUCCESS; return SUCCESS;
} }
// FUNCTION: LEGO1 0x100c15d0 // FUNCTION: LEGO1 0x100c15d0
// FUNCTION: BETA10 0x1014e730
void MxStreamController::AddSubscriber(MxDSSubscriber* p_subscriber) void MxStreamController::AddSubscriber(MxDSSubscriber* p_subscriber)
{ {
m_subscriberList.push_back(p_subscriber); m_subscriberList.PushBack(p_subscriber);
} }
// FUNCTION: LEGO1 0x100c1620 // FUNCTION: LEGO1 0x100c1620
// FUNCTION: BETA10 0x1014e7b4
void MxStreamController::RemoveSubscriber(MxDSSubscriber* p_subscriber) void MxStreamController::RemoveSubscriber(MxDSSubscriber* p_subscriber)
{ {
m_subscriberList.remove(p_subscriber); m_subscriberList.Remove(p_subscriber);
} }
// FUNCTION: LEGO1 0x100c1690 // FUNCTION: LEGO1 0x100c1690
@ -114,11 +116,13 @@ MxResult MxStreamController::VTable0x20(MxDSAction* p_action)
} }
// FUNCTION: LEGO1 0x100c1740 // FUNCTION: LEGO1 0x100c1740
// FUNCTION: BETA10 0x1014e922
MxResult MxStreamController::VTable0x24(MxDSAction* p_action) MxResult MxStreamController::VTable0x24(MxDSAction* p_action)
{ {
AUTOLOCK(m_criticalSection); AUTOLOCK(m_criticalSection);
VTable0x30(p_action); VTable0x30(p_action);
m_action0x60 = (MxDSAction*) m_unk0x54.FindAndErase(p_action); m_action0x60 = (MxDSAction*) m_unk0x54.FindAndErase(p_action);
if (m_action0x60 == NULL) { if (m_action0x60 == NULL) {
return FAILURE; return FAILURE;
} }
@ -130,6 +134,7 @@ MxResult MxStreamController::VTable0x24(MxDSAction* p_action)
} }
// FUNCTION: LEGO1 0x100c1800 // FUNCTION: LEGO1 0x100c1800
// FUNCTION: BETA10 0x1014ea36
MxResult MxStreamController::FUN_100c1800(MxDSAction* p_action, MxU32 p_val) MxResult MxStreamController::FUN_100c1800(MxDSAction* p_action, MxU32 p_val)
{ {
MxNextActionDataStart* dataActionStart = MxNextActionDataStart* dataActionStart =
@ -138,11 +143,12 @@ MxResult MxStreamController::FUN_100c1800(MxDSAction* p_action, MxU32 p_val)
return FAILURE; return FAILURE;
} }
m_nextActionList.push_back(dataActionStart); m_nextActionList.PushBack(dataActionStart);
return SUCCESS; return SUCCESS;
} }
// FUNCTION: LEGO1 0x100c1a00 // FUNCTION: LEGO1 0x100c1a00
// FUNCTION: BETA10 0x1014eb04
MxResult MxStreamController::FUN_100c1a00(MxDSAction* p_action, MxU32 p_offset) MxResult MxStreamController::FUN_100c1a00(MxDSAction* p_action, MxU32 p_offset)
{ {
if (p_action->GetUnknown24() == -1) { if (p_action->GetUnknown24() == -1) {
@ -198,36 +204,43 @@ MxResult MxStreamController::FUN_100c1a00(MxDSAction* p_action, MxU32 p_offset)
MxLong time = Timer()->GetTime(); MxLong time = Timer()->GetTime();
streamingAction->SetUnknown90(time); streamingAction->SetUnknown90(time);
m_unk0x3c.push_back(streamingAction); m_unk0x3c.PushBack(streamingAction);
return SUCCESS; return SUCCESS;
} }
// FUNCTION: LEGO1 0x100c1c10 // FUNCTION: LEGO1 0x100c1c10
// FUNCTION: BETA10 0x1014ed8c
MxResult MxStreamController::VTable0x2c(MxDSAction* p_action, MxU32 p_bufferval) MxResult MxStreamController::VTable0x2c(MxDSAction* p_action, MxU32 p_bufferval)
{ {
AUTOLOCK(m_criticalSection); AUTOLOCK(m_criticalSection);
if (FUN_100c1a00(p_action, p_bufferval) != SUCCESS) { if (FUN_100c1a00(p_action, p_bufferval) != SUCCESS) {
return FAILURE; return FAILURE;
} }
return FUN_100c1800(p_action, (p_bufferval / m_provider->GetFileSize()) * m_provider->GetFileSize()); return FUN_100c1800(p_action, (p_bufferval / m_provider->GetFileSize()) * m_provider->GetFileSize());
} }
// FUNCTION: LEGO1 0x100c1ce0 // FUNCTION: LEGO1 0x100c1ce0
// FUNCTION: BETA10 0x1014eeb5
MxResult MxStreamController::VTable0x30(MxDSAction* p_action) MxResult MxStreamController::VTable0x30(MxDSAction* p_action)
{ {
AUTOLOCK(m_criticalSection); AUTOLOCK(m_criticalSection);
MxResult result = FAILURE; MxResult result = FAILURE;
MxDSObject* action = m_unk0x3c.FindAndErase(p_action); MxDSObject* action = m_unk0x3c.FindAndErase(p_action);
if (action != NULL) { if (action != NULL) {
MxNextActionDataStart* data = m_nextActionList.FindAndErase(action->GetObjectId(), action->GetUnknown24()); MxNextActionDataStart* data = m_nextActionList.FindAndErase(action->GetObjectId(), action->GetUnknown24());
delete action; delete action;
delete data; delete data;
result = SUCCESS; result = SUCCESS;
} }
return result; return result;
} }
// FUNCTION: LEGO1 0x100c1da0 // FUNCTION: LEGO1 0x100c1da0
// FUNCTION: BETA10 0x1014efdc
MxResult MxStreamController::InsertActionToList54(MxDSAction* p_action) MxResult MxStreamController::InsertActionToList54(MxDSAction* p_action)
{ {
AUTOLOCK(m_criticalSection); AUTOLOCK(m_criticalSection);
@ -237,16 +250,18 @@ MxResult MxStreamController::InsertActionToList54(MxDSAction* p_action)
return FAILURE; return FAILURE;
} }
else { else {
m_unk0x54.push_back(action); m_unk0x54.PushBack(action);
return SUCCESS; return SUCCESS;
} }
} }
// FUNCTION: LEGO1 0x100c1e70 // FUNCTION: LEGO1 0x100c1e70
// FUNCTION: BETA10 0x1014f0a1
MxPresenter* MxStreamController::FUN_100c1e70(MxDSAction& p_action) MxPresenter* MxStreamController::FUN_100c1e70(MxDSAction& p_action)
{ {
AUTOLOCK(m_criticalSection); AUTOLOCK(m_criticalSection);
MxPresenter* result = NULL; MxPresenter* result = NULL;
if (p_action.GetObjectId() != -1) { if (p_action.GetObjectId() != -1) {
MxDSObject* action = m_unk0x3c.Find(&p_action); MxDSObject* action = m_unk0x3c.Find(&p_action);
if (action != NULL) { if (action != NULL) {
@ -258,6 +273,7 @@ MxPresenter* MxStreamController::FUN_100c1e70(MxDSAction& p_action)
} }
// FUNCTION: LEGO1 0x100c1f00 // FUNCTION: LEGO1 0x100c1f00
// FUNCTION: BETA10 0x1014f162
MxResult MxStreamController::FUN_100c1f00(MxDSAction* p_action) MxResult MxStreamController::FUN_100c1f00(MxDSAction* p_action)
{ {
AUTOLOCK(m_criticalSection); AUTOLOCK(m_criticalSection);
@ -292,6 +308,7 @@ MxResult MxStreamController::FUN_100c1f00(MxDSAction* p_action)
} }
// FUNCTION: LEGO1 0x100c20b0 // FUNCTION: LEGO1 0x100c20b0
// FUNCTION: BETA10 0x1014f37d
MxNextActionDataStart* MxStreamController::FindNextActionDataStartFromStreamingAction(MxDSStreamingAction* p_action) MxNextActionDataStart* MxStreamController::FindNextActionDataStartFromStreamingAction(MxDSStreamingAction* p_action)
{ {
return m_nextActionList.Find(p_action->GetObjectId(), p_action->GetUnknown24()); return m_nextActionList.Find(p_action->GetObjectId(), p_action->GetUnknown24());

View file

@ -1,5 +0,0 @@
#include "matrix.h"
#include "decomp.h"
DECOMP_SIZE_ASSERT(Matrix4, 0x08);

View file

@ -1,7 +0,0 @@
#include "vector.h"
#include "decomp.h"
DECOMP_SIZE_ASSERT(Vector2, 0x08);
DECOMP_SIZE_ASSERT(Vector3, 0x08);
DECOMP_SIZE_ASSERT(Vector4, 0x08);

View file

@ -22,7 +22,7 @@ public:
// in reverse order of appearance. // in reverse order of appearance.
// FUNCTION: LEGO1 0x10001f80 // FUNCTION: LEGO1 0x10001f80
virtual void AddImpl(float* p_value) virtual void AddImpl(const float* p_value)
{ {
m_data[0] += p_value[0]; m_data[0] += p_value[0];
m_data[1] += p_value[1]; m_data[1] += p_value[1];
@ -36,45 +36,45 @@ public:
} // vtable+0x00 } // vtable+0x00
// FUNCTION: LEGO1 0x10001fc0 // FUNCTION: LEGO1 0x10001fc0
virtual void SubImpl(float* p_value) virtual void SubImpl(const float* p_value)
{ {
m_data[0] -= p_value[0]; m_data[0] -= p_value[0];
m_data[1] -= p_value[1]; m_data[1] -= p_value[1];
} // vtable+0x08 } // vtable+0x08
// Those are also overloads in all likelihood,
// but we need a type to do that.
// FUNCTION: LEGO1 0x10002000
virtual void MulScalarImpl(float* p_value)
{
m_data[0] *= *p_value;
m_data[1] *= *p_value;
} // vtable+0x0c
// FUNCTION: LEGO1 0x10001fe0 // FUNCTION: LEGO1 0x10001fe0
virtual void MulVectorImpl(float* p_value) virtual void MulImpl(const float* p_value)
{ {
m_data[0] *= p_value[0]; m_data[0] *= p_value[0];
m_data[1] *= p_value[1]; m_data[1] *= p_value[1];
} // vtable+0x10 } // vtable+0x10
// FUNCTION: LEGO1 0x10002020 // FUNCTION: LEGO1 0x10002000
virtual void DivScalarImpl(float* p_value) virtual void MulImpl(const float& p_value)
{ {
m_data[0] /= *p_value; m_data[0] *= p_value;
m_data[1] /= *p_value; m_data[1] *= p_value;
} // vtable+0x0c
// FUNCTION: LEGO1 0x10002020
virtual void DivImpl(const float& p_value)
{
m_data[0] /= p_value;
m_data[1] /= p_value;
} // vtable+0x14 } // vtable+0x14
// FUNCTION: LEGO1 0x10002040 // FUNCTION: LEGO1 0x10002040
virtual float DotImpl(float* p_a, float* p_b) const { return p_b[0] * p_a[0] + p_b[1] * p_a[1]; } // vtable+0x18 virtual float DotImpl(const float* p_a, const float* p_b) const
{
return p_b[0] * p_a[0] + p_b[1] * p_a[1];
} // vtable+0x18
// FUNCTION: LEGO1 0x10002060 // FUNCTION: LEGO1 0x10002060
// FUNCTION: BETA10 0x10010c90 // FUNCTION: BETA10 0x10010c90
virtual void SetData(float* p_data) { m_data = p_data; } // vtable+0x1c virtual void SetData(float* p_data) { m_data = p_data; } // vtable+0x1c
// FUNCTION: LEGO1 0x10002070 // FUNCTION: LEGO1 0x10002070
virtual void EqualsImpl(float* p_data) { memcpy(m_data, p_data, sizeof(float) * 2); } // vtable+0x20 virtual void EqualsImpl(const float* p_data) { memcpy(m_data, p_data, sizeof(float) * 2); } // vtable+0x20
// FUNCTION: LEGO1 0x10002090 // FUNCTION: LEGO1 0x10002090
virtual float* GetData() { return m_data; } // vtable+0x28 virtual float* GetData() { return m_data; } // vtable+0x28
@ -86,17 +86,20 @@ public:
virtual void Clear() { memset(m_data, 0, sizeof(float) * 2); } // vtable+0x2c virtual void Clear() { memset(m_data, 0, sizeof(float) * 2); } // vtable+0x2c
// FUNCTION: LEGO1 0x100020d0 // FUNCTION: LEGO1 0x100020d0
virtual float Dot(float* p_a, float* p_b) const { return DotImpl(p_a, p_b); } // vtable+0x3c virtual float Dot(const float* p_a, const float* p_b) const { return DotImpl(p_a, p_b); } // vtable+0x3c
// FUNCTION: LEGO1 0x100020f0 // FUNCTION: LEGO1 0x100020f0
// FUNCTION: BETA10 0x100108c0 // FUNCTION: BETA10 0x100108c0
virtual float Dot(Vector2* p_a, Vector2* p_b) const { return DotImpl(p_a->m_data, p_b->m_data); } // vtable+0x38 virtual float Dot(const Vector2& p_a, const Vector2& p_b) const
{
return DotImpl(p_a.m_data, p_b.m_data);
} // vtable+0x38
// FUNCTION: LEGO1 0x10002110 // FUNCTION: LEGO1 0x10002110
virtual float Dot(float* p_a, Vector2* p_b) const { return DotImpl(p_a, p_b->m_data); } // vtable+0x34 virtual float Dot(const float* p_a, const Vector2& p_b) const { return DotImpl(p_a, p_b.m_data); } // vtable+0x34
// FUNCTION: LEGO1 0x10002130 // FUNCTION: LEGO1 0x10002130
virtual float Dot(Vector2* p_a, float* p_b) const { return DotImpl(p_a->m_data, p_b); } // vtable+0x30 virtual float Dot(const Vector2& p_a, const float* p_b) const { return DotImpl(p_a.m_data, p_b); } // vtable+0x30
// FUNCTION: LEGO1 0x10002150 // FUNCTION: LEGO1 0x10002150
virtual float LenSquared() const { return m_data[0] * m_data[0] + m_data[1] * m_data[1]; } // vtable+0x40 virtual float LenSquared() const { return m_data[0] * m_data[0] + m_data[1] * m_data[1]; } // vtable+0x40
@ -110,7 +113,7 @@ public:
if (sq > 0.0f) { if (sq > 0.0f) {
float root = sqrt(sq); float root = sqrt(sq);
if (root > 0.0f) { if (root > 0.0f) {
DivScalarImpl(&root); DivImpl(root);
return 0; return 0;
} }
} }
@ -123,36 +126,36 @@ private:
virtual void Add(float p_value) { AddImpl(p_value); } // vtable+0x50 virtual void Add(float p_value) { AddImpl(p_value); } // vtable+0x50
// FUNCTION: LEGO1 0x100021d0 // FUNCTION: LEGO1 0x100021d0
virtual void Add(float* p_other) { AddImpl(p_other); } // vtable+0x4c virtual void Add(const float* p_other) { AddImpl(p_other); } // vtable+0x4c
// FUNCTION: LEGO1 0x100021e0 // FUNCTION: LEGO1 0x100021e0
virtual void Add(const Vector2& p_other) { AddImpl((float*) p_other.m_data); } // vtable+0x48 virtual void Add(const Vector2& p_other) { AddImpl(p_other.m_data); } // vtable+0x48
// FUNCTION: LEGO1 0x100021f0 // FUNCTION: LEGO1 0x100021f0
virtual void Sub(const float* p_other) { SubImpl((float*) p_other); } // vtable+0x58 virtual void Sub(const float* p_other) { SubImpl(p_other); } // vtable+0x58
// FUNCTION: LEGO1 0x10002200 // FUNCTION: LEGO1 0x10002200
virtual void Sub(const Vector2& p_other) { SubImpl((float*) p_other.m_data); } // vtable+0x54 virtual void Sub(const Vector2& p_other) { SubImpl(p_other.m_data); } // vtable+0x54
// FUNCTION: LEGO1 0x10002210 // FUNCTION: LEGO1 0x10002210
virtual void Mul(float* p_other) { MulVectorImpl(p_other); } // vtable+0x64 virtual void Mul(const float* p_other) { MulImpl(p_other); } // vtable+0x64
// FUNCTION: LEGO1 0x10002220 // FUNCTION: LEGO1 0x10002220
virtual void Mul(Vector2* p_other) { MulVectorImpl(p_other->m_data); } // vtable+0x60 virtual void Mul(const Vector2& p_other) { MulImpl(p_other.m_data); } // vtable+0x60
// FUNCTION: LEGO1 0x10002230 // FUNCTION: LEGO1 0x10002230
virtual void Mul(const float& p_value) { MulScalarImpl((float*) &p_value); } // vtable+0x5c virtual void Mul(const float& p_value) { MulImpl(p_value); } // vtable+0x5c
// FUNCTION: LEGO1 0x10002240 // FUNCTION: LEGO1 0x10002240
virtual void Div(const float& p_value) { DivScalarImpl((float*) &p_value); } // vtable+0x68 virtual void Div(const float& p_value) { DivImpl(p_value); } // vtable+0x68
public: public:
// FUNCTION: LEGO1 0x10002250 // FUNCTION: LEGO1 0x10002250
virtual void SetVector(float* p_other) { EqualsImpl(p_other); } // vtable+0x70 virtual void SetVector(const float* p_other) { EqualsImpl(p_other); } // vtable+0x70
// FUNCTION: LEGO1 0x10002260 // FUNCTION: LEGO1 0x10002260
// FUNCTION: BETA10 0x100110c0 // FUNCTION: BETA10 0x100110c0
virtual void SetVector(const Vector2* p_other) { EqualsImpl(p_other->m_data); } // vtable+0x6c virtual void SetVector(const Vector2& p_other) { EqualsImpl(p_other.m_data); } // vtable+0x6c
// Note: it's unclear whether Vector3::operator= has been defined explicitly // Note: it's unclear whether Vector3::operator= has been defined explicitly
// with the same function body as Vector2& operator=. The BETA indicates that; // with the same function body as Vector2& operator=. The BETA indicates that;
@ -179,7 +182,7 @@ public:
Vector2& operator=(const Vector2& p_other) Vector2& operator=(const Vector2& p_other)
{ {
Vector2::SetVector(&p_other); Vector2::SetVector(p_other);
return *this; return *this;
} }
@ -190,14 +193,14 @@ public:
const float& operator[](int idx) const { return m_data[idx]; } const float& operator[](int idx) const { return m_data[idx]; }
void operator+=(float p_value) { Add(p_value); } void operator+=(float p_value) { Add(p_value); }
void operator+=(float* p_other) { Add(p_other); } void operator+=(const float* p_other) { Add(p_other); }
void operator+=(const Vector2& p_other) { Add(p_other); } void operator+=(const Vector2& p_other) { Add(p_other); }
void operator-=(const float* p_other) { Sub(p_other); } void operator-=(const float* p_other) { Sub(p_other); }
void operator-=(const Vector2& p_other) { Sub(p_other); } void operator-=(const Vector2& p_other) { Sub(p_other); }
void operator*=(float* p_other) { Mul(p_other); } void operator*=(const float* p_other) { Mul(p_other); }
void operator*=(Vector2* p_other) { Mul(p_other); } void operator*=(const Vector2& p_other) { Mul(p_other); }
void operator*=(const float& p_value) { Mul(p_value); } void operator*=(const float& p_value) { Mul(p_value); }
void operator/=(const float& p_value) { Div(p_value); } void operator/=(const float& p_value) { Div(p_value); }
@ -228,7 +231,7 @@ public:
// FUNCTION: LEGO1 0x10002270 // FUNCTION: LEGO1 0x10002270
// FUNCTION: BETA10 0x10011350 // FUNCTION: BETA10 0x10011350
virtual void EqualsCrossImpl(float* p_a, float* p_b) virtual void EqualsCrossImpl(const float* p_a, const float* p_b)
{ {
m_data[0] = p_a[1] * p_b[2] - p_a[2] * p_b[1]; m_data[0] = p_a[1] * p_b[2] - p_a[2] * p_b[1];
m_data[1] = p_a[2] * p_b[0] - p_a[0] * p_b[2]; m_data[1] = p_a[2] * p_b[0] - p_a[0] * p_b[2];
@ -237,13 +240,16 @@ public:
// FUNCTION: LEGO1 0x100022c0 // FUNCTION: LEGO1 0x100022c0
// FUNCTION: BETA10 0x10011430 // FUNCTION: BETA10 0x10011430
virtual void EqualsCross(Vector3* p_a, Vector3* p_b) { EqualsCrossImpl(p_a->m_data, p_b->m_data); } // vtable+0x80 virtual void EqualsCross(const Vector3& p_a, const Vector3& p_b)
{
EqualsCrossImpl(p_a.m_data, p_b.m_data);
} // vtable+0x80
// FUNCTION: LEGO1 0x100022e0 // FUNCTION: LEGO1 0x100022e0
virtual void EqualsCross(Vector3* p_a, float* p_b) { EqualsCrossImpl(p_a->m_data, p_b); } // vtable+0x7c virtual void EqualsCross(const Vector3& p_a, const float* p_b) { EqualsCrossImpl(p_a.m_data, p_b); } // vtable+0x7c
// FUNCTION: LEGO1 0x10002300 // FUNCTION: LEGO1 0x10002300
virtual void EqualsCross(float* p_a, Vector3* p_b) { EqualsCrossImpl(p_a, p_b->m_data); } // vtable+0x78 virtual void EqualsCross(const float* p_a, const Vector3& p_b) { EqualsCrossImpl(p_a, p_b.m_data); } // vtable+0x78
// FUNCTION: LEGO1 0x10003bf0 // FUNCTION: LEGO1 0x10003bf0
virtual void Fill(const float& p_value) virtual void Fill(const float& p_value)
@ -256,7 +262,7 @@ public:
// Vector2 overrides // Vector2 overrides
// FUNCTION: LEGO1 0x10003a60 // FUNCTION: LEGO1 0x10003a60
void AddImpl(float* p_value) override void AddImpl(const float* p_value) override
{ {
m_data[0] += p_value[0]; m_data[0] += p_value[0];
m_data[1] += p_value[1]; m_data[1] += p_value[1];
@ -272,46 +278,46 @@ public:
} // vtable+0x00 } // vtable+0x00
// FUNCTION: LEGO1 0x10003ac0 // FUNCTION: LEGO1 0x10003ac0
void SubImpl(float* p_value) override void SubImpl(const float* p_value) override
{ {
m_data[0] -= p_value[0]; m_data[0] -= p_value[0];
m_data[1] -= p_value[1]; m_data[1] -= p_value[1];
m_data[2] -= p_value[2]; m_data[2] -= p_value[2];
} // vtable+0x08 } // vtable+0x08
// FUNCTION: LEGO1 0x10003b20
void MulScalarImpl(float* p_value) override
{
m_data[0] *= *p_value;
m_data[1] *= *p_value;
m_data[2] *= *p_value;
} // vtable+0x0c
// FUNCTION: LEGO1 0x10003af0 // FUNCTION: LEGO1 0x10003af0
void MulVectorImpl(float* p_value) override void MulImpl(const float* p_value) override
{ {
m_data[0] *= p_value[0]; m_data[0] *= p_value[0];
m_data[1] *= p_value[1]; m_data[1] *= p_value[1];
m_data[2] *= p_value[2]; m_data[2] *= p_value[2];
} // vtable+0x10 } // vtable+0x10
// FUNCTION: LEGO1 0x10003b50 // FUNCTION: LEGO1 0x10003b20
void DivScalarImpl(float* p_value) override void MulImpl(const float& p_value) override
{ {
m_data[0] /= *p_value; m_data[0] *= p_value;
m_data[1] /= *p_value; m_data[1] *= p_value;
m_data[2] /= *p_value; m_data[2] *= p_value;
} // vtable+0x0c
// FUNCTION: LEGO1 0x10003b50
void DivImpl(const float& p_value) override
{
m_data[0] /= p_value;
m_data[1] /= p_value;
m_data[2] /= p_value;
} // vtable+0x14 } // vtable+0x14
// FUNCTION: LEGO1 0x10003b80 // FUNCTION: LEGO1 0x10003b80
float DotImpl(float* p_a, float* p_b) const override float DotImpl(const float* p_a, const float* p_b) const override
{ {
return p_a[0] * p_b[0] + p_a[2] * p_b[2] + p_a[1] * p_b[1]; return p_a[0] * p_b[0] + p_a[2] * p_b[2] + p_a[1] * p_b[1];
} // vtable+0x18 } // vtable+0x18
// FUNCTION: LEGO1 0x10003ba0 // FUNCTION: LEGO1 0x10003ba0
// FUNCTION: BETA10 0x100113f0 // FUNCTION: BETA10 0x100113f0
void EqualsImpl(float* p_data) override { memcpy(m_data, p_data, sizeof(float) * 3); } // vtable+0x20 void EqualsImpl(const float* p_data) override { memcpy(m_data, p_data, sizeof(float) * 3); } // vtable+0x20
// FUNCTION: LEGO1 0x10003bc0 // FUNCTION: LEGO1 0x10003bc0
// FUNCTION: BETA10 0x100114f0 // FUNCTION: BETA10 0x100114f0
@ -349,7 +355,7 @@ public:
// in reverse order of appearance. // in reverse order of appearance.
// FUNCTION: LEGO1 0x10002a40 // FUNCTION: LEGO1 0x10002a40
virtual void SetMatrixProduct(float* p_vec, float* p_mat) virtual void SetMatrixProduct(const float* p_vec, const float* p_mat)
{ {
m_data[0] = p_vec[0] * p_mat[0] + p_vec[1] * p_mat[4] + p_vec[2] * p_mat[8] + p_vec[3] * p_mat[12]; m_data[0] = p_vec[0] * p_mat[0] + p_vec[1] * p_mat[4] + p_vec[2] * p_mat[8] + p_vec[3] * p_mat[12];
m_data[1] = p_vec[0] * p_mat[1] + p_vec[1] * p_mat[5] + p_vec[2] * p_mat[9] + p_vec[4] * p_mat[13]; m_data[1] = p_vec[0] * p_mat[1] + p_vec[1] * p_mat[5] + p_vec[2] * p_mat[9] + p_vec[4] * p_mat[13];
@ -358,15 +364,18 @@ public:
} // vtable+0x8c } // vtable+0x8c
// FUNCTION: LEGO1 0x10002ae0 // FUNCTION: LEGO1 0x10002ae0
virtual void SetMatrixProduct(Vector4* p_a, float* p_b) { SetMatrixProduct(p_a->m_data, p_b); } // vtable+0x88 virtual void SetMatrixProduct(const Vector4& p_a, const float* p_b)
{
SetMatrixProduct(p_a.m_data, p_b);
} // vtable+0x88
inline virtual int NormalizeQuaternion(); // vtable+0x90 inline virtual int NormalizeQuaternion(); // vtable+0x90
inline virtual int EqualsHamiltonProduct(Vector4* p_a, Vector4* p_b); // vtable+0x94 inline virtual int EqualsHamiltonProduct(const Vector4& p_a, const Vector4& p_b); // vtable+0x94
// Vector3 overrides // Vector3 overrides
// FUNCTION: LEGO1 0x10002870 // FUNCTION: LEGO1 0x10002870
void AddImpl(float* p_value) override void AddImpl(const float* p_value) override
{ {
m_data[0] += p_value[0]; m_data[0] += p_value[0];
m_data[1] += p_value[1]; m_data[1] += p_value[1];
@ -384,7 +393,7 @@ public:
} // vtable+0x00 } // vtable+0x00
// FUNCTION: LEGO1 0x100028f0 // FUNCTION: LEGO1 0x100028f0
void SubImpl(float* p_value) override void SubImpl(const float* p_value) override
{ {
m_data[0] -= p_value[0]; m_data[0] -= p_value[0];
m_data[1] -= p_value[1]; m_data[1] -= p_value[1];
@ -392,17 +401,8 @@ public:
m_data[3] -= p_value[3]; m_data[3] -= p_value[3];
} // vtable+0x08 } // vtable+0x08
// FUNCTION: LEGO1 0x10002970
void MulScalarImpl(float* p_value) override
{
m_data[0] *= *p_value;
m_data[1] *= *p_value;
m_data[2] *= *p_value;
m_data[3] *= *p_value;
} // vtable+0x0c
// FUNCTION: LEGO1 0x10002930 // FUNCTION: LEGO1 0x10002930
void MulVectorImpl(float* p_value) override void MulImpl(const float* p_value) override
{ {
m_data[0] *= p_value[0]; m_data[0] *= p_value[0];
m_data[1] *= p_value[1]; m_data[1] *= p_value[1];
@ -410,23 +410,32 @@ public:
m_data[3] *= p_value[3]; m_data[3] *= p_value[3];
} // vtable+0x10 } // vtable+0x10
// FUNCTION: LEGO1 0x100029b0 // FUNCTION: LEGO1 0x10002970
void DivScalarImpl(float* p_value) override void MulImpl(const float& p_value) override
{ {
m_data[0] /= *p_value; m_data[0] *= p_value;
m_data[1] /= *p_value; m_data[1] *= p_value;
m_data[2] /= *p_value; m_data[2] *= p_value;
m_data[3] /= *p_value; m_data[3] *= p_value;
} // vtable+0x0c
// FUNCTION: LEGO1 0x100029b0
void DivImpl(const float& p_value) override
{
m_data[0] /= p_value;
m_data[1] /= p_value;
m_data[2] /= p_value;
m_data[3] /= p_value;
} // vtable+0x14 } // vtable+0x14
// FUNCTION: LEGO1 0x100029f0 // FUNCTION: LEGO1 0x100029f0
float DotImpl(float* p_a, float* p_b) const override float DotImpl(const float* p_a, const float* p_b) const override
{ {
return p_a[0] * p_b[0] + p_a[2] * p_b[2] + (p_a[1] * p_b[1] + p_a[3] * p_b[3]); return p_a[0] * p_b[0] + p_a[2] * p_b[2] + (p_a[1] * p_b[1] + p_a[3] * p_b[3]);
} // vtable+0x18 } // vtable+0x18
// FUNCTION: LEGO1 0x10002a20 // FUNCTION: LEGO1 0x10002a20
void EqualsImpl(float* p_data) override { memcpy(m_data, p_data, sizeof(float) * 4); } // vtable+0x20 void EqualsImpl(const float* p_data) override { memcpy(m_data, p_data, sizeof(float) * 4); } // vtable+0x20
// FUNCTION: LEGO1 0x10002b00 // FUNCTION: LEGO1 0x10002b00
void Clear() override { memset(m_data, 0, sizeof(float) * 4); } // vtable+0x2c void Clear() override { memset(m_data, 0, sizeof(float) * 4); } // vtable+0x2c
@ -464,13 +473,14 @@ inline int Vector4::NormalizeQuaternion()
float theta = v[3] * 0.5f; float theta = v[3] * 0.5f;
v[3] = cos(theta); v[3] = cos(theta);
magnitude = sin(theta) / sqrt(magnitude); magnitude = sin(theta) / sqrt(magnitude);
Vector3::MulScalarImpl(&magnitude); Vector3::MulImpl(magnitude);
return 0; return 0;
} }
return -1; return -1;
} }
inline static float QuaternionProductScalarPart(float* bDat, float* aDat) inline static float QuaternionProductScalarPart(const float* bDat, const float* aDat)
{ {
// We have no indication from the beta that this function exists, // We have no indication from the beta that this function exists,
// but it helps with the stack layout of Vector4::EqualsHamiltonProduct() // but it helps with the stack layout of Vector4::EqualsHamiltonProduct()
@ -479,15 +489,15 @@ inline static float QuaternionProductScalarPart(float* bDat, float* aDat)
// FUNCTION: LEGO1 0x10002bf0 // FUNCTION: LEGO1 0x10002bf0
// FUNCTION: BETA10 0x10048c20 // FUNCTION: BETA10 0x10048c20
inline int Vector4::EqualsHamiltonProduct(Vector4* p_a, Vector4* p_b) inline int Vector4::EqualsHamiltonProduct(const Vector4& p_a, const Vector4& p_b)
{ {
m_data[3] = QuaternionProductScalarPart(p_a->m_data, p_b->m_data); m_data[3] = QuaternionProductScalarPart(p_a.m_data, p_b.m_data);
Vector3::EqualsCrossImpl(p_a->m_data, p_b->m_data); Vector3::EqualsCrossImpl(p_a.m_data, p_b.m_data);
m_data[0] = p_b->m_data[3] * p_a->m_data[0] + p_a->m_data[3] * p_b->m_data[0] + m_data[0]; m_data[0] = p_b.m_data[3] * p_a.m_data[0] + p_a.m_data[3] * p_b.m_data[0] + m_data[0];
m_data[1] = p_b->m_data[1] * p_a->m_data[3] + p_a->m_data[1] * p_b->m_data[3] + m_data[1]; m_data[1] = p_b.m_data[1] * p_a.m_data[3] + p_a.m_data[1] * p_b.m_data[3] + m_data[1];
m_data[2] = p_b->m_data[2] * p_a->m_data[3] + p_a->m_data[2] * p_b->m_data[3] + m_data[2]; m_data[2] = p_b.m_data[2] * p_a.m_data[3] + p_a.m_data[2] * p_b.m_data[3] + m_data[2];
return 0; return 0;
} }

View file

@ -435,10 +435,10 @@ void ViewManager::UpdateViewTransformations()
y = a; y = a;
y -= b; y -= b;
normal.EqualsCross(&x, &y); normal.EqualsCross(x, y);
normal.Unitize(); normal.Unitize();
frustum_planes[i][3] = -normal.Dot(&normal, &a); frustum_planes[i][3] = -normal.Dot(normal, a);
} }
flags |= c_bit4; flags |= c_bit4;