Merge pull request #182 from foxtacles/mergeii

Merge from isledecomp/isle
This commit is contained in:
Christian Semmler 2025-05-26 10:02:15 -07:00 committed by GitHub
commit ca3ced4d26
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
37 changed files with 542 additions and 305 deletions

View File

@ -330,7 +330,7 @@ target_link_libraries(lego1 PRIVATE Vec::Vec)
# geom sources # geom sources
target_sources(lego1 PRIVATE target_sources(lego1 PRIVATE
LEGO1/lego/sources/geom/legoedge.cpp LEGO1/lego/sources/geom/legoedge.cpp
LEGO1/lego/sources/geom/legounkown100db7f4.cpp LEGO1/lego/sources/geom/legoorientededge.cpp
LEGO1/lego/sources/geom/legoweedge.cpp LEGO1/lego/sources/geom/legoweedge.cpp
LEGO1/lego/sources/geom/legowegedge.cpp LEGO1/lego/sources/geom/legowegedge.cpp
) )

View File

@ -140,7 +140,7 @@ class Act3Brickster : public Act3Actor {
MxResult HitActor(LegoPathActor* p_actor, MxBool p_bool) override; // vtable+0x94 MxResult HitActor(LegoPathActor* p_actor, MxBool p_bool) override; // vtable+0x94
void SwitchBoundary( void SwitchBoundary(
LegoPathBoundary*& p_boundary, LegoPathBoundary*& p_boundary,
LegoUnknown100db7f4*& p_edge, LegoOrientedEdge*& p_edge,
float& p_unk0xe4 float& p_unk0xe4
) override; // vtable+0x98 ) override; // vtable+0x98
MxResult VTable0x9c() override; // vtable+0x9c MxResult VTable0x9c() override; // vtable+0x9c

View File

@ -17,7 +17,7 @@ class LegoFile;
class LegoPathActor; class LegoPathActor;
class LegoPathBoundary; class LegoPathBoundary;
class LegoROIList; class LegoROIList;
struct LegoUnknown100db7f4; struct LegoOrientedEdge;
class LegoWorld; class LegoWorld;
class MxDSAction; class MxDSAction;
@ -241,7 +241,7 @@ class LegoAnimationManager : public MxCore {
void FUN_10063d10(); void FUN_10063d10();
void FUN_10063e40(LegoAnimPresenter* p_presenter); void FUN_10063e40(LegoAnimPresenter* p_presenter);
MxBool FUN_10063fb0(LegoLocation::Boundary* p_boundary, LegoWorld* p_world); MxBool FUN_10063fb0(LegoLocation::Boundary* p_boundary, LegoWorld* p_world);
MxBool FUN_10064010(LegoPathBoundary* p_boundary, LegoUnknown100db7f4* p_edge, float p_destScale); MxBool FUN_10064010(LegoPathBoundary* p_boundary, LegoOrientedEdge* p_edge, float p_destScale);
MxBool FUN_10064120(LegoLocation::Boundary* p_boundary, MxBool p_bool1, MxBool p_bool2); MxBool FUN_10064120(LegoLocation::Boundary* p_boundary, MxBool p_bool1, MxBool p_bool2);
MxResult FUN_10064380( MxResult FUN_10064380(
const char* p_name, const char* p_name,

View File

@ -10,7 +10,7 @@ struct LegoNamedPlane;
class LegoPathBoundary; class LegoPathBoundary;
class LegoPathController; class LegoPathController;
struct LegoPathEdgeContainer; struct LegoPathEdgeContainer;
struct LegoUnknown100db7f4; struct LegoOrientedEdge;
class LegoWEEdge; class LegoWEEdge;
extern MxLong g_unk0x100f3308; extern MxLong g_unk0x100f3308;
@ -67,7 +67,7 @@ class LegoPathActor : public LegoActor {
float p_time, float p_time,
Vector3& p_p1, Vector3& p_p1,
Vector3& p_p4, Vector3& p_p4,
LegoUnknown100db7f4& p_destEdge, LegoOrientedEdge& p_destEdge,
float p_destScale float p_destScale
); // vtable+0x84 ); // vtable+0x84
virtual MxResult VTable0x88( virtual MxResult VTable0x88(
@ -75,7 +75,7 @@ class LegoPathActor : public LegoActor {
float p_time, float p_time,
LegoEdge& p_srcEdge, LegoEdge& p_srcEdge,
float p_srcScale, float p_srcScale,
LegoUnknown100db7f4& p_destEdge, LegoOrientedEdge& p_destEdge,
float p_destScale float p_destScale
); // vtable+0x88 ); // vtable+0x88
virtual MxS32 VTable0x8c(float p_time, Matrix4& p_transform); // vtable+0x8c virtual MxS32 VTable0x8c(float p_time, Matrix4& p_transform); // vtable+0x8c
@ -88,7 +88,7 @@ class LegoPathActor : public LegoActor {
virtual void SwitchBoundary( virtual void SwitchBoundary(
LegoPathBoundary*& p_boundary, LegoPathBoundary*& p_boundary,
LegoUnknown100db7f4*& p_edge, LegoOrientedEdge*& p_edge,
float& p_unk0xe4 float& p_unk0xe4
); // vtable+0x98 ); // vtable+0x98
virtual MxResult VTable0x9c(); // vtable+0x9c virtual MxResult VTable0x9c(); // vtable+0x9c
@ -182,7 +182,7 @@ class LegoPathActor : public LegoActor {
LegoPathBoundary* m_boundary; // 0x88 LegoPathBoundary* m_boundary; // 0x88
LegoUnknown m_unk0x8c; // 0x8c LegoUnknown m_unk0x8c; // 0x8c
MxU32 m_actorState; // 0xdc MxU32 m_actorState; // 0xdc
LegoUnknown100db7f4* m_destEdge; // 0xe0 LegoOrientedEdge* m_destEdge; // 0xe0
MxFloat m_unk0xe4; // 0xe4 MxFloat m_unk0xe4; // 0xe4
MxBool m_collideBox; // 0xe8 MxBool m_collideBox; // 0xe8
MxBool m_unk0xe9; // 0xe9 MxBool m_unk0xe9; // 0xe9

View File

@ -43,16 +43,10 @@ class LegoPathBoundary : public LegoWEGEdge {
void SwitchBoundary( void SwitchBoundary(
LegoPathActor* p_actor, LegoPathActor* p_actor,
LegoPathBoundary*& p_boundary, LegoPathBoundary*& p_boundary,
LegoUnknown100db7f4*& p_edge, LegoOrientedEdge*& p_edge,
float& p_unk0xe4 float& p_unk0xe4
); );
MxU32 Intersect( MxU32 Intersect(float p_scale, Vector3& p_point1, Vector3& p_point2, Vector3& p_point3, LegoOrientedEdge*& p_edge);
float p_scale,
Vector3& p_point1,
Vector3& p_point2,
Vector3& p_point3,
LegoUnknown100db7f4*& p_edge
);
MxU32 FUN_10057fe0(LegoAnimPresenter* p_presenter); MxU32 FUN_10057fe0(LegoAnimPresenter* p_presenter);
MxU32 FUN_100586e0(LegoAnimPresenter* p_presenter); MxU32 FUN_100586e0(LegoAnimPresenter* p_presenter);
@ -188,7 +182,7 @@ class LegoPathBoundary : public LegoWEGEdge {
// _Tree<LegoPathActor *,LegoPathActor *,set<LegoPathActor *,LegoPathActorSetCompare,allocator<LegoPathActor *> >::_Kfn,LegoPathActorSetCompare,allocator<LegoPathActor *> >::lower_bound // _Tree<LegoPathActor *,LegoPathActor *,set<LegoPathActor *,LegoPathActorSetCompare,allocator<LegoPathActor *> >::_Kfn,LegoPathActorSetCompare,allocator<LegoPathActor *> >::lower_bound
// TEMPLATE: BETA10 0x10082b90 // TEMPLATE: BETA10 0x10082b90
// _Tree<LegoAnimPresenter *,LegoAnimPresenter *,set<LegoAnimPresenter *,LegoAnimPresenterSetCompare,allocator<LegoAnimPresenter *> >::_Kfn,LegoAnimPresenterSetCompare,allocator<LegoAnimPresenter *> >::const_iterator::operator++ // ??Econst_iterator@?$_Tree@PAVLegoAnimPresenter@@PAV1@U_Kfn@?$set@PAVLegoAnimPresenter@@ULegoAnimPresenterSetCompare@@V?$allocator@PAVLegoAnimPresenter@@@@@@ULegoAnimPresenterSetCompare@@V?$allocator@PAVLegoAnimPresenter@@@@@@QAE?AV01@H@Z
// TEMPLATE: BETA10 0x10082ee0 // TEMPLATE: BETA10 0x10082ee0
// set<LegoAnimPresenter *,LegoAnimPresenterSetCompare,allocator<LegoAnimPresenter *> >::end // set<LegoAnimPresenter *,LegoAnimPresenterSetCompare,allocator<LegoAnimPresenter *> >::end
@ -197,13 +191,13 @@ class LegoPathBoundary : public LegoWEGEdge {
// _Tree<LegoAnimPresenter *,LegoAnimPresenter *,set<LegoAnimPresenter *,LegoAnimPresenterSetCompare,allocator<LegoAnimPresenter *> >::_Kfn,LegoAnimPresenterSetCompare,allocator<LegoAnimPresenter *> >::const_iterator::operator* // _Tree<LegoAnimPresenter *,LegoAnimPresenter *,set<LegoAnimPresenter *,LegoAnimPresenterSetCompare,allocator<LegoAnimPresenter *> >::_Kfn,LegoAnimPresenterSetCompare,allocator<LegoAnimPresenter *> >::const_iterator::operator*
// TEMPLATE: BETA10 0x10021dc0 // TEMPLATE: BETA10 0x10021dc0
// Set<LegoPathActor *,LegoPathActorSetCompare>::Set<LegoPathActor *,LegoPathActorSetCompare> // ??0?$Set@PAVLegoPathActor@@ULegoPathActorSetCompare@@@@QAE@ABV0@@Z
// TEMPLATE: BETA10 0x100202d0 // TEMPLATE: BETA10 0x100202d0
// set<LegoPathActor *,LegoPathActorSetCompare,allocator<LegoPathActor *> >::begin // set<LegoPathActor *,LegoPathActorSetCompare,allocator<LegoPathActor *> >::begin
// TEMPLATE: BETA10 0x10020030 // TEMPLATE: BETA10 0x10020030
// _Tree<LegoPathActor *,LegoPathActor *,set<LegoPathActor *,LegoPathActorSetCompare,allocator<LegoPathActor *> >::_Kfn,LegoPathActorSetCompare,allocator<LegoPathActor *> >::const_iterator::operator++ // ??Econst_iterator@?$_Tree@PAVLegoPathActor@@PAV1@U_Kfn@?$set@PAVLegoPathActor@@ULegoPathActorSetCompare@@V?$allocator@PAVLegoPathActor@@@@@@ULegoPathActorSetCompare@@V?$allocator@PAVLegoPathActor@@@@@@QAE?AV01@H@Z
// TEMPLATE: BETA10 0x100203d0 // TEMPLATE: BETA10 0x100203d0
// set<LegoPathActor *,LegoPathActorSetCompare,allocator<LegoPathActor *> >::end // set<LegoPathActor *,LegoPathActorSetCompare,allocator<LegoPathActor *> >::end

View File

@ -2,7 +2,7 @@
#define LEGOPATHCONTROLLER_H #define LEGOPATHCONTROLLER_H
#include "decomp.h" #include "decomp.h"
#include "geom/legounkown100db7f4.h" #include "geom/legoorientededge.h"
#include "legopathactor.h" #include "legopathactor.h"
#include "legopathboundary.h" #include "legopathboundary.h"
#include "legopathstruct.h" #include "legopathstruct.h"
@ -21,7 +21,7 @@ class Vector3;
// VTABLE: LEGO1 0x100d7da8 // VTABLE: LEGO1 0x100d7da8
// SIZE 0x40 // SIZE 0x40
struct LegoPathCtrlEdge : public LegoUnknown100db7f4 {}; struct LegoPathCtrlEdge : public LegoOrientedEdge {};
struct LegoPathCtrlEdgeCompare { struct LegoPathCtrlEdgeCompare {
MxU32 operator()(const LegoPathCtrlEdge* p_lhs, const LegoPathCtrlEdge* p_rhs) const MxU32 operator()(const LegoPathCtrlEdge* p_lhs, const LegoPathCtrlEdge* p_rhs) const
@ -60,7 +60,7 @@ class LegoPathController : public MxCore {
} }
LegoPathController* m_controller; // 0x00 LegoPathController* m_controller; // 0x00
LegoUnknown100db7f4* m_edge; // 0x04 LegoOrientedEdge* m_edge; // 0x04
}; };
LegoPathController(); LegoPathController();
@ -131,7 +131,7 @@ class LegoPathController : public MxCore {
Vector3& p_v1, Vector3& p_v1,
Vector3& p_v2, Vector3& p_v2,
float p_f1, float p_f1,
LegoUnknown100db7f4*& p_edge, LegoOrientedEdge*& p_edge,
LegoPathBoundary*& p_boundary LegoPathBoundary*& p_boundary
); );
MxResult FUN_1004a380( MxResult FUN_1004a380(
@ -149,13 +149,13 @@ class LegoPathController : public MxCore {
static MxResult Reset(); static MxResult Reset();
// FUNCTION: BETA10 0x100cf580 // FUNCTION: BETA10 0x100cf580
static LegoUnknown100db7f4* GetControlEdgeA(MxS32 p_index) { return g_ctrlEdgesA[p_index].m_edge; } static LegoOrientedEdge* GetControlEdgeA(MxS32 p_index) { return g_ctrlEdgesA[p_index].m_edge; }
// FUNCTION: BETA10 0x100cf5b0 // FUNCTION: BETA10 0x100cf5b0
static LegoPathBoundary* GetControlBoundaryA(MxS32 p_index) { return g_ctrlBoundariesA[p_index].m_boundary; } static LegoPathBoundary* GetControlBoundaryA(MxS32 p_index) { return g_ctrlBoundariesA[p_index].m_boundary; }
// These two are an educated guess because BETA10 does not have the g_ctrl.*B globals // These two are an educated guess because BETA10 does not have the g_ctrl.*B globals
static LegoUnknown100db7f4* GetControlEdgeB(MxS32 p_index) { return g_ctrlEdgesB[p_index].m_edge; } static LegoOrientedEdge* GetControlEdgeB(MxS32 p_index) { return g_ctrlEdgesB[p_index].m_edge; }
static LegoPathBoundary* GetControlBoundaryB(MxS32 p_index) { return g_ctrlBoundariesB[p_index].m_boundary; } static LegoPathBoundary* GetControlBoundaryB(MxS32 p_index) { return g_ctrlBoundariesB[p_index].m_boundary; }
private: private:
@ -269,7 +269,7 @@ class LegoPathController : public MxCore {
// LegoPathCtrlEdge::~LegoPathCtrlEdge // LegoPathCtrlEdge::~LegoPathCtrlEdge
// SYNTHETIC: LEGO1 0x10047ae0 // SYNTHETIC: LEGO1 0x10047ae0
// LegoUnknown100db7f4::~LegoUnknown100db7f4 // LegoOrientedEdge::~LegoOrientedEdge
// TEMPLATE: LEGO1 0x10048f00 // TEMPLATE: LEGO1 0x10048f00
// list<LegoBoundaryEdge,allocator<LegoBoundaryEdge> >::begin // list<LegoBoundaryEdge,allocator<LegoBoundaryEdge> >::begin

View File

@ -72,7 +72,7 @@ class LegoJetski : public LegoJetskiRaceActor, public LegoRaceMap {
MxResult HitActor(LegoPathActor* p_actor, MxBool p_bool) override; // vtable+0x94 MxResult HitActor(LegoPathActor* p_actor, MxBool p_bool) override; // vtable+0x94
// FUNCTION: LEGO1 0x100141d0 // FUNCTION: LEGO1 0x100141d0
void SwitchBoundary(LegoPathBoundary*& p_boundary, LegoUnknown100db7f4*& p_edge, float& p_unk0xe4) override void SwitchBoundary(LegoPathBoundary*& p_boundary, LegoOrientedEdge*& p_edge, float& p_unk0xe4) override
{ {
LegoJetskiRaceActor::SwitchBoundary(p_boundary, p_edge, p_unk0xe4); LegoJetskiRaceActor::SwitchBoundary(p_boundary, p_edge, p_unk0xe4);
} // vtable+0x98 } // vtable+0x98
@ -136,7 +136,7 @@ class LegoRaceCar : public LegoCarRaceActor, public LegoRaceMap {
// FUNCTION: LEGO1 0x10014560 // FUNCTION: LEGO1 0x10014560
// FUNCTION: BETA10 0x100cd660 // FUNCTION: BETA10 0x100cd660
void SwitchBoundary(LegoPathBoundary*& p_boundary, LegoUnknown100db7f4*& p_edge, float& p_unk0xe4) override void SwitchBoundary(LegoPathBoundary*& p_boundary, LegoOrientedEdge*& p_edge, float& p_unk0xe4) override
{ {
LegoCarRaceActor::SwitchBoundary(p_boundary, p_edge, p_unk0xe4); LegoCarRaceActor::SwitchBoundary(p_boundary, p_edge, p_unk0xe4);
} // vtable+0x98 } // vtable+0x98

View File

@ -44,7 +44,7 @@ class LegoCarRaceActor : public virtual LegoRaceActor {
Vector3& p_v3 Vector3& p_v3
) override; // vtable+0x6c ) override; // vtable+0x6c
void Animate(float p_time) override; // vtable+0x70 void Animate(float p_time) override; // vtable+0x70
void SwitchBoundary(LegoPathBoundary*& p_boundary, LegoUnknown100db7f4*& p_edge, float& p_unk0xe4) void SwitchBoundary(LegoPathBoundary*& p_boundary, LegoOrientedEdge*& p_edge, float& p_unk0xe4)
override; // vtable+0x98 override; // vtable+0x98
MxResult VTable0x9c() override; // vtable+0x9c MxResult VTable0x9c() override; // vtable+0x9c

View File

@ -417,7 +417,7 @@ void Act2Actor::FUN_100192a0(undefined4 p_location)
newPosition, newPosition,
newDirection, newDirection,
newBoundary, newBoundary,
LegoUnknown100db7f4::c_bit1, LegoOrientedEdge::c_bit1,
NULL NULL
); );

View File

@ -354,7 +354,7 @@ MxResult Act3Cop::FUN_10040360()
local7c, local7c,
local5c, local5c,
boundary, boundary,
LegoUnknown100db7f4::c_bit1, LegoOrientedEdge::c_bit1,
&local34 &local34
) != SUCCESS) { ) != SUCCESS) {
delete grec; delete grec;
@ -392,7 +392,7 @@ MxResult Act3Cop::FUN_10040360()
local88, local88,
localec, localec,
donut->GetBoundary(), donut->GetBoundary(),
LegoUnknown100db7f4::c_bit1, LegoOrientedEdge::c_bit1,
&locald8 &locald8
) == SUCCESS && ) == SUCCESS &&
(grec == NULL || locald8 < local18)) { (grec == NULL || locald8 < local18)) {
@ -432,7 +432,7 @@ MxResult Act3Cop::FUN_10040360()
localf8, localf8,
local108, local108,
boundary, boundary,
LegoUnknown100db7f4::c_bit1, LegoOrientedEdge::c_bit1,
&local100 &local100
) != SUCCESS) { ) != SUCCESS) {
local14c = local150 = grec; local14c = local150 = grec;
@ -832,7 +832,7 @@ MxResult Act3Brickster::FUN_100417c0()
local88, local88,
localec, localec,
pizza->GetBoundary(), pizza->GetBoundary(),
LegoUnknown100db7f4::c_bit1, LegoOrientedEdge::c_bit1,
&locald8 &locald8
) == SUCCESS && ) == SUCCESS &&
(grec == NULL || locald8 < local18)) { (grec == NULL || locald8 < local18)) {
@ -916,7 +916,7 @@ MxResult Act3Brickster::FUN_100417c0()
local108, local108,
local138, local138,
localf4, localf4,
LegoUnknown100db7f4::c_bit1, LegoOrientedEdge::c_bit1,
&local13c &local13c
) != SUCCESS) { ) != SUCCESS) {
local1bc = local1c0 = grec; local1bc = local1c0 = grec;
@ -1056,7 +1056,7 @@ MxS32 Act3Brickster::FUN_10042300()
assert(m_boundary && m_destEdge && m_roi); assert(m_boundary && m_destEdge && m_roi);
LegoPathBoundary* boundaries[2]; LegoPathBoundary* boundaries[2];
LegoUnknown100db7f4* maxE = NULL; LegoOrientedEdge* maxE = NULL;
boundaries[0] = m_boundary; boundaries[0] = m_boundary;
if (m_destEdge->FUN_10048c40(local38)) { if (m_destEdge->FUN_10048c40(local38)) {
@ -1070,7 +1070,7 @@ MxS32 Act3Brickster::FUN_10042300()
for (MxS32 i = 0; i < (MxS32) sizeOfArray(boundaries); i++) { for (MxS32 i = 0; i < (MxS32) sizeOfArray(boundaries); i++) {
if (boundaries[i] != NULL) { if (boundaries[i] != NULL) {
for (MxS32 j = 0; j < boundaries[i]->GetNumEdges(); j++) { for (MxS32 j = 0; j < boundaries[i]->GetNumEdges(); j++) {
LegoUnknown100db7f4* e = boundaries[i]->GetEdges()[j]; LegoOrientedEdge* e = boundaries[i]->GetEdges()[j];
if (e->GetMask0x03()) { if (e->GetMask0x03()) {
Mx3DPointFloat local94(*e->GetPointA()); Mx3DPointFloat local94(*e->GetPointA());
@ -1110,7 +1110,7 @@ MxS32 Act3Brickster::FUN_10042300()
// FUNCTION: LEGO1 0x10042990 // FUNCTION: LEGO1 0x10042990
// FUNCTION: BETA10 0x1001b6e2 // FUNCTION: BETA10 0x1001b6e2
void Act3Brickster::SwitchBoundary(LegoPathBoundary*& p_boundary, LegoUnknown100db7f4*& p_edge, float& p_unk0xe4) void Act3Brickster::SwitchBoundary(LegoPathBoundary*& p_boundary, LegoOrientedEdge*& p_edge, float& p_unk0xe4)
{ {
if (m_unk0x38 != 8) { if (m_unk0x38 != 8) {
m_boundary->SwitchBoundary(this, p_boundary, p_edge, p_unk0xe4); m_boundary->SwitchBoundary(this, p_boundary, p_edge, p_unk0xe4);

View File

@ -119,11 +119,11 @@ void IslePathActor::Exit()
MxS32 i; MxS32 i;
for (i = 0; i < m_boundary->GetNumEdges(); i++) { for (i = 0; i < m_boundary->GetNumEdges(); i++) {
LegoUnknown100db7f4* e = (LegoUnknown100db7f4*) m_boundary->GetEdges()[i]; LegoOrientedEdge* e = (LegoOrientedEdge*) m_boundary->GetEdges()[i];
assert(e); assert(e);
Mx3DPointFloat local20; Mx3DPointFloat local20;
e->FUN_1002ddc0(*m_boundary, local20); e->GetFaceNormal(*m_boundary, local20);
local20 *= m_roi->GetWorldBoundingSphere().Radius(); local20 *= m_roi->GetWorldBoundingSphere().Radius();
local20 += GetWorldPosition(); local20 += GetWorldPosition();

View File

@ -2468,7 +2468,7 @@ MxBool LegoAnimationManager::FUN_10063fb0(LegoLocation::Boundary* p_boundary, Le
if (p_boundary->m_name != NULL) { if (p_boundary->m_name != NULL) {
Mx3DPointFloat vec; Mx3DPointFloat vec;
LegoPathBoundary* boundary = p_world->FindPathBoundary(p_boundary->m_name); LegoPathBoundary* boundary = p_world->FindPathBoundary(p_boundary->m_name);
LegoUnknown100db7f4* pSrcE = (LegoUnknown100db7f4*) boundary->GetEdges()[p_boundary->m_src]; LegoOrientedEdge* pSrcE = (LegoOrientedEdge*) boundary->GetEdges()[p_boundary->m_src];
return FUN_10064010(boundary, pSrcE, p_boundary->m_srcScale); return FUN_10064010(boundary, pSrcE, p_boundary->m_srcScale);
} }
@ -2477,7 +2477,7 @@ MxBool LegoAnimationManager::FUN_10063fb0(LegoLocation::Boundary* p_boundary, Le
// FUNCTION: LEGO1 0x10064010 // FUNCTION: LEGO1 0x10064010
// FUNCTION: BETA10 0x100453a5 // FUNCTION: BETA10 0x100453a5
MxBool LegoAnimationManager::FUN_10064010(LegoPathBoundary* p_boundary, LegoUnknown100db7f4* p_edge, float p_destScale) MxBool LegoAnimationManager::FUN_10064010(LegoPathBoundary* p_boundary, LegoOrientedEdge* p_edge, float p_destScale)
{ {
Mx3DPointFloat p1; Mx3DPointFloat p1;
Vector3* v1 = p_edge->CWVertex(*p_boundary); Vector3* v1 = p_edge->CWVertex(*p_boundary);
@ -2525,15 +2525,15 @@ MxBool LegoAnimationManager::FUN_10064120(LegoLocation::Boundary* p_boundary, Mx
Mx3DPointFloat direction = actor->GetWorldDirection(); Mx3DPointFloat direction = actor->GetWorldDirection();
float local4c = 0.0f; float local4c = 0.0f;
LegoUnknown100db7f4* local50 = NULL; LegoOrientedEdge* local50 = NULL;
LegoS32 numEdges = boundary->GetNumEdges(); LegoS32 numEdges = boundary->GetNumEdges();
Mx3DPointFloat vec; Mx3DPointFloat vec;
LegoUnknown100db7f4* e; LegoOrientedEdge* e;
MxS32 i; MxS32 i;
for (i = 0; i < numEdges; i++) { for (i = 0; i < numEdges; i++) {
e = (LegoUnknown100db7f4*) boundary->GetEdges()[i]; e = (LegoOrientedEdge*) boundary->GetEdges()[i];
e->FUN_1002ddc0(*boundary, vec); e->GetFaceNormal(*boundary, vec);
float dot = vec.Dot(direction, vec); float dot = vec.Dot(direction, vec);
if (dot > local4c) { if (dot > local4c) {
@ -2544,7 +2544,7 @@ MxBool LegoAnimationManager::FUN_10064120(LegoLocation::Boundary* p_boundary, Mx
e = local50; e = local50;
do { do {
e = (LegoUnknown100db7f4*) e->GetCounterclockwiseEdge(*boundary); e = (LegoOrientedEdge*) e->GetCounterclockwiseEdge(*boundary);
if (e->GetMask0x03()) { if (e->GetMask0x03()) {
break; break;
} }
@ -2554,8 +2554,8 @@ MxBool LegoAnimationManager::FUN_10064120(LegoLocation::Boundary* p_boundary, Mx
return FALSE; return FALSE;
} }
LegoUnknown100db7f4* local34 = e; LegoOrientedEdge* local34 = e;
LegoUnknown100db7f4* local8 = local50; LegoOrientedEdge* local8 = local50;
while (local2c--) { while (local2c--) {
if (local34 != NULL) { if (local34 != NULL) {
@ -2566,7 +2566,7 @@ MxBool LegoAnimationManager::FUN_10064120(LegoLocation::Boundary* p_boundary, Mx
numEdges = boundary->GetNumEdges(); numEdges = boundary->GetNumEdges();
for (i = 0; i < numEdges; i++) { for (i = 0; i < numEdges; i++) {
LegoUnknown100db7f4* e = (LegoUnknown100db7f4*) boundary->GetEdges()[i]; LegoOrientedEdge* e = (LegoOrientedEdge*) boundary->GetEdges()[i];
if (local34 == e) { if (local34 == e) {
p_boundary->m_src = i; p_boundary->m_src = i;
@ -2585,10 +2585,10 @@ MxBool LegoAnimationManager::FUN_10064120(LegoLocation::Boundary* p_boundary, Mx
do { do {
if (p_bool1) { if (p_bool1) {
local34 = (LegoUnknown100db7f4*) local34->GetCounterclockwiseEdge(*boundary); local34 = (LegoOrientedEdge*) local34->GetCounterclockwiseEdge(*boundary);
} }
else { else {
local34 = (LegoUnknown100db7f4*) local34->GetClockwiseEdge(*boundary); local34 = (LegoOrientedEdge*) local34->GetClockwiseEdge(*boundary);
} }
} while (!local34->GetMask0x03() && local34 != local50); } while (!local34->GetMask0x03() && local34 != local50);

View File

@ -79,7 +79,7 @@ void MxControlPresenter::EndAction()
MxBool MxControlPresenter::FUN_10044270(MxS32 p_x, MxS32 p_y, MxPresenter* p_presenter) MxBool MxControlPresenter::FUN_10044270(MxS32 p_x, MxS32 p_y, MxPresenter* p_presenter)
{ {
assert(p_presenter); assert(p_presenter);
MxStillPresenter* presenter = dynamic_cast<MxStillPresenter*>(p_presenter); MxVideoPresenter* presenter = dynamic_cast<MxVideoPresenter*>(p_presenter);
if (!presenter) { if (!presenter) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Invalid presenter"); SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Invalid presenter");
return FALSE; return FALSE;

View File

@ -1,7 +1,7 @@
#include "legopathactor.h" #include "legopathactor.h"
#include "define.h" #include "define.h"
#include "geom/legounkown100db7f4.h" #include "geom/legoorientededge.h"
#include "legocachesoundmanager.h" #include "legocachesoundmanager.h"
#include "legocameracontroller.h" #include "legocameracontroller.h"
#include "legonamedplane.h" #include "legonamedplane.h"
@ -95,7 +95,7 @@ MxResult LegoPathActor::VTable0x88(
float p_time, float p_time,
LegoEdge& p_srcEdge, LegoEdge& p_srcEdge,
float p_srcScale, float p_srcScale,
LegoUnknown100db7f4& p_destEdge, LegoOrientedEdge& p_destEdge,
float p_destScale float p_destScale
) )
{ {
@ -122,7 +122,7 @@ MxResult LegoPathActor::VTable0x88(
m_unk0x7c = 0; m_unk0x7c = 0;
m_lastTime = p_time; m_lastTime = p_time;
m_actorTime = p_time; m_actorTime = p_time;
p_destEdge.FUN_1002ddc0(*p_boundary, p3); p_destEdge.GetFaceNormal(*p_boundary, p3);
p4 = p2; p4 = p2;
p4 -= p1; p4 -= p1;
@ -172,7 +172,7 @@ MxResult LegoPathActor::VTable0x84(
float p_time, float p_time,
Vector3& p_p1, Vector3& p_p1,
Vector3& p_p4, Vector3& p_p4,
LegoUnknown100db7f4& p_destEdge, LegoOrientedEdge& p_destEdge,
float p_destScale float p_destScale
) )
{ {
@ -192,7 +192,7 @@ MxResult LegoPathActor::VTable0x84(
m_unk0x7c = 0; m_unk0x7c = 0;
m_lastTime = p_time; m_lastTime = p_time;
m_actorTime = p_time; m_actorTime = p_time;
p_destEdge.FUN_1002ddc0(*p_boundary, p3); p_destEdge.GetFaceNormal(*p_boundary, p3);
MxMatrix matrix; MxMatrix matrix;
Vector3 pos(matrix[3]); Vector3 pos(matrix[3]);
@ -442,7 +442,7 @@ void LegoPathActor::Animate(float p_time)
// FUNCTION: LEGO1 0x1002e8b0 // FUNCTION: LEGO1 0x1002e8b0
// FUNCTION: BETA10 0x100af2f7 // FUNCTION: BETA10 0x100af2f7
void LegoPathActor::SwitchBoundary(LegoPathBoundary*& p_boundary, LegoUnknown100db7f4*& p_edge, float& p_unk0xe4) void LegoPathActor::SwitchBoundary(LegoPathBoundary*& p_boundary, LegoOrientedEdge*& p_edge, float& p_unk0xe4)
{ {
assert(m_boundary); assert(m_boundary);
m_boundary->SwitchBoundary(this, p_boundary, p_edge, p_unk0xe4); m_boundary->SwitchBoundary(this, p_boundary, p_edge, p_unk0xe4);
@ -516,7 +516,7 @@ inline MxU32 LegoPathActor::FUN_1002edd0(
LegoS32 numEdges = p_boundary->GetNumEdges(); LegoS32 numEdges = p_boundary->GetNumEdges();
for (MxS32 i = 0; i < numEdges; i++) { for (MxS32 i = 0; i < numEdges; i++) {
LegoUnknown100db7f4* edge = p_boundary->GetEdges()[i]; LegoOrientedEdge* edge = p_boundary->GetEdges()[i];
LegoPathBoundary* boundary = (LegoPathBoundary*) edge->OtherFace(p_boundary); LegoPathBoundary* boundary = (LegoPathBoundary*) edge->OtherFace(p_boundary);
if (boundary != NULL) { if (boundary != NULL) {
@ -652,7 +652,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->GetFaceNormal(*m_boundary, local78);
local48.EqualsCross(*m_boundary->GetUnknown0x14(), local78); local48.EqualsCross(*m_boundary->GetUnknown0x14(), local78);
local48.Unitize(); local48.Unitize();
} }

View File

@ -1,7 +1,7 @@
#include "legopathboundary.h" #include "legopathboundary.h"
#include "decomp.h" #include "decomp.h"
#include "geom/legounkown100db7f4.h" #include "geom/legoorientededge.h"
#include "legolocomotionanimpresenter.h" #include "legolocomotionanimpresenter.h"
#include "legopathactor.h" #include "legopathactor.h"
#include "legopathstruct.h" #include "legopathstruct.h"
@ -88,11 +88,11 @@ void LegoPathBoundary::FUN_100575b0(Vector3& p_point1, Vector3& p_point2, LegoPa
void LegoPathBoundary::SwitchBoundary( void LegoPathBoundary::SwitchBoundary(
LegoPathActor* p_actor, LegoPathActor* p_actor,
LegoPathBoundary*& p_boundary, LegoPathBoundary*& p_boundary,
LegoUnknown100db7f4*& p_edge, LegoOrientedEdge*& p_edge,
float& p_unk0xe4 float& p_unk0xe4
) )
{ {
LegoUnknown100db7f4* e = p_edge; LegoOrientedEdge* e = p_edge;
if (p_edge->BETA_100b53b0(*p_boundary)) { if (p_edge->BETA_100b53b0(*p_boundary)) {
LegoPathBoundary* newBoundary = (LegoPathBoundary*) p_edge->OtherFace(p_boundary); LegoPathBoundary* newBoundary = (LegoPathBoundary*) p_edge->OtherFace(p_boundary);
@ -112,7 +112,7 @@ void LegoPathBoundary::SwitchBoundary(
} }
do { do {
p_edge = (LegoUnknown100db7f4*) p_edge->GetCounterclockwiseEdge(*newBoundary); p_edge = (LegoOrientedEdge*) p_edge->GetCounterclockwiseEdge(*newBoundary);
LegoPathBoundary* local20 = (LegoPathBoundary*) p_edge->OtherFace(newBoundary); LegoPathBoundary* local20 = (LegoPathBoundary*) p_edge->OtherFace(newBoundary);
if (p_edge->GetMask0x03() && (userNavFlag || p_edge->BETA_1004a830(*local20, 1))) { if (p_edge->GetMask0x03() && (userNavFlag || p_edge->BETA_1004a830(*local20, 1))) {
@ -135,10 +135,10 @@ void LegoPathBoundary::SwitchBoundary(
while (local8 > 0) { while (local8 > 0) {
if (localc) { if (localc) {
p_edge = (LegoUnknown100db7f4*) p_edge->GetCounterclockwiseEdge(*newBoundary); p_edge = (LegoOrientedEdge*) p_edge->GetCounterclockwiseEdge(*newBoundary);
} }
else { else {
p_edge = (LegoUnknown100db7f4*) p_edge->GetClockwiseEdge(*newBoundary); p_edge = (LegoOrientedEdge*) p_edge->GetClockwiseEdge(*newBoundary);
} }
LegoPathBoundary* local20 = (LegoPathBoundary*) p_edge->OtherFace(newBoundary); LegoPathBoundary* local20 = (LegoPathBoundary*) p_edge->OtherFace(newBoundary);
@ -149,8 +149,8 @@ void LegoPathBoundary::SwitchBoundary(
} }
if (p_edge == e) { if (p_edge == e) {
p_edge = (LegoUnknown100db7f4*) p_edge->GetCounterclockwiseEdge(*newBoundary); p_edge = (LegoOrientedEdge*) p_edge->GetCounterclockwiseEdge(*newBoundary);
p_edge = (LegoUnknown100db7f4*) p_edge->GetCounterclockwiseEdge(*newBoundary); p_edge = (LegoOrientedEdge*) p_edge->GetCounterclockwiseEdge(*newBoundary);
} }
if (p_boundary != newBoundary) { if (p_boundary != newBoundary) {
@ -164,7 +164,7 @@ void LegoPathBoundary::SwitchBoundary(
} }
else { else {
do { do {
p_edge = (LegoUnknown100db7f4*) p_edge->GetCounterclockwiseEdge(*p_boundary); p_edge = (LegoOrientedEdge*) p_edge->GetCounterclockwiseEdge(*p_boundary);
if (p_edge->GetMask0x03()) { if (p_edge->GetMask0x03()) {
break; break;
@ -172,8 +172,8 @@ void LegoPathBoundary::SwitchBoundary(
} while (p_edge != e); } while (p_edge != e);
if (p_edge == e) { if (p_edge == e) {
p_edge = (LegoUnknown100db7f4*) p_edge->GetCounterclockwiseEdge(*p_boundary); p_edge = (LegoOrientedEdge*) p_edge->GetCounterclockwiseEdge(*p_boundary);
p_edge = (LegoUnknown100db7f4*) p_edge->GetCounterclockwiseEdge(*p_boundary); p_edge = (LegoOrientedEdge*) p_edge->GetCounterclockwiseEdge(*p_boundary);
} }
p_unk0xe4 = 1.0 - p_unk0xe4; p_unk0xe4 = 1.0 - p_unk0xe4;
@ -187,17 +187,17 @@ MxU32 LegoPathBoundary::Intersect(
Vector3& p_point1, Vector3& p_point1,
Vector3& p_point2, Vector3& p_point2,
Vector3& p_point3, Vector3& p_point3,
LegoUnknown100db7f4*& p_edge LegoOrientedEdge*& p_edge
) )
{ {
LegoUnknown100db7f4* e = NULL; LegoOrientedEdge* e = NULL;
float localc; float localc;
MxU32 local10 = 0; MxU32 local10 = 0;
float len = 0.0f; float len = 0.0f;
Mx3DPointFloat vec; Mx3DPointFloat vec;
for (MxS32 i = 0; i < m_numEdges; i++) { for (MxS32 i = 0; i < m_numEdges; i++) {
LegoUnknown100db7f4* edge = (LegoUnknown100db7f4*) m_edges[i]; LegoOrientedEdge* edge = (LegoOrientedEdge*) 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) {
@ -242,17 +242,17 @@ MxU32 LegoPathBoundary::Intersect(
local50 = p_point2; local50 = p_point2;
local50 -= *local5c; local50 -= *local5c;
e->FUN_1002ddc0(*this, local70); e->GetFaceNormal(*this, local70);
float local58 = local50.Dot(local50, local70); float local58 = local50.Dot(local50, local70);
LegoUnknown100db7f4* local54 = NULL; LegoOrientedEdge* local54 = NULL;
if (local58 < 0.0f) { if (local58 < 0.0f) {
Mx3DPointFloat local84; Mx3DPointFloat local84;
for (LegoUnknown100db7f4* local88 = (LegoUnknown100db7f4*) e->GetClockwiseEdge(*this); e != local88; for (LegoOrientedEdge* local88 = (LegoOrientedEdge*) e->GetClockwiseEdge(*this); e != local88;
local88 = (LegoUnknown100db7f4*) local88->GetClockwiseEdge(*this)) { local88 = (LegoOrientedEdge*) local88->GetClockwiseEdge(*this)) {
local88->FUN_1002ddc0(*this, local84); local88->GetFaceNormal(*this, local84);
if (local84.Dot(local84, local70) <= 0.9) { if (local84.Dot(local84, local70) <= 0.9) {
break; break;
@ -264,7 +264,7 @@ MxU32 LegoPathBoundary::Intersect(
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_length) {
local54 = local88; local54 = local88;
local58 = local8c; local58 = local8c;
local70 = local84; local70 = local84;
@ -273,13 +273,12 @@ MxU32 LegoPathBoundary::Intersect(
} }
} }
else { else {
if (e->m_unk0x3c < local58) { if (e->m_length < local58) {
Mx3DPointFloat localbc; Mx3DPointFloat localbc;
for (LegoUnknown100db7f4* locala8 = (LegoUnknown100db7f4*) e->GetCounterclockwiseEdge(*this); for (LegoOrientedEdge* locala8 = (LegoOrientedEdge*) e->GetCounterclockwiseEdge(*this); e != locala8;
e != locala8; locala8 = (LegoOrientedEdge*) locala8->GetCounterclockwiseEdge(*this)) {
locala8 = (LegoUnknown100db7f4*) locala8->GetCounterclockwiseEdge(*this)) { locala8->GetFaceNormal(*this, localbc);
locala8->FUN_1002ddc0(*this, localbc);
if (localbc.Dot(localbc, local70) <= 0.9) { if (localbc.Dot(localbc, local70) <= 0.9) {
break; break;
@ -307,7 +306,7 @@ MxU32 LegoPathBoundary::Intersect(
if (local58 <= 0.0f) { if (local58 <= 0.0f) {
if (!e->GetMask0x03()) { if (!e->GetMask0x03()) {
p_edge = (LegoUnknown100db7f4*) e->GetClockwiseEdge(*this); p_edge = (LegoOrientedEdge*) e->GetClockwiseEdge(*this);
} }
else { else {
p_edge = e; p_edge = e;
@ -316,7 +315,7 @@ MxU32 LegoPathBoundary::Intersect(
p_point3 = *local5c; p_point3 = *local5c;
return 2; return 2;
} }
else if (local58 > 0.0f && e->m_unk0x3c > local58) { else if (local58 > 0.0f && e->m_length > local58) {
p_point3 = local70; p_point3 = local70;
p_point3 *= local58; p_point3 *= local58;
p_point3 += *local5c; p_point3 += *local5c;
@ -327,7 +326,7 @@ MxU32 LegoPathBoundary::Intersect(
p_point3 = *e->CCWVertex(*this); p_point3 = *e->CCWVertex(*this);
if (!e->GetMask0x03()) { if (!e->GetMask0x03()) {
p_edge = (LegoUnknown100db7f4*) e->GetCounterclockwiseEdge(*this); p_edge = (LegoOrientedEdge*) e->GetCounterclockwiseEdge(*this);
} }
else { else {
p_edge = e; p_edge = e;

View File

@ -231,7 +231,7 @@ MxResult LegoPathController::PlaceActor(
float time = Timer()->GetTime(); float time = Timer()->GetTime();
MxResult result = MxResult result =
p_actor->VTable0x88(pBoundary, time, *pSrcE, p_srcScale, (LegoUnknown100db7f4&) *pDestE, p_destScale); p_actor->VTable0x88(pBoundary, time, *pSrcE, p_srcScale, (LegoOrientedEdge&) *pDestE, p_destScale);
if (result != SUCCESS) { if (result != SUCCESS) {
assert(0); assert(0);
@ -291,15 +291,14 @@ MxResult LegoPathController::PlaceActor(
} }
for (MxS32 j = 0; j < boundary->GetNumEdges(); j++) { for (MxS32 j = 0; j < boundary->GetNumEdges(); j++) {
LegoUnknown100db7f4* edge = (LegoUnknown100db7f4*) boundary->GetEdges()[j]; LegoOrientedEdge* edge = (LegoOrientedEdge*) boundary->GetEdges()[j];
if (edge->GetMask0x03()) { if (edge->GetMask0x03()) {
Mx3DPointFloat vec; Mx3DPointFloat vec;
if (((LegoUnknown100db7f4*) edge->GetClockwiseEdge(*boundary))->FUN_1002ddc0(*boundary, vec) == SUCCESS && if (((LegoOrientedEdge*) edge->GetClockwiseEdge(*boundary))->GetFaceNormal(*boundary, vec) == SUCCESS &&
vec.Dot(vec, p_direction) < 0.0f) { vec.Dot(vec, p_direction) < 0.0f) {
edge = edge = (LegoOrientedEdge*) edge->GetCounterclockwiseEdge(*boundary)->GetCounterclockwiseEdge(*boundary);
(LegoUnknown100db7f4*) edge->GetCounterclockwiseEdge(*boundary)->GetCounterclockwiseEdge(*boundary);
} }
if (!edge->GetMask0x03()) { if (!edge->GetMask0x03()) {
@ -574,7 +573,7 @@ MxResult LegoPathController::ReadEdges(LegoStorage* p_storage)
} }
edge.m_pointB = &m_unk0x10[s]; edge.m_pointB = &m_unk0x10[s];
if (edge.m_flags & LegoUnknown100db7f4::c_bit3) { if (edge.m_flags & LegoOrientedEdge::c_hasFaceA) {
if (p_storage->Read(&s, sizeof(MxU16)) != SUCCESS) { if (p_storage->Read(&s, sizeof(MxU16)) != SUCCESS) {
return FAILURE; return FAILURE;
} }
@ -591,7 +590,7 @@ MxResult LegoPathController::ReadEdges(LegoStorage* p_storage)
edge.m_cwA = &m_edges[s]; edge.m_cwA = &m_edges[s];
} }
if (edge.m_flags & LegoUnknown100db7f4::c_bit4) { if (edge.m_flags & LegoOrientedEdge::c_hasFaceB) {
if (p_storage->Read(&s, sizeof(MxU16)) != SUCCESS) { if (p_storage->Read(&s, sizeof(MxU16)) != SUCCESS) {
return FAILURE; return FAILURE;
} }
@ -608,11 +607,11 @@ MxResult LegoPathController::ReadEdges(LegoStorage* p_storage)
edge.m_cwB = &m_edges[s]; edge.m_cwB = &m_edges[s];
} }
if (ReadVector(p_storage, edge.m_unk0x28) != SUCCESS) { if (ReadVector(p_storage, edge.m_dir) != SUCCESS) {
return FAILURE; return FAILURE;
} }
if (p_storage->Read(&edge.m_unk0x3c, sizeof(float)) != SUCCESS) { if (p_storage->Read(&edge.m_length, sizeof(float)) != SUCCESS) {
return FAILURE; return FAILURE;
} }
} }
@ -636,7 +635,7 @@ MxResult LegoPathController::ReadBoundaries(LegoStorage* p_storage)
boundary.m_edgeNormals = new Mx4DPointFloat[numE]; boundary.m_edgeNormals = new Mx4DPointFloat[numE];
LegoUnknown100db7f4** edges = new LegoUnknown100db7f4*[numE]; LegoOrientedEdge** edges = new LegoOrientedEdge*[numE];
boundary.SetEdges(edges, numE); boundary.SetEdges(edges, numE);
for (j = 0; j < numE; j++) { for (j = 0; j < numE; j++) {
@ -825,7 +824,7 @@ MxResult LegoPathController::FUN_10048310(
while (boundarySetItA != boundarySet.end()) { while (boundarySetItA != boundarySet.end()) {
MxU32 shouldRemove = TRUE; MxU32 shouldRemove = TRUE;
LegoUnknown100db7f4* e = (*boundarySetItA)->m_edge; LegoOrientedEdge* e = (*boundarySetItA)->m_edge;
LegoPathBoundary* b = (*boundarySetItA)->m_boundary; LegoPathBoundary* b = (*boundarySetItA)->m_boundary;
assert(e && b); assert(e && b);
@ -942,7 +941,7 @@ MxS32 LegoPathController::FUN_1004a240(
Vector3& p_v1, Vector3& p_v1,
Vector3& p_v2, Vector3& p_v2,
float p_f1, float p_f1,
LegoUnknown100db7f4*& p_edge, LegoOrientedEdge*& p_edge,
LegoPathBoundary*& p_boundary LegoPathBoundary*& p_boundary
) )
{ {
@ -963,7 +962,7 @@ MxS32 LegoPathController::FUN_1004a240(
p_v1 -= *p_edge->CWVertex(*p_boundary); p_v1 -= *p_edge->CWVertex(*p_boundary);
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->GetFaceNormal(*p_boundary, vec);
p_v2.EqualsCross(*p_boundary->GetUnknown0x14(), vec); p_v2.EqualsCross(*p_boundary->GetUnknown0x14(), vec);
return 0; return 0;
} }

View File

@ -319,12 +319,12 @@ void LegoRaceCar::FUN_10012ff0(float p_param)
if (a->GetDuration() <= deltaTime || deltaTime < 0.0) { if (a->GetDuration() <= deltaTime || deltaTime < 0.0) {
if (m_userState == LEGORACECAR_KICK1) { if (m_userState == LEGORACECAR_KICK1) {
LegoUnknown100db7f4** edges = m_kick1B->GetEdges(); LegoOrientedEdge** edges = m_kick1B->GetEdges();
m_destEdge = edges[2]; m_destEdge = edges[2];
m_boundary = m_kick1B; m_boundary = m_kick1B;
} }
else { else {
LegoUnknown100db7f4** edges = m_kick1B->GetEdges(); LegoOrientedEdge** edges = m_kick1B->GetEdges();
m_destEdge = edges[1]; m_destEdge = edges[1];
m_boundary = m_kick2B; m_boundary = m_kick2B;
} }

View File

@ -1,6 +1,6 @@
#include "legoracespecial.h" #include "legoracespecial.h"
#include "geom/legounkown100db7f4.h" #include "geom/legoorientededge.h"
#include "legonavcontroller.h" #include "legonavcontroller.h"
#include "legopathboundary.h" #include "legopathboundary.h"
#include "legopathcontroller.h" #include "legopathcontroller.h"
@ -66,7 +66,7 @@ void LegoCarRaceActor::FUN_10080590(float p_time)
Mx3DPointFloat destEdgeUnknownVector; Mx3DPointFloat destEdgeUnknownVector;
Mx3DPointFloat worldDirection = Mx3DPointFloat(m_roi->GetWorldDirection()); Mx3DPointFloat worldDirection = Mx3DPointFloat(m_roi->GetWorldDirection());
m_destEdge->FUN_1002ddc0(*m_boundary, destEdgeUnknownVector); m_destEdge->GetFaceNormal(*m_boundary, destEdgeUnknownVector);
if (abs(destEdgeUnknownVector.Dot(destEdgeUnknownVector.GetData(), worldDirection.GetData())) > 0.5) { if (abs(destEdgeUnknownVector.Dot(destEdgeUnknownVector.GetData(), worldDirection.GetData())) > 0.5) {
maxSpeed *= m_unk0x10; maxSpeed *= m_unk0x10;
@ -170,7 +170,7 @@ MxS32 LegoCarRaceActor::VTable0x1c(LegoPathBoundary* p_boundary, LegoEdge* p_edg
LERP3(pointUnknown, *v1, *v2, m_unk0xe4); LERP3(pointUnknown, *v1, *v2, m_unk0xe4);
m_destEdge->FUN_1002ddc0(*m_boundary, destEdgeUnknownVector); m_destEdge->GetFaceNormal(*m_boundary, destEdgeUnknownVector);
crossProduct.EqualsCross(*m_boundary->GetUnknown0x14(), destEdgeUnknownVector); crossProduct.EqualsCross(*m_boundary->GetUnknown0x14(), destEdgeUnknownVector);
crossProduct.Unitize(); crossProduct.Unitize();
@ -213,7 +213,7 @@ MxS32 LegoCarRaceActor::VTable0x1c(LegoPathBoundary* p_boundary, LegoEdge* p_edg
// FUNCTION: LEGO1 0x10080b40 // FUNCTION: LEGO1 0x10080b40
// FUNCTION: BETA10 0x100cdb3c // FUNCTION: BETA10 0x100cdb3c
void LegoCarRaceActor::SwitchBoundary(LegoPathBoundary*& p_boundary, LegoUnknown100db7f4*& p_edge, float& p_unk0xe4) void LegoCarRaceActor::SwitchBoundary(LegoPathBoundary*& p_boundary, LegoOrientedEdge*& p_edge, float& p_unk0xe4)
{ {
LegoPathActor::SwitchBoundary(m_boundary, m_destEdge, m_unk0xe4); LegoPathActor::SwitchBoundary(m_boundary, m_destEdge, m_unk0xe4);
} }
@ -242,7 +242,7 @@ void LegoCarRaceActor::Animate(float p_time)
// FUNCTION: BETA10 0x100cdc54 // FUNCTION: BETA10 0x100cdc54
MxResult LegoCarRaceActor::VTable0x9c() MxResult LegoCarRaceActor::VTable0x9c()
{ {
LegoUnknown100db7f4* d = m_destEdge; LegoOrientedEdge* d = m_destEdge;
if (VTable0x1c(m_boundary, m_destEdge)) { if (VTable0x1c(m_boundary, m_destEdge)) {
LegoPathBoundary* b = m_boundary; LegoPathBoundary* b = m_boundary;
@ -263,8 +263,8 @@ MxResult LegoCarRaceActor::VTable0x9c()
Mx3DPointFloat point4; Mx3DPointFloat point4;
Mx3DPointFloat point5; Mx3DPointFloat point5;
d->FUN_1002ddc0(*b, point2); d->GetFaceNormal(*b, point2);
m_destEdge->FUN_1002ddc0(*m_boundary, point3); m_destEdge->GetFaceNormal(*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);
@ -365,7 +365,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->GetFaceNormal(*m_boundary, bbb);
c.EqualsCross(bbb, *m_boundary->GetUnknown0x14()); c.EqualsCross(bbb, *m_boundary->GetUnknown0x14());
c.Unitize(); c.Unitize();

View File

@ -17,7 +17,7 @@ struct LegoEdge {
Vector3* CWVertex(LegoWEEdge& p_face); Vector3* CWVertex(LegoWEEdge& p_face);
Vector3* CCWVertex(LegoWEEdge& p_face); Vector3* CCWVertex(LegoWEEdge& p_face);
LegoResult FUN_1002ddc0(LegoWEEdge& p_face, Vector3& p_point); LegoResult GetFaceNormal(LegoWEEdge& p_face, Vector3& p_point);
// FUNCTION: BETA10 0x10184170 // FUNCTION: BETA10 0x10184170
LegoWEEdge* GetFaceA() { return m_faceA; } LegoWEEdge* GetFaceA() { return m_faceA; }

View File

@ -0,0 +1,12 @@
#include "legoorientededge.h"
DECOMP_SIZE_ASSERT(LegoOrientedEdge, 0x40)
// FUNCTION: LEGO1 0x1009a630
// FUNCTION: BETA10 0x10183050
LegoOrientedEdge::LegoOrientedEdge()
{
m_flags = 0;
m_dir.Clear();
m_length = 0.0f;
}

View File

@ -1,5 +1,5 @@
#ifndef __LEGOUNKNOWN100DB7F4_H #ifndef __LEGOORIENTEDEDGE_H
#define __LEGOUNKNOWN100DB7F4_H #define __LEGOORIENTEDEDGE_H
#include "legoedge.h" #include "legoedge.h"
#include "legowegedge.h" #include "legowegedge.h"
@ -9,31 +9,31 @@
// VTABLE: LEGO1 0x100db7f4 // VTABLE: LEGO1 0x100db7f4
// SIZE 0x40 // SIZE 0x40
struct LegoUnknown100db7f4 : public LegoEdge { struct LegoOrientedEdge : public LegoEdge {
public: public:
enum { enum {
c_bit1 = 0x01, c_bit1 = 0x01,
c_bit2 = 0x02, c_bit2 = 0x02,
c_bit3 = 0x04, c_hasFaceA = 0x04,
c_bit4 = 0x08 c_hasFaceB = 0x08
}; };
LegoUnknown100db7f4(); LegoOrientedEdge();
// FUNCTION: LEGO1 0x1002ddc0 // FUNCTION: LEGO1 0x1002ddc0
// FUNCTION: BETA10 0x100372a0 // FUNCTION: BETA10 0x100372a0
LegoResult FUN_1002ddc0(LegoWEEdge& p_f, Vector3& p_point) const LegoResult GetFaceNormal(LegoWEEdge& p_face, Vector3& p_point) const
{ {
if (p_f.IsEqual(m_faceA)) { if (p_face.IsEqual(m_faceA)) {
p_point[0] = -m_unk0x28[0]; p_point[0] = -m_dir[0];
p_point[1] = -m_unk0x28[1]; p_point[1] = -m_dir[1];
p_point[2] = -m_unk0x28[2]; p_point[2] = -m_dir[2];
} }
else { else {
// clang-format off // clang-format off
assert(p_f.IsEqual( m_faceB )); assert(p_face.IsEqual( m_faceB ));
// clang-format on // clang-format on
p_point = m_unk0x28; p_point = m_dir;
} }
return SUCCESS; return SUCCESS;
@ -78,7 +78,7 @@ struct LegoUnknown100db7f4 : public LegoEdge {
} }
// FUNCTION: BETA10 0x100bd540 // FUNCTION: BETA10 0x100bd540
LegoFloat DistanceBetweenMidpoints(const LegoUnknown100db7f4& p_other) LegoFloat DistanceBetweenMidpoints(const LegoOrientedEdge& p_other)
{ {
Mx3DPointFloat point1(*m_pointA); Mx3DPointFloat point1(*m_pointA);
Mx3DPointFloat point2(*p_other.m_pointA); Mx3DPointFloat point2(*p_other.m_pointA);
@ -99,22 +99,22 @@ struct LegoUnknown100db7f4 : public LegoEdge {
inline LegoU32 FUN_10048c40(const Vector3& p_position); inline LegoU32 FUN_10048c40(const Vector3& p_position);
// SYNTHETIC: LEGO1 0x1009a6c0 // SYNTHETIC: LEGO1 0x1009a6c0
// LegoUnknown100db7f4::`scalar deleting destructor' // LegoOrientedEdge::`scalar deleting destructor'
LegoU16 m_flags; // 0x24 LegoU16 m_flags; // 0x24
Mx3DPointFloat m_unk0x28; // 0x28 Mx3DPointFloat m_dir; // 0x28
float m_unk0x3c; // 0x3c float m_length; // 0x3c
}; };
// FUNCTION: LEGO1 0x10048c40 // FUNCTION: LEGO1 0x10048c40
// FUNCTION: BETA10 0x1001cc90 // FUNCTION: BETA10 0x1001cc90
inline LegoU32 LegoUnknown100db7f4::FUN_10048c40(const Vector3& p_position) inline LegoU32 LegoOrientedEdge::FUN_10048c40(const Vector3& p_position)
{ {
LegoFloat localc, local10; LegoFloat localc, local10;
LegoU32 result = FALSE; LegoU32 result = FALSE;
if (m_unk0x28[0] > 0.001 || m_unk0x28[0] < -0.001) { if (m_dir[0] > 0.001 || m_dir[0] < -0.001) {
localc = (p_position[0] - (*m_pointA)[0]) / m_unk0x28[0]; localc = (p_position[0] - (*m_pointA)[0]) / m_dir[0];
if (localc < 0 || localc > 1) { if (localc < 0 || localc > 1) {
return FALSE; return FALSE;
@ -128,8 +128,8 @@ inline LegoU32 LegoUnknown100db7f4::FUN_10048c40(const Vector3& p_position)
} }
} }
if (m_unk0x28[1] > 0.001 || m_unk0x28[1] < -0.001) { if (m_dir[1] > 0.001 || m_dir[1] < -0.001) {
local10 = (p_position[1] - (*m_pointA)[1]) / m_unk0x28[1]; local10 = (p_position[1] - (*m_pointA)[1]) / m_dir[1];
if (result) { if (result) {
if (localc > local10 + 0.001 || localc < local10 - 0.001) { if (localc > local10 + 0.001 || localc < local10 - 0.001) {
@ -147,8 +147,8 @@ inline LegoU32 LegoUnknown100db7f4::FUN_10048c40(const Vector3& p_position)
} }
} }
if (m_unk0x28[2] > 0.001 || m_unk0x28[2] < -0.001) { if (m_dir[2] > 0.001 || m_dir[2] < -0.001) {
local10 = (p_position[2] - (*m_pointA)[2]) / m_unk0x28[2]; local10 = (p_position[2] - (*m_pointA)[2]) / m_dir[2];
if (result) { if (result) {
if (localc > local10 + 0.001 || localc < local10 - 0.001) { if (localc > local10 + 0.001 || localc < local10 - 0.001) {
@ -168,4 +168,4 @@ inline LegoU32 LegoUnknown100db7f4::FUN_10048c40(const Vector3& p_position)
return TRUE; return TRUE;
} }
#endif // __LEGOUNKNOWN100DB7F4_H #endif // __LEGOORIENTEDEDGE_H

View File

@ -1,12 +0,0 @@
#include "legounkown100db7f4.h"
DECOMP_SIZE_ASSERT(LegoUnknown100db7f4, 0x40)
// FUNCTION: LEGO1 0x1009a630
// FUNCTION: BETA10 0x10183050
LegoUnknown100db7f4::LegoUnknown100db7f4()
{
m_flags = 0;
m_unk0x28.Clear();
m_unk0x3c = 0.0f;
}

View File

@ -1,6 +1,6 @@
#include "legoweedge.h" #include "legoweedge.h"
#include "legounkown100db7f4.h" #include "legoorientededge.h"
DECOMP_SIZE_ASSERT(LegoWEEdge, 0x0c) DECOMP_SIZE_ASSERT(LegoWEEdge, 0x0c)
@ -23,8 +23,8 @@ LegoWEEdge::~LegoWEEdge()
LegoS32 LegoWEEdge::VTable0x04() LegoS32 LegoWEEdge::VTable0x04()
{ {
for (LegoS32 i = 0; i < m_numEdges; i++) { for (LegoS32 i = 0; i < m_numEdges; i++) {
LegoUnknown100db7f4* e1 = m_edges[i]; LegoOrientedEdge* e1 = m_edges[i];
LegoUnknown100db7f4* e2 = (m_numEdges - i) == 1 ? m_edges[0] : m_edges[i + 1]; LegoOrientedEdge* e2 = (m_numEdges - i) == 1 ? m_edges[0] : m_edges[i + 1];
if (e2->m_pointA == e1->m_pointA) { if (e2->m_pointA == e1->m_pointA) {
e1->m_faceA = this; e1->m_faceA = this;

View File

@ -4,7 +4,7 @@
#include "decomp.h" #include "decomp.h"
#include "misc/legotypes.h" #include "misc/legotypes.h"
struct LegoUnknown100db7f4; struct LegoOrientedEdge;
// might be a struct with public members // might be a struct with public members
// VTABLE: LEGO1 0x100db7c0 // VTABLE: LEGO1 0x100db7c0
@ -20,12 +20,12 @@ class LegoWEEdge {
LegoU8 GetNumEdges() { return m_numEdges; } LegoU8 GetNumEdges() { return m_numEdges; }
// FUNCTION: BETA10 0x1001cc30 // FUNCTION: BETA10 0x1001cc30
LegoUnknown100db7f4** GetEdges() { return m_edges; } LegoOrientedEdge** GetEdges() { return m_edges; }
// FUNCTION: BETA10 0x100373f0 // FUNCTION: BETA10 0x100373f0
LegoU32 IsEqual(LegoWEEdge* p_other) { return this == p_other; } LegoU32 IsEqual(LegoWEEdge* p_other) { return this == p_other; }
void SetEdges(LegoUnknown100db7f4** p_edges, LegoU8 p_numEdges) void SetEdges(LegoOrientedEdge** p_edges, LegoU8 p_numEdges)
{ {
m_edges = p_edges; m_edges = p_edges;
m_numEdges = p_numEdges; m_numEdges = p_numEdges;
@ -35,8 +35,8 @@ class LegoWEEdge {
// LegoWEEdge::`scalar deleting destructor' // LegoWEEdge::`scalar deleting destructor'
protected: protected:
LegoU8 m_numEdges; // 0x04 LegoU8 m_numEdges; // 0x04
LegoUnknown100db7f4** m_edges; // 0x08 LegoOrientedEdge** m_edges; // 0x08
}; };
#endif // __LEGOWEEDGE_H #endif // __LEGOWEEDGE_H

View File

@ -1,6 +1,6 @@
#include "legowegedge.h" #include "legowegedge.h"
#include "legounkown100db7f4.h" #include "legoorientededge.h"
#include <assert.h> #include <assert.h>
@ -81,7 +81,7 @@ LegoS32 LegoWEGEdge::VTable0x04()
m_edgeNormals = new Mx4DPointFloat[m_numEdges]; m_edgeNormals = new Mx4DPointFloat[m_numEdges];
assert(m_edgeNormals); assert(m_edgeNormals);
LegoUnknown100db7f4* edge; LegoOrientedEdge* edge;
LegoS32 i; LegoS32 i;
for (i = 0; i < m_numEdges; i++) { for (i = 0; i < m_numEdges; i++) {
@ -118,27 +118,27 @@ LegoS32 LegoWEGEdge::VTable0x04()
for (i = 0; i < m_numEdges; i++) { for (i = 0; i < m_numEdges; i++) {
edge = m_edges[i]; edge = m_edges[i];
Vector3& local5c = edge->m_unk0x28; Vector3& local5c = edge->m_dir;
if (edge->m_unk0x3c == 0) { if (edge->m_length == 0) {
local5c = *m_edges[i]->m_pointB; local5c = *m_edges[i]->m_pointB;
local5c -= *m_edges[i]->m_pointA; local5c -= *m_edges[i]->m_pointA;
edge->m_unk0x3c = local5c.LenSquared(); edge->m_length = local5c.LenSquared();
if (edge->m_unk0x3c <= 0.0f) { if (edge->m_length <= 0.0f) {
assert(0); assert(0);
if (result == 0) { if (result == 0) {
result = -1; result = -1;
} }
} }
edge->m_unk0x3c = sqrt((double) edge->m_unk0x3c); edge->m_length = sqrt((double) edge->m_length);
local5c /= edge->m_unk0x3c; local5c /= edge->m_length;
} }
Mx3DPointFloat local58; Mx3DPointFloat local58;
Vector3 local64(&m_edgeNormals[i][0]); Vector3 local64(&m_edgeNormals[i][0]);
edge->FUN_1002ddc0(*this, local58); edge->GetFaceNormal(*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);
@ -147,7 +147,7 @@ LegoS32 LegoWEGEdge::VTable0x04()
} }
if (edge->GetFaceA() != NULL && edge->GetFaceB() != NULL) { if (edge->GetFaceA() != NULL && edge->GetFaceB() != NULL) {
edge->SetFlags(LegoUnknown100db7f4::c_bit1 | LegoUnknown100db7f4::c_bit2); edge->SetFlags(LegoOrientedEdge::c_bit1 | LegoOrientedEdge::c_bit2);
} }
} }

View File

@ -161,7 +161,7 @@
#include "lego/sources/3dmanager/tglsurface.h" #include "lego/sources/3dmanager/tglsurface.h"
#include "lego/sources/anim/legoanim.h" #include "lego/sources/anim/legoanim.h"
#include "lego/sources/geom/legoedge.h" #include "lego/sources/geom/legoedge.h"
#include "lego/sources/geom/legounkown100db7f4.h" #include "lego/sources/geom/legoorientededge.h"
#include "lego/sources/geom/legoweedge.h" #include "lego/sources/geom/legoweedge.h"
#include "lego/sources/geom/legowegedge.h" #include "lego/sources/geom/legowegedge.h"
#include "lego/sources/misc/legocontainer.h" #include "lego/sources/misc/legocontainer.h"

View File

@ -172,12 +172,12 @@ struct MxDriver {
// TEMPLATE: CONFIG 0x401b00 // TEMPLATE: CONFIG 0x401b00
// TEMPLATE: LEGO1 0x1009c400 // TEMPLATE: LEGO1 0x1009c400
// TEMPLATE: BETA10 0x1011fad0 // TEMPLATE: BETA10 0x1011fad0
// list<Direct3DDeviceInfo,allocator<Direct3DDeviceInfo> >::insert // ?insert@?$list@UDirect3DDeviceInfo@@V?$allocator@UDirect3DDeviceInfo@@@@@@QAE?AViterator@1@V21@ABUDirect3DDeviceInfo@@@Z
// TEMPLATE: CONFIG 0x401b60 // TEMPLATE: CONFIG 0x401b60
// TEMPLATE: LEGO1 0x1009c460 // TEMPLATE: LEGO1 0x1009c460
// TEMPLATE: BETA10 0x1011f9a0 // TEMPLATE: BETA10 0x1011f9a0
// list<MxDisplayMode,allocator<MxDisplayMode> >::insert // ?insert@?$list@UMxDisplayMode@@V?$allocator@UMxDisplayMode@@@@@@QAE?AViterator@1@V21@ABUMxDisplayMode@@@Z
// SYNTHETIC: CONFIG 0x402be0 // SYNTHETIC: CONFIG 0x402be0
// SYNTHETIC: LEGO1 0x1009d450 // SYNTHETIC: LEGO1 0x1009d450
@ -252,34 +252,38 @@ class MxDeviceEnumerate {
// list<Direct3DDeviceInfo,allocator<Direct3DDeviceInfo> >::iterator::operator* // list<Direct3DDeviceInfo,allocator<Direct3DDeviceInfo> >::iterator::operator*
// TEMPLATE: BETA10 0x1011c200 // TEMPLATE: BETA10 0x1011c200
// list<Direct3DDeviceInfo,allocator<Direct3DDeviceInfo> >::iterator::operator++ // ??Eiterator@?$list@UDirect3DDeviceInfo@@V?$allocator@UDirect3DDeviceInfo@@@@@@QAE?AV01@H@Z
// TEMPLATE: BETA10 0x1011c290 // TEMPLATE: BETA10 0x1011c290
// list<Direct3DDeviceInfo,allocator<Direct3DDeviceInfo> >::begin // ?begin@?$list@UDirect3DDeviceInfo@@V?$allocator@UDirect3DDeviceInfo@@@@@@QAE?AViterator@1@XZ
// Note: could also be
// ?begin@?$list@UDirect3DDeviceInfo@@V?$allocator@UDirect3DDeviceInfo@@@@@@QBE?AVconst_iterator@1@XZ
// TEMPLATE: BETA10 0x1011c300 // TEMPLATE: BETA10 0x1011c300
// list<Direct3DDeviceInfo,allocator<Direct3DDeviceInfo> >::end // ?end@?$list@UDirect3DDeviceInfo@@V?$allocator@UDirect3DDeviceInfo@@@@@@QAE?AViterator@1@XZ
// Note: could also be
// ?end@?$list@UDirect3DDeviceInfo@@V?$allocator@UDirect3DDeviceInfo@@@@@@QBE?AVconst_iterator@1@XZ
// TEMPLATE: BETA10 0x1011c4d0 // TEMPLATE: BETA10 0x1011c4d0
// list<MxDriver,allocator<MxDriver> >::iterator::operator* // list<MxDriver,allocator<MxDriver> >::iterator::operator*
// TEMPLATE: BETA10 0x1011c520 // TEMPLATE: BETA10 0x1011c520
// list<MxDriver,allocator<MxDriver> >::iterator::operator++ // ??Eiterator@?$list@UMxDriver@@V?$allocator@UMxDriver@@@@@@QAE?AV01@H@Z
// TEMPLATE: BETA10 0x1011c560 // TEMPLATE: BETA10 0x1011c560
// list<MxDriver,allocator<MxDriver> >::iterator::operator++ // ??Eiterator@?$list@UMxDriver@@V?$allocator@UMxDriver@@@@@@QAEAAV01@XZ
// TEMPLATE: BETA10 0x1011c590 // TEMPLATE: BETA10 0x1011c590
// list<MxDriver,allocator<MxDriver> >::_Acc::_Next // list<MxDriver,allocator<MxDriver> >::_Acc::_Next
// TEMPLATE: BETA10 0x1011c5b0 // TEMPLATE: BETA10 0x1011c5b0
// list<MxDriver,allocator<MxDriver> >::begin // ?begin@?$list@UMxDriver@@V?$allocator@UMxDriver@@@@@@QAE?AViterator@1@XZ
// TEMPLATE: BETA10 0x1011c5f0 // TEMPLATE: BETA10 0x1011c5f0
// list<MxDriver,allocator<MxDriver> >::iterator::iterator // list<MxDriver,allocator<MxDriver> >::iterator::iterator
// TEMPLATE: BETA10 0x1011c620 // TEMPLATE: BETA10 0x1011c620
// list<MxDriver,allocator<MxDriver> >::end // ?end@?$list@UMxDriver@@V?$allocator@UMxDriver@@@@@@QAE?AViterator@1@XZ
// TEMPLATE: BETA10 0x1011c690 // TEMPLATE: BETA10 0x1011c690
// ??9@YAHABViterator@?$list@UMxDriver@@V?$allocator@UMxDriver@@@@@@0@Z // ??9@YAHABViterator@?$list@UMxDriver@@V?$allocator@UMxDriver@@@@@@0@Z
@ -294,10 +298,10 @@ class MxDeviceEnumerate {
// list<Direct3DDeviceInfo,allocator<Direct3DDeviceInfo> >::size // list<Direct3DDeviceInfo,allocator<Direct3DDeviceInfo> >::size
// TEMPLATE: BETA10 0x1011d3e0 // TEMPLATE: BETA10 0x1011d3e0
// list<Direct3DDeviceInfo,allocator<Direct3DDeviceInfo> >::erase // ?erase@?$list@UDirect3DDeviceInfo@@V?$allocator@UDirect3DDeviceInfo@@@@@@QAE?AViterator@1@V21@@Z
// TEMPLATE: BETA10 0x1011d570 // TEMPLATE: BETA10 0x1011d570
// list<MxDriver,allocator<MxDriver> >::erase // ?erase@?$list@UMxDriver@@V?$allocator@UMxDriver@@@@@@QAE?AViterator@1@V21@@Z
// TEMPLATE: BETA10 0x1011d6a0 // TEMPLATE: BETA10 0x1011d6a0
// list<MxDriver,allocator<MxDriver> >::_Freenode // list<MxDriver,allocator<MxDriver> >::_Freenode

View File

@ -144,8 +144,10 @@ class MxAtomId {
// clang-format off // clang-format off
// TEMPLATE: LEGO1 0x100af7e0 // TEMPLATE: LEGO1 0x100af7e0
// ?erase@?$_Tree@PAVMxAtom@@PAV1@U_Kfn@?$set@PAVMxAtom@@UMxAtomCompare@@V?$allocator@PAVMxAtom@@@@@@UMxAtomCompare@@V?$allocator@PAVMxAtom@@@@@@QAE?AViterator@1@V21@@Z
// TEMPLATE: BETA10 0x10131210 // TEMPLATE: BETA10 0x10131210
// _Tree<MxAtom *,MxAtom *,set<MxAtom *,MxAtomCompare,allocator<MxAtom *> >::_Kfn,MxAtomCompare,allocator<MxAtom *> >::erase // ?erase@?$_Tree@PAVMxAtom@@PAV1@U_Kfn@?$set@PAVMxAtom@@UMxAtomCompare@@V?$allocator@PAVMxAtom@@@@@@UMxAtomCompare@@V?$allocator@PAVMxAtom@@@@@@QAE?AViterator@1@V21@0@Z
// clang-format on // clang-format on
// clang-format off // clang-format off
@ -179,7 +181,9 @@ class MxAtomId {
// clang-format off // clang-format off
// TEMPLATE: BETA10 0x10132170 // TEMPLATE: BETA10 0x10132170
// _Tree<MxAtom *,MxAtom *,set<MxAtom *,MxAtomCompare,allocator<MxAtom *> >::_Kfn,MxAtomCompare,allocator<MxAtom *> >::begin // ?begin@?$_Tree@PAVMxAtom@@PAV1@U_Kfn@?$set@PAVMxAtom@@UMxAtomCompare@@V?$allocator@PAVMxAtom@@@@@@UMxAtomCompare@@V?$allocator@PAVMxAtom@@@@@@QAE?AViterator@1@XZ
// Note: could also be
// ?begin@?$_Tree@PAVMxAtom@@PAV1@U_Kfn@?$set@PAVMxAtom@@UMxAtomCompare@@V?$allocator@PAVMxAtom@@@@@@UMxAtomCompare@@V?$allocator@PAVMxAtom@@@@@@QBE?AVconst_iterator@1@XZ
// clang-format on // clang-format on
// TEMPLATE: BETA10 0x101321d0 // TEMPLATE: BETA10 0x101321d0

View File

@ -14,7 +14,7 @@ class MxParam {
}; };
// SYNTHETIC: BETA10 0x10013710 // SYNTHETIC: BETA10 0x10013710
// MxParam::MxParam // ??0MxParam@@QAE@XZ
// SYNTHETIC: ISLE 0x401540 // SYNTHETIC: ISLE 0x401540
// SYNTHETIC: LEGO1 0x10010370 // SYNTHETIC: LEGO1 0x10010370

View File

@ -107,6 +107,6 @@ class MxPresenterListCursor : public MxPtrListCursor<MxPresenter> {
// MxListCursor<MxPresenter *>::MxListCursor<MxPresenter *> // MxListCursor<MxPresenter *>::MxListCursor<MxPresenter *>
// TEMPLATE: BETA10 0x100d9420 // TEMPLATE: BETA10 0x100d9420
// MxListCursor<MxPresenter *>::Prev // ?Prev@?$MxListCursor@PAVMxPresenter@@@@QAEEAAPAVMxPresenter@@@Z
#endif // MXPRESENTERLIST_H #endif // MXPRESENTERLIST_H

View File

@ -135,7 +135,7 @@ class MxStreamer : public MxCore {
// list<MxStreamController *,allocator<MxStreamController *> >::end // list<MxStreamController *,allocator<MxStreamController *> >::end
// TEMPLATE: BETA10 0x101461b0 // TEMPLATE: BETA10 0x101461b0
// list<MxStreamController *,allocator<MxStreamController *> >::iterator::operator++ // ??Eiterator@?$list@PAVMxStreamController@@V?$allocator@PAVMxStreamController@@@@@@QAE?AV01@H@Z
// SYNTHETIC: LEGO1 0x100b9120 // SYNTHETIC: LEGO1 0x100b9120
// SYNTHETIC: BETA10 0x101466e0 // SYNTHETIC: BETA10 0x101466e0

View File

@ -356,64 +356,99 @@ void DecodeLC(LPBITMAPINFOHEADER p_bitmapHeader, BYTE* p_pixelData, BYTE* p_data
// FUNCTION: BETA10 0x1013e61d // FUNCTION: BETA10 0x1013e61d
void DecodeSS2(LPBITMAPINFOHEADER p_bitmapHeader, BYTE* p_pixelData, BYTE* p_data, FLIC_HEADER* p_flcHeader) void DecodeSS2(LPBITMAPINFOHEADER p_bitmapHeader, BYTE* p_pixelData, BYTE* p_data, FLIC_HEADER* p_flcHeader)
{ {
short width = (short) p_flcHeader->width - 1; short xofs = 0;
short row = (short) p_flcHeader->height - 1; short yofs = 0;
short lines = *((short*) p_data);
BYTE* data = p_data + 2;
while (--lines > 0) { short width = p_flcHeader->width;
short token; short token = 0;
while (TRUE) { // LINE: BETA10 0x1013e643
token = *((short*) data); short xmax = xofs + width - 1;
data += 2;
if (token < 0) { union {
if (token & 0x4000) { BYTE* byte;
row += token; WORD* word;
} // LINE: BETA10 0x1013e652
else { } data = {p_data};
WritePixel(p_bitmapHeader, p_pixelData, width, row, token);
token = *((WORD*) data);
data += 2;
if (!token) { // The first word in the data following the chunk header contains the number of lines in the chunk.
row--; // The line count does not include skipped lines.
if (--lines <= 0) { short lines = *(short*) data.word++;
return;
} // LINE: BETA10 0x1013e666
} short row = p_flcHeader->height - yofs - 1;
else {
break; goto start_packet;
}
} skip_lines:
// The layout in BETA10 strongly suggests that lots of `goto`s are used.
// LINE: BETA10 0x1013e684
row += token;
start_packet:
// LINE: BETA10 0x1013e692
token = *(short*) data.word++;
if (token >= 0) {
goto column_loop;
}
if ((unsigned short) token & 0x4000) {
goto skip_lines;
}
WritePixel(p_bitmapHeader, p_pixelData, xmax, row, token);
token = *(short*) data.word++;
// LINE: BETA10 0x1013e6ef
if (!token) {
row--;
if (--lines > 0) {
goto start_packet;
}
return;
}
else {
column_loop:
// LINE: BETA10 0x1013e71e
short column = xofs;
column_loop_inner:
// LINE: BETA10 0x1013e726
column += *data.byte++;
// LINE: BETA10 0x1013e73a
short type = *(char*) data.byte++;
type += type;
if (type >= 0) {
WritePixels(p_bitmapHeader, p_pixelData, column, row, data.byte, type);
column += type;
data.byte += type;
// LINE: BETA10 0x1013e797
if (--token != 0) {
goto column_loop_inner;
} }
else { row--;
break; if (--lines > 0) {
goto start_packet;
} }
return;
} }
short column = 0; type = -type;
do { WORD* p_pixel = data.word++;
column += *(data++); WritePixelPairs(p_bitmapHeader, p_pixelData, column, row, *p_pixel, type >> 1);
short type = *((char*) data++); column += type;
type += type; // LINE: BETA10 0x1013e813
if (--token != 0) {
if (type >= 0) { goto column_loop_inner;
WritePixels(p_bitmapHeader, p_pixelData, column, row, data, type); }
column += type;
data += type;
}
else {
type = -type;
short p_pixel = *((WORD*) data);
data += 2;
WritePixelPairs(p_bitmapHeader, p_pixelData, column, row, p_pixel, type >> 1);
column += type;
}
} while (--token);
row--; row--;
if (--lines > 0) {
goto start_packet;
}
return;
} }
} }

View File

@ -16,22 +16,49 @@ void* DeviceImpl::ImplementationDataPtr()
return reinterpret_cast<void*>(&m_data); return reinterpret_cast<void*>(&m_data);
} }
// FUNCTION: BETA10 0x1016dea0
inline unsigned int DeviceGetWidth(IDirect3DRMDevice2* pDevice)
{
return pDevice->GetWidth();
}
// FUNCTION: LEGO1 0x100a2c00 // FUNCTION: LEGO1 0x100a2c00
// FUNCTION: BETA10 0x1016de40
unsigned int DeviceImpl::GetWidth() unsigned int DeviceImpl::GetWidth()
{ {
return m_data->GetWidth(); assert(m_data);
return DeviceGetWidth(m_data);
}
// FUNCTION: BETA10 0x1016df20
inline unsigned int DeviceGetHeight(IDirect3DRMDevice2* pDevice)
{
return pDevice->GetHeight();
} }
// FUNCTION: LEGO1 0x100a2c10 // FUNCTION: LEGO1 0x100a2c10
// FUNCTION: BETA10 0x1016dec0
unsigned int DeviceImpl::GetHeight() unsigned int DeviceImpl::GetHeight()
{ {
return m_data->GetHeight(); assert(m_data);
return DeviceGetHeight(m_data);
}
// FUNCTION: BETA10 0x1016dfa0
inline Result DeviceSetColorModel(IDirect3DRMDevice2* pDevice, ColorModel)
{
return Success;
} }
// FUNCTION: LEGO1 0x100a2c20 // FUNCTION: LEGO1 0x100a2c20
Result DeviceImpl::SetColorModel(ColorModel) // FUNCTION: BETA10 0x1016df40
Result DeviceImpl::SetColorModel(ColorModel p_model)
{ {
return Success; assert(m_data);
return DeviceSetColorModel(m_data, p_model);
} }
// FUNCTION: BETA10 0x1016e020 // FUNCTION: BETA10 0x1016e020
@ -50,44 +77,96 @@ Result DeviceImpl::SetShadingModel(ShadingModel model)
return DeviceSetShadingModel(m_data, model); return DeviceSetShadingModel(m_data, model);
} }
// FUNCTION: BETA10 0x1016e140
inline Result DeviceSetShadeCount(IDirect3DRMDevice2* pDevice, unsigned int shadeCount)
{
return ResultVal(pDevice->SetShades(shadeCount));
}
// FUNCTION: LEGO1 0x100a2ca0 // FUNCTION: LEGO1 0x100a2ca0
// FUNCTION: BETA10 0x1016e0e0
Result DeviceImpl::SetShadeCount(unsigned int shadeCount) Result DeviceImpl::SetShadeCount(unsigned int shadeCount)
{ {
return ResultVal(m_data->SetShades(shadeCount)); assert(m_data);
return DeviceSetShadeCount(m_data, shadeCount);
}
// FUNCTION: BETA10 0x1016e1d0
inline Result DeviceSetDither(IDirect3DRMDevice2* pDevice, int dither)
{
return ResultVal(pDevice->SetDither(dither));
} }
// FUNCTION: LEGO1 0x100a2cc0 // FUNCTION: LEGO1 0x100a2cc0
// FUNCTION: BETA10 0x1016e170
Result DeviceImpl::SetDither(int dither) Result DeviceImpl::SetDither(int dither)
{ {
return ResultVal(m_data->SetDither(dither)); assert(m_data);
return DeviceSetDither(m_data, dither);
}
// FUNCTION: BETA10 0x1016e260
inline void DeviceHandleActivate(IDirect3DRMDevice2* pDevice, WORD wParam)
{
IDirect3DRMWinDevice* winDevice;
Result result = ResultVal(pDevice->QueryInterface(IID_IDirect3DRMWinDevice, (LPVOID*) &winDevice));
if (Succeeded(result)) {
winDevice->HandleActivate(wParam);
int refCount = winDevice->Release();
assert(refCount == 1);
}
} }
// FUNCTION: LEGO1 0x100a2ce0 // FUNCTION: LEGO1 0x100a2ce0
// FUNCTION: BETA10 0x1016e200
void DeviceImpl::HandleActivate(WORD wParam) void DeviceImpl::HandleActivate(WORD wParam)
{ {
// Device argument is intentionally unused. assert(m_data);
DeviceHandleActivate(m_data, wParam);
}
// FUNCTION: BETA10 0x1016e360
inline void DeviceHandlePaint(IDirect3DRMDevice2* pDevice, void* p_data)
{
IDirect3DRMWinDevice* winDevice; IDirect3DRMWinDevice* winDevice;
if (ResultVal(m_data->QueryInterface(IID_IDirect3DRMWinDevice, (LPVOID*) &winDevice))) {
winDevice->HandleActivate(wParam); Result result = ResultVal(pDevice->QueryInterface(IID_IDirect3DRMWinDevice, (LPVOID*) &winDevice));
winDevice->Release(); if (Succeeded(result)) {
HDC hdc = (HDC) p_data;
winDevice->HandlePaint(hdc);
int refCount = winDevice->Release();
assert(refCount == 1);
} }
} }
// FUNCTION: LEGO1 0x100a2d20 // FUNCTION: LEGO1 0x100a2d20
void DeviceImpl::HandlePaint(HDC p_dc) // FUNCTION: BETA10 0x1016e300
void DeviceImpl::HandlePaint(void* p_data)
{ {
IDirect3DRMWinDevice* winDevice; assert(m_data);
if (SUCCEEDED(m_data->QueryInterface(IID_IDirect3DRMWinDevice, (LPVOID*) &winDevice))) {
winDevice->HandlePaint(p_dc); DeviceHandlePaint(m_data, p_data);
winDevice->Release(); }
}
// FUNCTION: BETA10 0x1016e460
inline Result DeviceUpdate(IDirect3DRMDevice2* pDevice)
{
return ResultVal(pDevice->Update());
} }
// FUNCTION: LEGO1 0x100a2d60 // FUNCTION: LEGO1 0x100a2d60
// FUNCTION: BETA10 0x1016e400
Result DeviceImpl::Update() Result DeviceImpl::Update()
{ {
return ResultVal(m_data->Update()); assert(m_data);
return DeviceUpdate(m_data);
} }
// GLOBAL: LEGO1 0x100dd1d0 // GLOBAL: LEGO1 0x100dd1d0
// GLOBAL: BETA10 0x101c30b0
// IID_IDirect3DRMWinDevice // IID_IDirect3DRMWinDevice

View File

@ -184,7 +184,7 @@ class DeviceImpl : public Device {
// vtable+0x20 // vtable+0x20
Result Update() override; Result Update() override;
void HandleActivate(WORD) override; void HandleActivate(WORD) override;
void HandlePaint(HDC) override; void HandlePaint(void*) override;
typedef IDirect3DRMDevice2* DeviceDataType; typedef IDirect3DRMDevice2* DeviceDataType;
@ -613,7 +613,7 @@ class TglD3DRMIMAGE {
int paletteSize, int paletteSize,
PaletteEntry* pEntries PaletteEntry* pEntries
); );
~TglD3DRMIMAGE() { Destroy(); } ~TglD3DRMIMAGE();
Result CreateBuffer(int width, int height, int depth, void* pBuffer, int useBuffer); Result CreateBuffer(int width, int height, int depth, void* pBuffer, int useBuffer);
void Destroy(); void Destroy();
@ -622,6 +622,9 @@ class TglD3DRMIMAGE {
D3DRMIMAGE m_image; D3DRMIMAGE m_image;
int m_texelsAllocatedByClient; int m_texelsAllocatedByClient;
// SYNTHETIC: BETA10 0x1016abb0
// TglImpl::TglD3DRMIMAGE::`scalar deleting destructor'
}; };
// VTABLE: LEGO1 0x100dbb48 // VTABLE: LEGO1 0x100dbb48
@ -637,7 +640,7 @@ class TextureImpl : public Texture {
void* ImplementationDataPtr() override; void* ImplementationDataPtr() override;
// vtable+0x08 // vtable+0x08
Result SetTexels(int width, int height, int bitsPerTexel, void* pTexels) override; Result SetTexels(int width, int height, int bitsPerTexel, void* pTexels, int pTexelsArePersistent) override;
void FillRowsOfTexture(int y, int height, void* pBuffer) override; void FillRowsOfTexture(int y, int height, void* pBuffer) override;
// vtable+0x10 // vtable+0x10
@ -648,7 +651,7 @@ class TextureImpl : public Texture {
int* pDepth, int* pDepth,
void** ppBuffer, void** ppBuffer,
int* ppPaletteSize, int* ppPaletteSize,
PaletteEntry** ppPalette unsigned char (*pEntries)[3]
) override; ) override;
Result SetPalette(int entryCount, PaletteEntry* entries) override; Result SetPalette(int entryCount, PaletteEntry* entries) override;

View File

@ -1,9 +1,12 @@
#include "impl.h" #include "impl.h"
#include <assert.h>
using namespace TglImpl; using namespace TglImpl;
DECOMP_SIZE_ASSERT(TglD3DRMIMAGE, 0x40); DECOMP_SIZE_ASSERT(TglD3DRMIMAGE, 0x40);
// FUNCTION: BETA10 0x1016f9f0
inline TglD3DRMIMAGE* TextureGetImage(IDirect3DRMTexture* pTexture) inline TglD3DRMIMAGE* TextureGetImage(IDirect3DRMTexture* pTexture)
{ {
return reinterpret_cast<TglD3DRMIMAGE*>(pTexture->GetAppData()); return reinterpret_cast<TglD3DRMIMAGE*>(pTexture->GetAppData());
@ -13,36 +16,47 @@ inline TglD3DRMIMAGE* TextureGetImage(IDirect3DRMTexture* pTexture)
void TextureDestroyCallback(IDirect3DRMObject* pObject, void* pArg); void TextureDestroyCallback(IDirect3DRMObject* pObject, void* pArg);
// FUNCTION: LEGO1 0x100a12a0 // FUNCTION: LEGO1 0x100a12a0
// FUNCTION: BETA10 0x10169113
Result TextureImpl::SetImage(IDirect3DRMTexture* pSelf, TglD3DRMIMAGE* pImage) Result TextureImpl::SetImage(IDirect3DRMTexture* pSelf, TglD3DRMIMAGE* pImage)
{ {
void* appData; void* appData;
Result result; Result result;
appData = pImage; appData = pImage;
assert(reinterpret_cast<TglD3DRMIMAGE*>(appData) == pImage);
// This is here because in the original code they asserted if (TextureGetImage(pSelf)) {
// on the return value being NULL. assert(0);
TextureGetImage(pSelf); }
result = ResultVal(pSelf->SetAppData((LPD3DRM_APPDATA) appData)); result = ResultVal(pSelf->SetAppData((LPD3DRM_APPDATA) appData));
assert(Succeeded(result));
if (Succeeded(result) && pImage) { if (Succeeded(result) && pImage) {
result = ResultVal(pSelf->AddDestroyCallback(TextureDestroyCallback, NULL)); result = ResultVal(pSelf->AddDestroyCallback(TextureDestroyCallback, NULL));
assert(Succeeded(result));
if (!Succeeded(result)) { if (!Succeeded(result)) {
pSelf->SetAppData(0); pSelf->SetAppData(0);
} }
} }
return result; return result;
} }
// FUNCTION: LEGO1 0x100a1300 // FUNCTION: LEGO1 0x100a1300
// FUNCTION: BETA10 0x10169278
void TextureDestroyCallback(IDirect3DRMObject* pObject, void* pArg) void TextureDestroyCallback(IDirect3DRMObject* pObject, void* pArg)
{ {
TglD3DRMIMAGE* pImage = reinterpret_cast<TglD3DRMIMAGE*>(pObject->GetAppData()); TglD3DRMIMAGE* pImage = reinterpret_cast<TglD3DRMIMAGE*>(pObject->GetAppData());
assert(pImage);
delete pImage; delete pImage;
pObject->SetAppData(0); pObject->SetAppData(0);
} }
// FUNCTION: LEGO1 0x100a1330 // FUNCTION: LEGO1 0x100a1330
// FUNCTION: BETA10 0x101692e1
TglD3DRMIMAGE::TglD3DRMIMAGE( TglD3DRMIMAGE::TglD3DRMIMAGE(
int width, int width,
int height, int height,
@ -53,10 +67,10 @@ TglD3DRMIMAGE::TglD3DRMIMAGE(
PaletteEntry* pEntries PaletteEntry* pEntries
) )
{ {
m_image.aspectx = 1;
m_image.aspecty = 1;
m_image.width = 0; m_image.width = 0;
m_image.height = 0; m_image.height = 0;
m_image.aspectx = 1;
m_image.aspecty = 1;
m_image.depth = 0; m_image.depth = 0;
m_image.rgb = 0; m_image.rgb = 0;
m_image.bytes_per_line = 0; m_image.bytes_per_line = 0;
@ -69,23 +83,31 @@ TglD3DRMIMAGE::TglD3DRMIMAGE(
m_image.palette_size = 0; m_image.palette_size = 0;
m_image.palette = NULL; m_image.palette = NULL;
m_texelsAllocatedByClient = 0; m_texelsAllocatedByClient = 0;
Result result;
if (pBuffer != NULL) { if (pBuffer != NULL) {
CreateBuffer(width, height, depth, pBuffer, useBuffer); result = CreateBuffer(width, height, depth, pBuffer, useBuffer);
assert(Succeeded(result));
} }
if (pEntries != NULL) { if (pEntries != NULL) {
InitializePalette(paletteSize, pEntries); result = InitializePalette(paletteSize, pEntries);
assert(Succeeded(result));
} }
} }
// FUNCTION: LEGO1 0x100a13b0 // FUNCTION: LEGO1 0x100a13b0
void TglD3DRMIMAGE::Destroy() // FUNCTION: BETA10 0x1016944b
TglD3DRMIMAGE::~TglD3DRMIMAGE()
{ {
if (m_texelsAllocatedByClient == 0) { if (m_texelsAllocatedByClient == 0) {
delete[] ((char*) m_image.buffer1); delete[] ((char*) m_image.buffer1);
} }
delete m_image.palette; delete m_image.palette;
} }
// FUNCTION: BETA10 0x101699a0
inline static int IsPowerOfTwo(int v) inline static int IsPowerOfTwo(int v)
{ {
int m = 0; int m = 0;
@ -99,16 +121,25 @@ inline static int IsPowerOfTwo(int v)
} }
// FUNCTION: LEGO1 0x100a13e0 // FUNCTION: LEGO1 0x100a13e0
// FUNCTION: BETA10 0x101694a4
Result TglD3DRMIMAGE::CreateBuffer(int width, int height, int depth, void* pBuffer, int useBuffer) Result TglD3DRMIMAGE::CreateBuffer(int width, int height, int depth, void* pBuffer, int useBuffer)
{ {
if (!(IsPowerOfTwo(width) && IsPowerOfTwo(height) && width % 4 == 0)) { int bytesPerScanline = width;
assert(IsPowerOfTwo(width));
assert(IsPowerOfTwo(height));
assert((bytesPerScanline % 4) == 0);
if (!(IsPowerOfTwo(width) && IsPowerOfTwo(height) && bytesPerScanline % 4 == 0)) {
return Error; return Error;
} }
assert(!m_image.buffer1 || (m_image.buffer1 == pBuffer));
m_image.width = width; m_image.width = width;
m_image.height = height; m_image.height = height;
m_image.depth = depth; m_image.depth = depth;
m_image.bytes_per_line = width; m_image.bytes_per_line = bytesPerScanline;
if (!m_texelsAllocatedByClient) { if (!m_texelsAllocatedByClient) {
delete[] ((char*) m_image.buffer1); delete[] ((char*) m_image.buffer1);
@ -116,12 +147,13 @@ Result TglD3DRMIMAGE::CreateBuffer(int width, int height, int depth, void* pBuff
} }
if (useBuffer) { if (useBuffer) {
m_texelsAllocatedByClient = 1;
m_image.buffer1 = (char*) pBuffer; m_image.buffer1 = (char*) pBuffer;
m_texelsAllocatedByClient = 1;
} }
else { else {
m_image.buffer1 = new char[width * height]; int size = bytesPerScanline * height;
memcpy(m_image.buffer1, pBuffer, width * height); m_image.buffer1 = new char[size];
memcpy(m_image.buffer1, pBuffer, size);
m_texelsAllocatedByClient = 0; m_texelsAllocatedByClient = 0;
} }
@ -129,14 +161,20 @@ Result TglD3DRMIMAGE::CreateBuffer(int width, int height, int depth, void* pBuff
} }
// FUNCTION: LEGO1 0x100a1510 // FUNCTION: LEGO1 0x100a1510
Result TglD3DRMIMAGE::FillRowsOfTexture(int y, int height, char* pContent) // FUNCTION: BETA10 0x1016969c
Result TglD3DRMIMAGE::FillRowsOfTexture(int destVOffset, int srcHeight, char* pTexels)
{ {
// The purpose is clearly this but I can't get the assembly to line up. assert(m_image.buffer1 && pTexels);
memcpy((char*) m_image.buffer1 + (y * m_image.bytes_per_line), pContent, height * m_image.bytes_per_line); assert((destVOffset + srcHeight) <= m_image.height);
int size = srcHeight * m_image.bytes_per_line;
char* pSrc = (char*) m_image.buffer1 + (destVOffset * m_image.bytes_per_line);
memcpy(pSrc, pTexels, size);
return Success; return Success;
} }
// FUNCTION: LEGO1 0x100a1550 // FUNCTION: LEGO1 0x100a1550
// FUNCTION: BETA10 0x10169758
Result TglD3DRMIMAGE::InitializePalette(int paletteSize, PaletteEntry* pEntries) Result TglD3DRMIMAGE::InitializePalette(int paletteSize, PaletteEntry* pEntries)
{ {
// This function is a 100% match if the PaletteEntry class is copied // This function is a 100% match if the PaletteEntry class is copied
@ -152,6 +190,7 @@ Result TglD3DRMIMAGE::InitializePalette(int paletteSize, PaletteEntry* pEntries)
m_image.palette_size = paletteSize; m_image.palette_size = paletteSize;
} }
} }
if (paletteSize > 0) { if (paletteSize > 0) {
for (int i = 0; i < paletteSize; i++) { for (int i = 0; i < paletteSize; i++) {
m_image.palette[i].red = pEntries[i].m_red; m_image.palette[i].red = pEntries[i].m_red;
@ -160,67 +199,146 @@ Result TglD3DRMIMAGE::InitializePalette(int paletteSize, PaletteEntry* pEntries)
m_image.palette[i].flags = D3DRMPALETTE_READONLY; m_image.palette[i].flags = D3DRMPALETTE_READONLY;
} }
} }
return Success; return Success;
} }
// FUNCTION: LEGO1 0x100a3c10 // FUNCTION: BETA10 0x1016ee80
Result TextureImpl::SetTexels(int width, int height, int bitsPerTexel, void* pTexels) inline Result TextureSetTexels(
IDirect3DRMTexture* pTexture,
int width,
int height,
int bitsPerTexel,
void* pTexels,
int pTexelsArePersistent
)
{ {
TglD3DRMIMAGE* image = TextureGetImage(m_data); TglD3DRMIMAGE* pImage = TextureGetImage(pTexture);
Result result = image->CreateBuffer(width, height, bitsPerTexel, pTexels, TRUE); assert(pImage);
Result result = pImage->CreateBuffer(width, height, bitsPerTexel, pTexels, pTexelsArePersistent);
assert(Succeeded(result));
if (Succeeded(result)) { if (Succeeded(result)) {
result = ResultVal(m_data->Changed(TRUE, FALSE)); result = ResultVal(pTexture->Changed(TRUE, FALSE));
assert(Succeeded(result));
} }
return result;
}
// FUNCTION: LEGO1 0x100a3c10
// FUNCTION: BETA10 0x1016c390
Result TextureImpl::SetTexels(int width, int height, int bitsPerTexel, void* pTexels, int pTexelsArePersistent)
{
assert(m_data);
return TextureSetTexels(m_data, width, height, bitsPerTexel, pTexels, pTexelsArePersistent);
}
// FUNCTION: BETA10 0x1016f160
inline Result TextureFillRowsOfTexture(IDirect3DRMTexture* pTexture, int y, int height, void* pBuffer)
{
TglD3DRMIMAGE* pImage = TextureGetImage(pTexture);
assert(pImage);
Result result = pImage->FillRowsOfTexture(y, height, (char*) pBuffer);
assert(Succeeded(result));
return result; return result;
} }
// FUNCTION: LEGO1 0x100a3c60 // FUNCTION: LEGO1 0x100a3c60
// FUNCTION: BETA10 0x1016c490
void TextureImpl::FillRowsOfTexture(int y, int height, void* pBuffer) void TextureImpl::FillRowsOfTexture(int y, int height, void* pBuffer)
{ {
TglD3DRMIMAGE* image = TextureGetImage(m_data); assert(m_data);
image->FillRowsOfTexture(y, height, (char*) pBuffer);
TextureFillRowsOfTexture(m_data, y, height, pBuffer);
}
// FUNCTION: BETA10 0x1016f270
inline Result TextureChanged(IDirect3DRMTexture* pTexture, int texelsChanged, int paletteChanged)
{
Result result = ResultVal(pTexture->Changed(texelsChanged, paletteChanged));
assert(Succeeded(result));
return result;
} }
// FUNCTION: LEGO1 0x100a3c90 // FUNCTION: LEGO1 0x100a3c90
// FUNCTION: BETA10 0x1016c540
Result TextureImpl::Changed(int texelsChanged, int paletteChanged) Result TextureImpl::Changed(int texelsChanged, int paletteChanged)
{ {
return ResultVal(m_data->Changed(texelsChanged, paletteChanged)); assert(m_data);
return TextureChanged(m_data, texelsChanged, paletteChanged);
}
// FUNCTION: BETA10 0x1016f4c0
inline Result TextureGetBufferAndPalette(
IDirect3DRMTexture* pTexture,
int* width,
int* height,
int* depth,
void** pBuffer,
int* paletteSize,
unsigned char (*pEntries)[3]
)
{
TglD3DRMIMAGE* pImage = TextureGetImage(pTexture);
assert(pImage);
*width = pImage->m_image.width;
*height = pImage->m_image.height;
*depth = pImage->m_image.depth;
*pBuffer = pImage->m_image.buffer1;
*paletteSize = pImage->m_image.palette_size;
for (int i = 0; i < *paletteSize; i++) {
pEntries[i][0] = pImage->m_image.palette[i].red;
pEntries[i][1] = pImage->m_image.palette[i].green;
pEntries[i][2] = pImage->m_image.palette[i].blue;
}
return Success;
} }
// FUNCTION: LEGO1 0x100a3cc0 // FUNCTION: LEGO1 0x100a3cc0
// FUNCTION: BETA10 0x1016c5d0
Result TextureImpl::GetBufferAndPalette( Result TextureImpl::GetBufferAndPalette(
int* width, int* width,
int* height, int* height,
int* depth, int* depth,
void** pBuffer, void** pBuffer,
int* paletteSize, int* paletteSize,
PaletteEntry** pEntries unsigned char (*pEntries)[3]
) )
{ {
// Something really doesn't match here, not sure what's up. assert(m_data);
TglD3DRMIMAGE* image = TextureGetImage(m_data);
*width = image->m_image.width; return TextureGetBufferAndPalette(m_data, width, height, depth, pBuffer, paletteSize, pEntries);
*height = image->m_image.height; }
*depth = image->m_image.depth;
*pBuffer = image->m_image.buffer1; // FUNCTION: BETA10 0x1016f730
*paletteSize = image->m_image.palette_size; inline Result TextureSetPalette(IDirect3DRMTexture* pTexture, int entryCount, PaletteEntry* pEntries)
for (int i = 0; i < image->m_image.palette_size; i++) { {
pEntries[i]->m_red = image->m_image.palette[i].red; TglD3DRMIMAGE* pImage = TextureGetImage(pTexture);
pEntries[i]->m_green = image->m_image.palette[i].green; assert(pImage);
pEntries[i]->m_blue = image->m_image.palette[i].blue;
} pImage->InitializePalette(entryCount, pEntries);
Result result = ResultVal(pTexture->Changed(FALSE, TRUE));
assert(Succeeded(result));
return Success; return Success;
} }
// FUNCTION: LEGO1 0x100a3d40 // FUNCTION: LEGO1 0x100a3d40
// FUNCTION: BETA10 0x1016c6a0
Result TextureImpl::SetPalette(int entryCount, PaletteEntry* pEntries) Result TextureImpl::SetPalette(int entryCount, PaletteEntry* pEntries)
{ {
// Not 100% confident this is supposed to directly be forwarding arguments, assert(m_data);
// but it probably is given FillRowsOfTexture matches doing that.
TglD3DRMIMAGE* image = TextureGetImage(m_data); return TextureSetPalette(m_data, entryCount, pEntries);
image->InitializePalette(entryCount, pEntries);
m_data->Changed(FALSE, TRUE);
return Success;
} }
// FUNCTION: LEGO1 0x100a3d70 // FUNCTION: LEGO1 0x100a3d70

View File

@ -197,7 +197,7 @@ class Device : public Object {
// vtable+0x20 // vtable+0x20
virtual Result Update() = 0; virtual Result Update() = 0;
virtual void HandleActivate(WORD) = 0; virtual void HandleActivate(WORD) = 0;
virtual void HandlePaint(HDC) = 0; virtual void HandlePaint(void*) = 0;
// SYNTHETIC: BETA10 0x1016b740 // SYNTHETIC: BETA10 0x1016b740
// Tgl::Device::Device // Tgl::Device::Device
@ -411,7 +411,7 @@ class MeshBuilder : public Object {
class Texture : public Object { class Texture : public Object {
public: public:
// vtable+0x08 // vtable+0x08
virtual Result SetTexels(int width, int height, int bitsPerTexel, void* pTexels) = 0; virtual Result SetTexels(int width, int height, int bitsPerTexel, void* pTexels, int pTexelsArePersistent) = 0;
virtual void FillRowsOfTexture(int y, int height, void* pBuffer) = 0; virtual void FillRowsOfTexture(int y, int height, void* pBuffer) = 0;
// vtable+0x10 // vtable+0x10
@ -422,7 +422,7 @@ class Texture : public Object {
int* pDepth, int* pDepth,
void** ppBuffer, void** ppBuffer,
int* pPaletteSize, int* pPaletteSize,
PaletteEntry** ppPalette unsigned char (*pEntries)[3]
) = 0; ) = 0;
virtual Result SetPalette(int entryCount, PaletteEntry* pEntries) = 0; virtual Result SetPalette(int entryCount, PaletteEntry* pEntries) = 0;

View File

@ -127,8 +127,10 @@ class ViewLODListManager {
// _Tree<char const *,pair<char const * const,ViewLODList *>,map<char const *,ViewLODList *,ROINameComparator,allocator<ViewLODList *> >::_Kfn,ROINameComparator,allocator<ViewLODList *> >::~_Tree<char const *,pair<char const * const,ViewLODList *>,map<char c // _Tree<char const *,pair<char const * const,ViewLODList *>,map<char const *,ViewLODList *,ROINameComparator,allocator<ViewLODList *> >::_Kfn,ROINameComparator,allocator<ViewLODList *> >::~_Tree<char const *,pair<char const * const,ViewLODList *>,map<char c
// TEMPLATE: LEGO1 0x100a7960 // TEMPLATE: LEGO1 0x100a7960
// ?erase@?$_Tree@PBDU?$pair@QBDPAVViewLODList@@@@U_Kfn@?$map@PBDPAVViewLODList@@UROINameComparator@@V?$allocator@PAVViewLODList@@@@@@UROINameComparator@@V?$allocator@PAVViewLODList@@@@@@QAE?AViterator@1@V21@@Z
// TEMPLATE: BETA10 0x1017ab40 // TEMPLATE: BETA10 0x1017ab40
// _Tree<char const *,pair<char const * const,ViewLODList *>,map<char const *,ViewLODList *,ROINameComparator,allocator<ViewLODList *> >::_Kfn,ROINameComparator,allocator<ViewLODList *> >::erase // ?erase@?$_Tree@PBDU?$pair@QBDPAVViewLODList@@@@U_Kfn@?$map@PBDPAVViewLODList@@UROINameComparator@@V?$allocator@PAVViewLODList@@@@@@UROINameComparator@@V?$allocator@PAVViewLODList@@@@@@QAE?AViterator@1@V21@0@Z
// TEMPLATE: LEGO1 0x100a7db0 // TEMPLATE: LEGO1 0x100a7db0
// TEMPLATE: BETA10 0x1017aca0 // TEMPLATE: BETA10 0x1017aca0
@ -156,7 +158,7 @@ class ViewLODListManager {
// map<char const *,ViewLODList *,ROINameComparator,allocator<ViewLODList *> >::begin // map<char const *,ViewLODList *,ROINameComparator,allocator<ViewLODList *> >::begin
// TEMPLATE: BETA10 0x10179070 // TEMPLATE: BETA10 0x10179070
// map<char const *,ViewLODList *,ROINameComparator,allocator<ViewLODList *> >::end // ?end@?$map@PBDPAVViewLODList@@UROINameComparator@@V?$allocator@PAVViewLODList@@@@@@QAE?AViterator@?$_Tree@PBDU?$pair@QBDPAVViewLODList@@@@U_Kfn@?$map@PBDPAVViewLODList@@UROINameComparator@@V?$allocator@PAVViewLODList@@@@@@UROINameComparator@@V?$allocator@
// TEMPLATE: BETA10 0x10179250 // TEMPLATE: BETA10 0x10179250
// pair<char const * const,ViewLODList *>::pair<char const * const,ViewLODList *> // pair<char const * const,ViewLODList *>::pair<char const * const,ViewLODList *>