Clear unknowns in LegoROI and related classes (#1457)

* Clear unknowns in LegoROI and related classes

* Update names

* Consistently naming: `GetTextureInfo`

---------

Co-authored-by: Christian Semmler <mail@csemmler.com>
This commit is contained in:
Florian Kaiser 2025-05-09 18:13:19 +02:00 committed by GitHub
parent 3811d61ea4
commit 5fd5a4cec0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 84 additions and 83 deletions

View File

@ -228,7 +228,7 @@ private:
MxResult WriteEndOfVariables(LegoStorage* p_storage); MxResult WriteEndOfVariables(LegoStorage* p_storage);
MxS32 ReadVariable(LegoStorage* p_storage, MxVariableTable* p_to); MxS32 ReadVariable(LegoStorage* p_storage, MxVariableTable* p_to);
void SetColors(); void SetColors();
void SetROIHandlerFunction(); void SetROIColorOverride();
char* m_savePath; // 0x00 char* m_savePath; // 0x00
MxS16 m_stateCount; // 0x04 MxS16 m_stateCount; // 0x04
@ -255,7 +255,7 @@ public:
Area m_unk0x42c; // 0x42c Area m_unk0x42c; // 0x42c
}; };
MxBool ROIHandlerFunction(const char* p_input, char* p_output, MxU32 p_copyLen); MxBool ROIColorOverride(const char* p_input, char* p_output, MxU32 p_copyLen);
// SYNTHETIC: LEGO1 0x1003c860 // SYNTHETIC: LEGO1 0x1003c860
// LegoGameState::ScoreItem::ScoreItem // LegoGameState::ScoreItem::ScoreItem

View File

@ -220,8 +220,8 @@ void LegoCarBuildAnimPresenter::StreamingTickle()
LegoROI* roi = m_roiMap[j]; LegoROI* roi = m_roiMap[j];
if (roi && roi->GetName() && (strcmpi(name, roi->GetName()) == 0)) { if (roi && roi->GetName() && (strcmpi(name, roi->GetName()) == 0)) {
roi->FUN_100a9dd0(); roi->ClearMeshOffset();
roi->FUN_100a9350("lego red"); roi->SetLodColor("lego red");
} }
} }
} }

View File

@ -567,14 +567,14 @@ LegoROI* LegoCharacterManager::CreateActorROI(const char* p_key)
LegoTextureInfo* textureInfo = textureContainer->Get(part.m_unk0x10[part.m_unk0x0c[part.m_unk0x14]]); LegoTextureInfo* textureInfo = textureContainer->Get(part.m_unk0x10[part.m_unk0x0c[part.m_unk0x14]]);
if (textureInfo != NULL) { if (textureInfo != NULL) {
childROI->FUN_100a9210(textureInfo); childROI->SetTextureInfo(textureInfo);
childROI->FUN_100a9170(1.0F, 1.0F, 1.0F, 0.0F); childROI->SetLodColor(1.0F, 1.0F, 1.0F, 0.0F);
} }
} }
else if (g_actorLODs[i + 1].m_flags & LegoActorLOD::c_flag2 || (i == 0 && part.m_unk0x00[part.m_unk0x08] == 0)) { else if (g_actorLODs[i + 1].m_flags & LegoActorLOD::c_flag2 || (i == 0 && part.m_unk0x00[part.m_unk0x08] == 0)) {
LegoFloat red, green, blue, alpha; LegoFloat red, green, blue, alpha;
childROI->FUN_100a9bf0(part.m_unk0x10[part.m_unk0x0c[part.m_unk0x14]], red, green, blue, alpha); childROI->GetRGBAColor(part.m_unk0x10[part.m_unk0x0c[part.m_unk0x14]], red, green, blue, alpha);
childROI->FUN_100a9170(red, green, blue, alpha); childROI->SetLodColor(red, green, blue, alpha);
} }
comp->push_back(childROI); comp->push_back(childROI);
@ -796,8 +796,8 @@ MxBool LegoCharacterManager::SwitchColor(LegoROI* p_roi, LegoROI* p_targetROI)
} }
LegoFloat red, green, blue, alpha; LegoFloat red, green, blue, alpha;
LegoROI::FUN_100a9bf0(part.m_unk0x10[part.m_unk0x0c[part.m_unk0x14]], red, green, blue, alpha); LegoROI::GetRGBAColor(part.m_unk0x10[part.m_unk0x0c[part.m_unk0x14]], red, green, blue, alpha);
p_targetROI->FUN_100a9170(red, green, blue, alpha); p_targetROI->SetLodColor(red, green, blue, alpha);
return TRUE; return TRUE;
} }
@ -832,12 +832,12 @@ MxBool LegoCharacterManager::SwitchVariant(LegoROI* p_roi)
Tgl::Renderer* renderer = VideoManager()->GetRenderer(); Tgl::Renderer* renderer = VideoManager()->GetRenderer();
LegoFloat red, green, blue, alpha; LegoFloat red, green, blue, alpha;
LegoROI::FUN_100a9bf0(part.m_unk0x10[part.m_unk0x0c[part.m_unk0x14]], red, green, blue, alpha); LegoROI::GetRGBAColor(part.m_unk0x10[part.m_unk0x0c[part.m_unk0x14]], red, green, blue, alpha);
for (MxS32 i = 0; i < lodSize; i++) { for (MxS32 i = 0; i < lodSize; i++) {
LegoLOD* lod = (LegoLOD*) (*lodList)[i]; LegoLOD* lod = (LegoLOD*) (*lodList)[i];
LegoLOD* clone = lod->Clone(renderer); LegoLOD* clone = lod->Clone(renderer);
clone->FUN_100aacb0(red, green, blue, alpha); clone->SetColor(red, green, blue, alpha);
dupLodList->PushBack(clone); dupLodList->PushBack(clone);
} }

View File

@ -145,7 +145,7 @@ const char* g_strDisable = "disable";
LegoGameState::LegoGameState() LegoGameState::LegoGameState()
{ {
SetColors(); SetColors();
SetROIHandlerFunction(); SetROIColorOverride();
m_stateCount = 0; m_stateCount = 0;
m_actorId = 0; m_actorId = 0;
@ -176,7 +176,7 @@ LegoGameState::LegoGameState()
// FUNCTION: LEGO1 0x10039720 // FUNCTION: LEGO1 0x10039720
LegoGameState::~LegoGameState() LegoGameState::~LegoGameState()
{ {
LegoROI::FUN_100a9d30(NULL); LegoROI::SetColorOverride(NULL);
if (m_stateCount) { if (m_stateCount) {
for (MxS16 i = 0; i < m_stateCount; i++) { for (MxS16 i = 0; i < m_stateCount; i++) {
@ -1060,13 +1060,13 @@ void LegoGameState::SetColors()
} }
// FUNCTION: LEGO1 0x1003bac0 // FUNCTION: LEGO1 0x1003bac0
void LegoGameState::SetROIHandlerFunction() void LegoGameState::SetROIColorOverride()
{ {
LegoROI::FUN_100a9d30(&ROIHandlerFunction); LegoROI::SetColorOverride(&ROIColorOverride);
} }
// FUNCTION: LEGO1 0x1003bad0 // FUNCTION: LEGO1 0x1003bad0
MxBool ROIHandlerFunction(const char* p_input, char* p_output, MxU32 p_copyLen) MxBool ROIColorOverride(const char* p_input, char* p_output, MxU32 p_copyLen)
{ {
if (p_output != NULL && p_copyLen != 0 && if (p_output != NULL && p_copyLen != 0 &&
(strnicmp(p_input, "INDIR-F-", strlen("INDIR-F-")) == 0 || (strnicmp(p_input, "INDIR-F-", strlen("INDIR-F-")) == 0 ||

View File

@ -56,7 +56,7 @@ void LegoPhonemePresenter::StartingTickle()
} }
head = entityROI->FindChildROI("head", entityROI); head = entityROI->FindChildROI("head", entityROI);
head->GetTexture(m_textureInfo); head->GetTextureInfo(m_textureInfo);
LegoPhonemeList* phonemeList = VideoManager()->GetPhonemeList(); LegoPhonemeList* phonemeList = VideoManager()->GetPhonemeList();
LegoPhoneme* phoneme = new LegoPhoneme(m_roiName.GetData(), 1); LegoPhoneme* phoneme = new LegoPhoneme(m_roiName.GetData(), 1);

View File

@ -32,7 +32,7 @@ LegoLOD::LegoLOD(Tgl::Renderer* p_renderer) : ViewLOD(p_renderer)
m_numMeshes = 0; m_numMeshes = 0;
m_numVertices = 0; m_numVertices = 0;
m_numPolys = 0; m_numPolys = 0;
m_unk0x1c = 0; m_meshOffset = 0;
} }
// FUNCTION: LEGO1 0x100aa450 // FUNCTION: LEGO1 0x100aa450
@ -212,7 +212,7 @@ LegoResult LegoLOD::Read(Tgl::Renderer* p_renderer, LegoTextureContainer* p_text
if (textureName != NULL) { if (textureName != NULL) {
if (mesh->GetUnknown0x21()) { if (mesh->GetUnknown0x21()) {
LegoROI::FUN_100a9cf0(textureName, paletteEntries, sizeOfArray(paletteEntries)); LegoROI::GetPaletteEntries(textureName, paletteEntries, sizeOfArray(paletteEntries));
} }
textureInfo = p_textureContainer->Get(mesh->GetTextureName()); textureInfo = p_textureContainer->Get(mesh->GetTextureName());
@ -232,7 +232,7 @@ LegoResult LegoLOD::Read(Tgl::Renderer* p_renderer, LegoTextureContainer* p_text
LegoFloat alpha = 0.0F; LegoFloat alpha = 0.0F;
if (mesh->GetUnknown0x21()) { if (mesh->GetUnknown0x21()) {
LegoROI::FUN_100a9bf0(materialName, red, green, blue, alpha); LegoROI::GetRGBAColor(materialName, red, green, blue, alpha);
} }
else { else {
red = mesh->GetColor().GetRed() / 255.0; red = mesh->GetColor().GetRed() / 255.0;
@ -265,7 +265,7 @@ LegoResult LegoLOD::Read(Tgl::Renderer* p_renderer, LegoTextureContainer* p_text
} }
} }
m_unk0x1c = meshUnd2; m_meshOffset = meshUnd2;
if (textureVertices != NULL) { if (textureVertices != NULL) {
delete[] textureVertices; delete[] textureVertices;
@ -319,15 +319,15 @@ LegoLOD* LegoLOD::Clone(Tgl::Renderer* p_renderer)
dupLod->m_numMeshes = m_numMeshes; dupLod->m_numMeshes = m_numMeshes;
dupLod->m_numVertices = m_numVertices; dupLod->m_numVertices = m_numVertices;
dupLod->m_numPolys = m_numPolys; dupLod->m_numPolys = m_numPolys;
dupLod->m_unk0x1c = m_unk0x1c; dupLod->m_meshOffset = m_meshOffset;
return dupLod; return dupLod;
} }
// FUNCTION: LEGO1 0x100aacb0 // FUNCTION: LEGO1 0x100aacb0
LegoResult LegoLOD::FUN_100aacb0(LegoFloat p_red, LegoFloat p_green, LegoFloat p_blue, LegoFloat p_alpha) LegoResult LegoLOD::SetColor(LegoFloat p_red, LegoFloat p_green, LegoFloat p_blue, LegoFloat p_alpha)
{ {
for (LegoU32 i = m_unk0x1c; i < m_numMeshes; i++) { for (LegoU32 i = m_meshOffset; i < m_numMeshes; i++) {
if (!m_melems[i].m_unk0x04) { if (!m_melems[i].m_unk0x04) {
m_melems[i].m_tglMesh->SetColor(p_red, p_green, p_blue, p_alpha); m_melems[i].m_tglMesh->SetColor(p_red, p_green, p_blue, p_alpha);
} }
@ -337,9 +337,9 @@ LegoResult LegoLOD::FUN_100aacb0(LegoFloat p_red, LegoFloat p_green, LegoFloat p
} }
// FUNCTION: LEGO1 0x100aad00 // FUNCTION: LEGO1 0x100aad00
LegoResult LegoLOD::FUN_100aad00(LegoTextureInfo* p_textureInfo) LegoResult LegoLOD::SetTextureInfo(LegoTextureInfo* p_textureInfo)
{ {
for (LegoU32 i = m_unk0x1c; i < m_numMeshes; i++) { for (LegoU32 i = m_meshOffset; i < m_numMeshes; i++) {
if (m_melems[i].m_unk0x04) { if (m_melems[i].m_unk0x04) {
LegoTextureInfo::SetGroupTexture(m_melems[i].m_tglMesh, p_textureInfo); LegoTextureInfo::SetGroupTexture(m_melems[i].m_tglMesh, p_textureInfo);
m_melems[i].m_tglMesh->SetColor(1.0F, 1.0F, 1.0F, 0.0F); m_melems[i].m_tglMesh->SetColor(1.0F, 1.0F, 1.0F, 0.0F);
@ -353,7 +353,7 @@ LegoResult LegoLOD::FUN_100aad00(LegoTextureInfo* p_textureInfo)
// FUNCTION: LEGO1 0x100aad70 // FUNCTION: LEGO1 0x100aad70
LegoResult LegoLOD::FUN_100aad70(LegoTextureInfo* p_textureInfo) LegoResult LegoLOD::FUN_100aad70(LegoTextureInfo* p_textureInfo)
{ {
for (LegoU32 i = m_unk0x1c; i < m_numMeshes; i++) { for (LegoU32 i = m_meshOffset; i < m_numMeshes; i++) {
if (m_melems[i].m_unk0x04) { if (m_melems[i].m_unk0x04) {
LegoTextureInfo::SetGroupTexture(m_melems[i].m_tglMesh, p_textureInfo); LegoTextureInfo::SetGroupTexture(m_melems[i].m_tglMesh, p_textureInfo);
} }
@ -363,9 +363,9 @@ LegoResult LegoLOD::FUN_100aad70(LegoTextureInfo* p_textureInfo)
} }
// FUNCTION: LEGO1 0x100aadc0 // FUNCTION: LEGO1 0x100aadc0
LegoResult LegoLOD::GetTexture(LegoTextureInfo*& p_textureInfo) LegoResult LegoLOD::GetTextureInfo(LegoTextureInfo*& p_textureInfo)
{ {
for (LegoU32 i = m_unk0x1c; i < m_numMeshes; i++) { for (LegoU32 i = m_meshOffset; i < m_numMeshes; i++) {
if (m_melems[i].m_unk0x04) { if (m_melems[i].m_unk0x04) {
if (LegoTextureInfo::GetGroupTexture(m_melems[i].m_tglMesh, p_textureInfo) == TRUE) { if (LegoTextureInfo::GetGroupTexture(m_melems[i].m_tglMesh, p_textureInfo) == TRUE) {
return SUCCESS; return SUCCESS;
@ -390,9 +390,9 @@ LegoBool LegoLOD::FUN_100aae20(const LegoChar* p_name)
// FUNCTION: LEGO1 0x100aae60 // FUNCTION: LEGO1 0x100aae60
// FUNCTION: BETA10 0x1018e50f // FUNCTION: BETA10 0x1018e50f
void LegoLOD::FUN_100aae60() void LegoLOD::ClearMeshOffset()
{ {
m_unk0x1c = 0; m_meshOffset = 0;
} }
inline BOOL GetMeshData(IDirect3DRMMesh*& mesh, D3DRMGROUPINDEX& index, Tgl::Mesh* pMesh) inline BOOL GetMeshData(IDirect3DRMMesh*& mesh, D3DRMGROUPINDEX& index, Tgl::Mesh* pMesh)

View File

@ -29,11 +29,11 @@ public:
LegoResult Read(Tgl::Renderer* p_renderer, LegoTextureContainer* p_textureContainer, LegoStorage* p_storage); LegoResult Read(Tgl::Renderer* p_renderer, LegoTextureContainer* p_textureContainer, LegoStorage* p_storage);
LegoLOD* Clone(Tgl::Renderer* p_renderer); LegoLOD* Clone(Tgl::Renderer* p_renderer);
LegoResult FUN_100aacb0(LegoFloat p_red, LegoFloat p_green, LegoFloat p_blue, LegoFloat p_alpha); LegoResult SetColor(LegoFloat p_red, LegoFloat p_green, LegoFloat p_blue, LegoFloat p_alpha);
LegoResult FUN_100aad00(LegoTextureInfo* p_textureInfo); LegoResult SetTextureInfo(LegoTextureInfo* p_textureInfo);
LegoResult FUN_100aad70(LegoTextureInfo* p_textureInfo); LegoResult FUN_100aad70(LegoTextureInfo* p_textureInfo);
void FUN_100aae60(); void ClearMeshOffset();
LegoResult GetTexture(LegoTextureInfo*& p_textureInfo); LegoResult GetTextureInfo(LegoTextureInfo*& p_textureInfo);
static LegoBool FUN_100aae20(const LegoChar* p_name); static LegoBool FUN_100aae20(const LegoChar* p_name);
@ -45,7 +45,7 @@ protected:
LegoU32 m_numMeshes; // 0x10 LegoU32 m_numMeshes; // 0x10
LegoU32 m_numVertices; // 0x14 LegoU32 m_numVertices; // 0x14
LegoU32 m_numPolys; // 0x18 LegoU32 m_numPolys; // 0x18
undefined4 m_unk0x1c; // 0x1c LegoU32 m_meshOffset; // 0x1c
}; };
#endif // LEGOLOD_H #endif // LEGOLOD_H

View File

@ -52,10 +52,10 @@ const char* g_unk0x10101380[] = {"bike", "moto", "haus", NULL};
const char* g_unk0x10101390[] = {"rcuser", "jsuser", "dunebugy", "chtrblad", "chtrbody", "chtrshld", NULL}; const char* g_unk0x10101390[] = {"rcuser", "jsuser", "dunebugy", "chtrblad", "chtrbody", "chtrshld", NULL};
// GLOBAL: LEGO1 0x101013ac // GLOBAL: LEGO1 0x101013ac
ROIHandler g_unk0x101013ac = NULL; ColorOverride g_colorOverride = NULL;
// GLOBAL: LEGO1 0x101013b0 // GLOBAL: LEGO1 0x101013b0
TextureHandler g_unk0x101013b0 = NULL; TextureHandler g_textureHandler = NULL;
// FUNCTION: LEGO1 0x100a81b0 // FUNCTION: LEGO1 0x100a81b0
void LegoROI::FUN_100a81b0(const LegoChar* p_error, const LegoChar* p_name) void LegoROI::FUN_100a81b0(const LegoChar* p_error, const LegoChar* p_name)
@ -299,16 +299,16 @@ LegoResult LegoROI::Read(
goto done; goto done;
} }
FUN_100a9210(textureInfo); SetTextureInfo(textureInfo);
FUN_100a9170(1.0F, 1.0F, 1.0F, 0.0F); SetLodColor(1.0F, 1.0F, 1.0F, 0.0F);
} }
else { else {
LegoFloat red = 1.0F; LegoFloat red = 1.0F;
LegoFloat green = 0.0F; LegoFloat green = 0.0F;
LegoFloat blue = 1.0F; LegoFloat blue = 1.0F;
LegoFloat alpha = 0.0F; LegoFloat alpha = 0.0F;
FUN_100a9bf0(textureName, red, green, blue, alpha); GetRGBAColor(textureName, red, green, blue, alpha);
FUN_100a9170(red, green, blue, alpha); SetLodColor(red, green, blue, alpha);
} }
} }
@ -481,7 +481,7 @@ LegoResult LegoROI::SetFrame(LegoAnim* p_anim, LegoTime p_time)
// FUNCTION: LEGO1 0x100a9170 // FUNCTION: LEGO1 0x100a9170
// FUNCTION: BETA10 0x1018ae09 // FUNCTION: BETA10 0x1018ae09
LegoResult LegoROI::FUN_100a9170(LegoFloat p_red, LegoFloat p_green, LegoFloat p_blue, LegoFloat p_alpha) LegoResult LegoROI::SetLodColor(LegoFloat p_red, LegoFloat p_green, LegoFloat p_blue, LegoFloat p_alpha)
{ {
LegoResult result = SUCCESS; LegoResult result = SUCCESS;
CompoundObject::iterator it; CompoundObject::iterator it;
@ -490,14 +490,14 @@ LegoResult LegoROI::FUN_100a9170(LegoFloat p_red, LegoFloat p_green, LegoFloat p
for (LegoU32 i = 0; i < lodCount; i++) { for (LegoU32 i = 0; i < lodCount; i++) {
LegoLOD* lod = (LegoLOD*) GetLOD(i); LegoLOD* lod = (LegoLOD*) GetLOD(i);
if (lod->FUN_100aacb0(p_red, p_green, p_blue, p_alpha) != SUCCESS) { if (lod->SetColor(p_red, p_green, p_blue, p_alpha) != SUCCESS) {
result = FAILURE; result = FAILURE;
} }
} }
if (comp != NULL) { if (comp != NULL) {
for (it = comp->begin(); it != comp->end(); it++) { for (it = comp->begin(); it != comp->end(); it++) {
if (((LegoROI*) *it)->FUN_100a9170(p_red, p_green, p_blue, p_alpha) != SUCCESS) { if (((LegoROI*) *it)->SetLodColor(p_red, p_green, p_blue, p_alpha) != SUCCESS) {
result = FAILURE; result = FAILURE;
} }
} }
@ -507,7 +507,7 @@ LegoResult LegoROI::FUN_100a9170(LegoFloat p_red, LegoFloat p_green, LegoFloat p
} }
// FUNCTION: LEGO1 0x100a9210 // FUNCTION: LEGO1 0x100a9210
LegoResult LegoROI::FUN_100a9210(LegoTextureInfo* p_textureInfo) LegoResult LegoROI::SetTextureInfo(LegoTextureInfo* p_textureInfo)
{ {
LegoResult result = SUCCESS; LegoResult result = SUCCESS;
CompoundObject::iterator it; CompoundObject::iterator it;
@ -516,14 +516,14 @@ LegoResult LegoROI::FUN_100a9210(LegoTextureInfo* p_textureInfo)
for (LegoU32 i = 0; i < lodCount; i++) { for (LegoU32 i = 0; i < lodCount; i++) {
LegoLOD* lod = (LegoLOD*) GetLOD(i); LegoLOD* lod = (LegoLOD*) GetLOD(i);
if (lod->FUN_100aad00(p_textureInfo) != SUCCESS) { if (lod->SetTextureInfo(p_textureInfo) != SUCCESS) {
result = FAILURE; result = FAILURE;
} }
} }
if (comp != NULL) { if (comp != NULL) {
for (it = comp->begin(); it != comp->end(); it++) { for (it = comp->begin(); it != comp->end(); it++) {
if (((LegoROI*) *it)->FUN_100a9210(p_textureInfo) != SUCCESS) { if (((LegoROI*) *it)->SetTextureInfo(p_textureInfo) != SUCCESS) {
result = FAILURE; result = FAILURE;
} }
} }
@ -534,7 +534,7 @@ LegoResult LegoROI::FUN_100a9210(LegoTextureInfo* p_textureInfo)
// FUNCTION: LEGO1 0x100a92a0 // FUNCTION: LEGO1 0x100a92a0
// FUNCTION: BETA10 0x1018b12d // FUNCTION: BETA10 0x1018b12d
LegoResult LegoROI::GetTexture(LegoTextureInfo*& p_textureInfo) LegoResult LegoROI::GetTextureInfo(LegoTextureInfo*& p_textureInfo)
{ {
CompoundObject::iterator it; CompoundObject::iterator it;
@ -542,14 +542,14 @@ LegoResult LegoROI::GetTexture(LegoTextureInfo*& p_textureInfo)
for (LegoU32 i = 0; i < lodCount; i++) { for (LegoU32 i = 0; i < lodCount; i++) {
LegoLOD* lod = (LegoLOD*) GetLOD(i); LegoLOD* lod = (LegoLOD*) GetLOD(i);
if (lod->GetTexture(p_textureInfo) == SUCCESS) { if (lod->GetTextureInfo(p_textureInfo) == SUCCESS) {
return SUCCESS; return SUCCESS;
} }
} }
if (comp != NULL) { if (comp != NULL) {
for (it = comp->begin(); it != comp->end(); it++) { for (it = comp->begin(); it != comp->end(); it++) {
if (((LegoROI*) *it)->GetTexture(p_textureInfo) == SUCCESS) { if (((LegoROI*) *it)->GetTextureInfo(p_textureInfo) == SUCCESS) {
return SUCCESS; return SUCCESS;
} }
} }
@ -562,16 +562,16 @@ LegoResult LegoROI::GetTexture(LegoTextureInfo*& p_textureInfo)
// FUNCTION: BETA10 0x1018b22c // FUNCTION: BETA10 0x1018b22c
LegoResult LegoROI::FUN_100a9330(LegoFloat p_red, LegoFloat p_green, LegoFloat p_blue, LegoFloat p_alpha) LegoResult LegoROI::FUN_100a9330(LegoFloat p_red, LegoFloat p_green, LegoFloat p_blue, LegoFloat p_alpha)
{ {
return FUN_100a9170(p_red, p_green, p_blue, p_alpha); return SetLodColor(p_red, p_green, p_blue, p_alpha);
} }
// FUNCTION: LEGO1 0x100a9350 // FUNCTION: LEGO1 0x100a9350
// FUNCTION: BETA10 0x1018b25c // FUNCTION: BETA10 0x1018b25c
LegoResult LegoROI::FUN_100a9350(const LegoChar* p_color) LegoResult LegoROI::SetLodColor(const LegoChar* p_name)
{ {
MxFloat red, green, blue, alpha; MxFloat red, green, blue, alpha;
if (ColorAliasLookup(p_color, red, green, blue, alpha)) { if (ColorAliasLookup(p_name, red, green, blue, alpha)) {
return FUN_100a9170(red, green, blue, alpha); return SetLodColor(red, green, blue, alpha);
} }
return SUCCESS; return SUCCESS;
@ -579,10 +579,10 @@ LegoResult LegoROI::FUN_100a9350(const LegoChar* p_color)
// FUNCTION: LEGO1 0x100a93b0 // FUNCTION: LEGO1 0x100a93b0
// FUNCTION: BETA10 0x1018b2c0 // FUNCTION: BETA10 0x1018b2c0
LegoResult LegoROI::FUN_100a93b0(const LegoChar* p_color) LegoResult LegoROI::FUN_100a93b0(const LegoChar* p_name)
{ {
MxFloat red, green, blue, alpha; MxFloat red, green, blue, alpha;
if (ColorAliasLookup(p_color, red, green, blue, alpha)) { if (ColorAliasLookup(p_name, red, green, blue, alpha)) {
return FUN_100a9330(red, green, blue, alpha); return FUN_100a9330(red, green, blue, alpha);
} }
@ -755,20 +755,20 @@ void TimeROI::FUN_100a9b40(Matrix4& p_matrix, LegoTime p_time)
} }
// FUNCTION: LEGO1 0x100a9bf0 // FUNCTION: LEGO1 0x100a9bf0
LegoBool LegoROI::FUN_100a9bf0(const LegoChar* p_param, float& p_red, float& p_green, float& p_blue, float& p_alpha) LegoBool LegoROI::GetRGBAColor(const LegoChar* p_name, float& p_red, float& p_green, float& p_blue, float& p_alpha)
{ {
if (p_param == NULL) { if (p_name == NULL) {
return FALSE; return FALSE;
} }
if (g_unk0x101013ac) { char p_updatedName[32];
char buf[32]; if (g_colorOverride) {
if (g_unk0x101013ac(p_param, buf, sizeof(buf))) { if (g_colorOverride(p_name, p_updatedName, sizeof(p_updatedName))) {
p_param = buf; p_name = p_updatedName;
} }
} }
return ColorAliasLookup(p_param, p_red, p_green, p_blue, p_alpha); return ColorAliasLookup(p_name, p_red, p_green, p_blue, p_alpha);
} }
// FUNCTION: LEGO1 0x100a9c50 // FUNCTION: LEGO1 0x100a9c50
@ -789,14 +789,15 @@ LegoBool LegoROI::ColorAliasLookup(const LegoChar* p_param, float& p_red, float&
} }
// FUNCTION: LEGO1 0x100a9cf0 // FUNCTION: LEGO1 0x100a9cf0
LegoBool LegoROI::FUN_100a9cf0(const LegoChar* p_param, unsigned char* paletteEntries, LegoU32 p_numEntries) LegoBool LegoROI::GetPaletteEntries(const LegoChar* p_name, unsigned char* paletteEntries, LegoU32 p_numEntries)
{ {
if (p_param == NULL) { if (p_name == NULL) {
return FALSE; return FALSE;
} }
if (g_unk0x101013b0 != NULL) { // Note: g_textureHandler is never set in the code base
return g_unk0x101013b0(p_param, paletteEntries, p_numEntries); if (g_textureHandler != NULL) {
return g_textureHandler(p_name, paletteEntries, p_numEntries);
} }
paletteEntries[0] = '\0'; paletteEntries[0] = '\0';
@ -804,9 +805,9 @@ LegoBool LegoROI::FUN_100a9cf0(const LegoChar* p_param, unsigned char* paletteEn
} }
// FUNCTION: LEGO1 0x100a9d30 // FUNCTION: LEGO1 0x100a9d30
void LegoROI::FUN_100a9d30(ROIHandler p_func) void LegoROI::SetColorOverride(ColorOverride p_colorOverride)
{ {
g_unk0x101013ac = p_func; g_colorOverride = p_colorOverride;
} }
// FUNCTION: LEGO1 0x100a9d40 // FUNCTION: LEGO1 0x100a9d40
@ -828,12 +829,12 @@ void LegoROI::SetName(const LegoChar* p_name)
// FUNCTION: LEGO1 0x100a9dd0 // FUNCTION: LEGO1 0x100a9dd0
// FUNCTION: BETA10 0x1018bfdb // FUNCTION: BETA10 0x1018bfdb
void LegoROI::FUN_100a9dd0() void LegoROI::ClearMeshOffset()
{ {
int lodCount = GetLODCount(); int lodCount = GetLODCount();
for (LegoS32 i = 0; i < lodCount; i++) { for (LegoS32 i = 0; i < lodCount; i++) {
LegoLOD* lod = (LegoLOD*) GetLOD(i); LegoLOD* lod = (LegoLOD*) GetLOD(i);
lod->FUN_100aae60(); lod->ClearMeshOffset();
} }
} }

View File

@ -4,7 +4,7 @@
#include "misc/legotypes.h" #include "misc/legotypes.h"
#include "viewmanager/viewroi.h" #include "viewmanager/viewroi.h"
typedef unsigned char (*ROIHandler)(const char*, char*, unsigned int); typedef unsigned char (*ColorOverride)(const char*, char*, unsigned int);
typedef unsigned char (*TextureHandler)(const char*, unsigned char*, unsigned int); typedef unsigned char (*TextureHandler)(const char*, unsigned char*, unsigned int);
class LegoEntity; class LegoEntity;
@ -36,26 +36,26 @@ public:
static void FUN_100a8e80(LegoTreeNode* p_node, Matrix4& p_matrix, LegoTime p_time, LegoROI** p_roiMap); static void FUN_100a8e80(LegoTreeNode* p_node, Matrix4& p_matrix, LegoTime p_time, LegoROI** p_roiMap);
static void FUN_100a8fd0(LegoTreeNode* p_node, Matrix4& p_matrix, LegoTime p_time, LegoROI** p_roiMap); static void FUN_100a8fd0(LegoTreeNode* p_node, Matrix4& p_matrix, LegoTime p_time, LegoROI** p_roiMap);
LegoResult SetFrame(LegoAnim* p_anim, LegoTime p_time); LegoResult SetFrame(LegoAnim* p_anim, LegoTime p_time);
LegoResult FUN_100a9170(LegoFloat p_red, LegoFloat p_green, LegoFloat p_blue, LegoFloat p_alpha); LegoResult SetLodColor(LegoFloat p_red, LegoFloat p_green, LegoFloat p_blue, LegoFloat p_alpha);
LegoResult FUN_100a9210(LegoTextureInfo* p_textureInfo); LegoResult SetTextureInfo(LegoTextureInfo* p_textureInfo);
LegoResult GetTexture(LegoTextureInfo*& p_textureInfo); LegoResult GetTextureInfo(LegoTextureInfo*& p_textureInfo);
LegoResult FUN_100a9330(LegoFloat p_red, LegoFloat p_green, LegoFloat p_blue, LegoFloat p_alpha); LegoResult FUN_100a9330(LegoFloat p_red, LegoFloat p_green, LegoFloat p_blue, LegoFloat p_alpha);
LegoResult FUN_100a9350(const LegoChar* p_color); LegoResult SetLodColor(const LegoChar* p_name);
LegoResult FUN_100a93b0(const LegoChar* p_color); LegoResult FUN_100a93b0(const LegoChar* p_name);
LegoU32 FUN_100a9410(Vector3& p_v1, Vector3& p_v2, float p_f1, float p_f2, Vector3& p_v3, LegoBool p_collideBox); LegoU32 FUN_100a9410(Vector3& p_v1, Vector3& p_v2, float p_f1, float p_f2, Vector3& p_v3, LegoBool p_collideBox);
void SetName(const LegoChar* p_name); void SetName(const LegoChar* p_name);
float IntrinsicImportance() const override; // vtable+0x04 float IntrinsicImportance() const override; // vtable+0x04
void UpdateWorldBoundingVolumes() override; // vtable+0x18 void UpdateWorldBoundingVolumes() override; // vtable+0x18
void FUN_100a9dd0(); void ClearMeshOffset();
void SetDisplayBB(int p_displayBB); void SetDisplayBB(int p_displayBB);
static LegoResult FUN_100a8cb0(LegoAnimNodeData* p_data, LegoTime p_time, Matrix4& p_matrix); static LegoResult FUN_100a8cb0(LegoAnimNodeData* p_data, LegoTime p_time, Matrix4& p_matrix);
static void FUN_100a81b0(const LegoChar* p_error, const LegoChar* p_name); static void FUN_100a81b0(const LegoChar* p_error, const LegoChar* p_name);
static void configureLegoROI(int p_roi); static void configureLegoROI(int p_roi);
static void FUN_100a9d30(ROIHandler p_func); static void SetColorOverride(ColorOverride p_colorOverride);
static LegoBool FUN_100a9bf0(const LegoChar* p_param, float& p_red, float& p_green, float& p_blue, float& p_alpha); static LegoBool GetRGBAColor(const LegoChar* p_name, float& p_red, float& p_green, float& p_blue, float& p_alpha);
static LegoBool ColorAliasLookup( static LegoBool ColorAliasLookup(
const LegoChar* p_param, const LegoChar* p_param,
float& p_red, float& p_red,
@ -63,7 +63,7 @@ public:
float& p_blue, float& p_blue,
float& p_alpha float& p_alpha
); );
static LegoBool FUN_100a9cf0(const LegoChar* p_param, unsigned char* paletteEntries, LegoU32 p_numEntries); static LegoBool GetPaletteEntries(const LegoChar* p_name, unsigned char* paletteEntries, LegoU32 p_numEntries);
// FUNCTION: BETA10 0x1000f320 // FUNCTION: BETA10 0x1000f320
const LegoChar* GetName() const { return m_name; } const LegoChar* GetName() const { return m_name; }