This commit is contained in:
jonschz 2026-01-05 13:07:44 +01:00
parent bfd7e3d9f0
commit 71be68d144
2 changed files with 52 additions and 58 deletions

View File

@ -14,7 +14,7 @@ DECOMP_SIZE_ASSERT(LegoLOD::Mesh, 0x08)
// GLOBAL: LEGO1 0x101013d4 // GLOBAL: LEGO1 0x101013d4
// GLOBAL: BETA10 0x10207230 // GLOBAL: BETA10 0x10207230
LPDIRECT3DRMMATERIAL g_unk0x101013d4 = NULL; LPDIRECT3DRMMATERIAL g_lodMaterial = NULL;
// GLOBAL: LEGO1 0x101013dc // GLOBAL: LEGO1 0x101013dc
// GLOBAL: BETA10 0x10207238 // GLOBAL: BETA10 0x10207238
@ -31,16 +31,16 @@ inline BOOL GetMeshData(IDirect3DRMMesh** mesh, D3DRMGROUPINDEX* index, Tgl::Mes
// FUNCTION: BETA10 0x1018ce90 // FUNCTION: BETA10 0x1018ce90
LegoLOD::LegoLOD(Tgl::Renderer* p_renderer) : ViewLOD(p_renderer) LegoLOD::LegoLOD(Tgl::Renderer* p_renderer) : ViewLOD(p_renderer)
{ {
if (g_unk0x101013d4 == NULL) { if (g_lodMaterial == NULL) {
#ifdef BETA10 #ifdef BETA10
IDirect3DRM2* d3drm = NULL; IDirect3DRM2* d3drm = NULL;
assert((p_renderer != NULL)); assert((p_renderer != NULL));
GetD3DRM_legolod(d3drm, p_renderer); GetD3DRM_legolod(d3drm, p_renderer);
if (d3drm->CreateMaterial(10.0, &g_unk0x101013d4)) { if (d3drm->CreateMaterial(10.0, &g_lodMaterial)) {
assert(0); assert(0);
} }
#else #else
GetD3DRM_legolod(p_renderer)->CreateMaterial(10.0, &g_unk0x101013d4); GetD3DRM_legolod(p_renderer)->CreateMaterial(10.0, &g_lodMaterial);
#endif #endif
} }
@ -69,16 +69,8 @@ LegoLOD::~LegoLOD()
} }
} }
// TODO: Consider moving somewhere else and refactor other code;
// alternative: AssertIfBeta10(0), more versatile
#ifdef BETA10 #ifdef BETA10
#define Assert0IfBeta10() assert(0) /// This class does not exist in LEGO1.
#else
#define Assert0IfBeta10()
#endif
#ifdef BETA10
/// This class does not appear to exist in LEGO1.
class UnknownBeta0x1018e7e0 { class UnknownBeta0x1018e7e0 {
public: public:
// FUNCTION: BETA10 0x1018e7e0 // FUNCTION: BETA10 0x1018e7e0
@ -119,7 +111,7 @@ LegoResult LegoLOD::Read(Tgl::Renderer* p_renderer, LegoTextureContainer* p_text
LegoS32 numVerts = 0; LegoS32 numVerts = 0;
LegoS32 numNormals = 0; LegoS32 numNormals = 0;
LegoS32 numTextureVertices = 0; LegoS32 numTextureVertices = 0;
LegoMesh* mesh = NULL; LegoMesh* legoMesh = NULL;
LegoU32(*polyIndices)[3] = NULL; LegoU32(*polyIndices)[3] = NULL;
LegoU32(*textureIndices)[3] = NULL; LegoU32(*textureIndices)[3] = NULL;
LegoTextureInfo* textureInfo = NULL; LegoTextureInfo* textureInfo = NULL;
@ -127,7 +119,7 @@ LegoResult LegoLOD::Read(Tgl::Renderer* p_renderer, LegoTextureContainer* p_text
LegoU32 numPolys, numVertices, numTextureIndices, meshIndex; LegoU32 numPolys, numVertices, numTextureIndices, meshIndex;
LegoU32 i, indexBackwards, indexForwards, tempNumVertsAndNormals; LegoU32 i, indexBackwards, indexForwards, tempNumVertsAndNormals;
LegoFloat red, green, blue, alpha; LegoFloat red, green, blue, alpha;
IDirect3DRMMesh* mesh2; IDirect3DRMMesh* d3dmesh;
D3DRMGROUPINDEX index; D3DRMGROUPINDEX index;
unsigned char paletteEntries[256]; unsigned char paletteEntries[256];
@ -172,7 +164,7 @@ LegoResult LegoLOD::Read(Tgl::Renderer* p_renderer, LegoTextureContainer* p_text
indexForwards = 0; indexForwards = 0;
if (p_storage->Read(&tempNumVertsAndNormals, sizeof(LegoU32)) != SUCCESS) { if (p_storage->Read(&tempNumVertsAndNormals, sizeof(LegoU32)) != SUCCESS) {
Assert0IfBeta10(); assertIfBeta10(0);
goto done; goto done;
} }
@ -181,7 +173,7 @@ LegoResult LegoLOD::Read(Tgl::Renderer* p_renderer, LegoTextureContainer* p_text
numNormals = (*((LegoU16*) &tempNumVertsAndNormals + 1) >> 1) & MAXSHORT; numNormals = (*((LegoU16*) &tempNumVertsAndNormals + 1) >> 1) & MAXSHORT;
if (p_storage->Read(&numTextureVertices, sizeof(LegoS32)) != SUCCESS) { if (p_storage->Read(&numTextureVertices, sizeof(LegoS32)) != SUCCESS) {
Assert0IfBeta10(); assertIfBeta10(0);
goto done; goto done;
} }
@ -189,7 +181,7 @@ LegoResult LegoLOD::Read(Tgl::Renderer* p_renderer, LegoTextureContainer* p_text
vertices = new float[numVerts][sizeOfArray(*vertices)]; vertices = new float[numVerts][sizeOfArray(*vertices)];
if (p_storage->Read(vertices, numVerts * 3 * sizeof(float)) != SUCCESS) { if (p_storage->Read(vertices, numVerts * 3 * sizeof(float)) != SUCCESS) {
// LINE: BETA10 0x1018d443 // LINE: BETA10 0x1018d443
Assert0IfBeta10(); assertIfBeta10(0);
goto done; goto done;
} }
} }
@ -197,8 +189,7 @@ LegoResult LegoLOD::Read(Tgl::Renderer* p_renderer, LegoTextureContainer* p_text
if (numNormals > 0) { if (numNormals > 0) {
normals = new float[numNormals][sizeOfArray(*normals)]; normals = new float[numNormals][sizeOfArray(*normals)];
if (p_storage->Read(normals, numNormals * 3 * sizeof(float)) != SUCCESS) { if (p_storage->Read(normals, numNormals * 3 * sizeof(float)) != SUCCESS) {
// LINE: BETA10 assertIfBeta10(0);
Assert0IfBeta10();
goto done; goto done;
} }
} }
@ -207,7 +198,7 @@ LegoResult LegoLOD::Read(Tgl::Renderer* p_renderer, LegoTextureContainer* p_text
textureVertices = new float[numTextureVertices][sizeOfArray(*textureVertices)]; textureVertices = new float[numTextureVertices][sizeOfArray(*textureVertices)];
if (p_storage->Read(textureVertices, numTextureVertices * 2 * sizeof(float)) != SUCCESS) { if (p_storage->Read(textureVertices, numTextureVertices * 2 * sizeof(float)) != SUCCESS) {
// LINE: BETA10 0x1018d513 // LINE: BETA10 0x1018d513
Assert0IfBeta10(); assertIfBeta10(0);
goto done; goto done;
} }
} }
@ -218,37 +209,32 @@ LegoResult LegoLOD::Read(Tgl::Renderer* p_renderer, LegoTextureContainer* p_text
Tgl::ShadingModel shadingModel; Tgl::ShadingModel shadingModel;
if (p_storage->Read(&numPolys, 2) != SUCCESS) { if (p_storage->Read(&numPolys, 2) != SUCCESS) {
// LINE: BETA10 assertIfBeta10(0);
Assert0IfBeta10();
goto done; goto done;
} }
m_numPolys += numPolys & USHRT_MAX; m_numPolys += numPolys & USHRT_MAX;
if (p_storage->Read(&numVertices, 2) != SUCCESS) { if (p_storage->Read(&numVertices, 2) != SUCCESS) {
// LINE: BETA10 assertIfBeta10(0);
Assert0IfBeta10();
goto done; goto done;
} }
polyIndices = new LegoU32[numPolys & USHRT_MAX][sizeOfArray(*polyIndices)]; polyIndices = new LegoU32[numPolys & USHRT_MAX][sizeOfArray(*polyIndices)];
if (p_storage->Read(polyIndices, (numPolys & USHRT_MAX) * 3 * sizeof(LegoU32)) != SUCCESS) { if (p_storage->Read(polyIndices, (numPolys & USHRT_MAX) * 3 * sizeof(LegoU32)) != SUCCESS) {
// LINE: BETA10 assertIfBeta10(0);
Assert0IfBeta10();
goto done; goto done;
} }
if (p_storage->Read(&numTextureIndices, sizeof(numTextureIndices)) != SUCCESS) { if (p_storage->Read(&numTextureIndices, sizeof(numTextureIndices)) != SUCCESS) {
// LINE: BETA10 assertIfBeta10(0);
Assert0IfBeta10();
goto done; goto done;
} }
if (numTextureIndices > 0) { if (numTextureIndices > 0) {
textureIndices = new LegoU32[numPolys & USHRT_MAX][sizeOfArray(*textureIndices)]; textureIndices = new LegoU32[numPolys & USHRT_MAX][sizeOfArray(*textureIndices)];
if (p_storage->Read(textureIndices, (numPolys & USHRT_MAX) * 3 * sizeof(LegoU32)) != SUCCESS) { if (p_storage->Read(textureIndices, (numPolys & USHRT_MAX) * 3 * sizeof(LegoU32)) != SUCCESS) {
// LINE: BETA10 assertIfBeta10(0);
Assert0IfBeta10();
goto done; goto done;
} }
} }
@ -256,14 +242,14 @@ LegoResult LegoLOD::Read(Tgl::Renderer* p_renderer, LegoTextureContainer* p_text
textureIndices = NULL; textureIndices = NULL;
} }
mesh = new LegoMesh(); legoMesh = new LegoMesh();
if (mesh->Read(p_storage) != SUCCESS) { if (legoMesh->Read(p_storage) != SUCCESS) {
Assert0IfBeta10(); assertIfBeta10(0);
goto done; goto done;
} }
switch (mesh->GetShading()) { switch (legoMesh->GetShading()) {
case LegoMesh::e_flat: case LegoMesh::e_flat:
shadingModel = Tgl::Flat; shadingModel = Tgl::Flat;
break; break;
@ -276,8 +262,8 @@ LegoResult LegoLOD::Read(Tgl::Renderer* p_renderer, LegoTextureContainer* p_text
m_numVertices += numVertices & USHRT_MAX; m_numVertices += numVertices & USHRT_MAX;
textureName = mesh->GetTextureName(); textureName = legoMesh->GetTextureName();
materialName = mesh->GetMaterialName(); materialName = legoMesh->GetMaterialName();
if (HasInhPrefix(textureName) || HasInhPrefix(materialName)) { if (HasInhPrefix(textureName) || HasInhPrefix(materialName)) {
meshIndex = indexBackwards; meshIndex = indexBackwards;
@ -305,7 +291,7 @@ LegoResult LegoLOD::Read(Tgl::Renderer* p_renderer, LegoTextureContainer* p_text
); );
if (m_melems[meshIndex].m_tglMesh == NULL) { if (m_melems[meshIndex].m_tglMesh == NULL) {
Assert0IfBeta10(); assertIfBeta10(0);
goto done; goto done;
} }
@ -316,17 +302,17 @@ LegoResult LegoLOD::Read(Tgl::Renderer* p_renderer, LegoTextureContainer* p_text
// clang-format on // clang-format on
if (textureName != NULL) { if (textureName != NULL) {
if (mesh->GetUseAlias() && if (legoMesh->GetUseAlias() &&
LegoROI::GetPaletteEntries(textureName, paletteEntries, sizeOfArray(paletteEntries))) { LegoROI::GetPaletteEntries(textureName, paletteEntries, sizeOfArray(paletteEntries))) {
#ifdef BETA10 #ifdef BETA10
textureName = (const LegoChar*) paletteEntries; textureName = (const LegoChar*) paletteEntries;
#endif #endif
} }
textureInfo = p_textureContainer->Get(mesh->GetTextureName()); textureInfo = p_textureContainer->Get(legoMesh->GetTextureName());
if (textureInfo == NULL) { if (textureInfo == NULL) {
Assert0IfBeta10(); assertIfBeta10(0);
goto done; goto done;
} }
@ -335,13 +321,15 @@ LegoResult LegoLOD::Read(Tgl::Renderer* p_renderer, LegoTextureContainer* p_text
assert(Succeeded( tglResult )); assert(Succeeded( tglResult ));
// clang-format on // clang-format on
// TODO: Fix BETA10 call #ifdef BETA10
// This typecast is invalid, `textureInfo` had a different type in BETA10
LegoTextureInfo::SetGroupTexture(m_melems[meshIndex].m_tglMesh, textureInfo); tglResult = m_melems[meshIndex].m_tglMesh->SetTexture((TglImpl::TextureImpl*) textureInfo);
// clang-format off // clang-format off
assert(Succeeded( tglResult )); assert(Succeeded( tglResult ));
// clang-format on // clang-format on
#else
LegoTextureInfo::SetGroupTexture(m_melems[meshIndex].m_tglMesh, textureInfo);
#endif
m_melems[meshIndex].m_textured = TRUE; m_melems[meshIndex].m_textured = TRUE;
} }
@ -352,14 +340,14 @@ LegoResult LegoLOD::Read(Tgl::Renderer* p_renderer, LegoTextureContainer* p_text
blue = 1.0F; blue = 1.0F;
alpha = 0.0F; alpha = 0.0F;
if (mesh->GetUseAlias()) { if (legoMesh->GetUseAlias()) {
LegoROI::GetRGBAColor(materialName, red, green, blue, alpha); LegoROI::GetRGBAColor(materialName, red, green, blue, alpha);
} }
else { else {
red = mesh->GetColor().GetRed() / 255.0; red = legoMesh->GetColor().GetRed() / 255.0;
green = mesh->GetColor().GetGreen() / 255.0; green = legoMesh->GetColor().GetGreen() / 255.0;
blue = mesh->GetColor().GetBlue() / 255.0; blue = legoMesh->GetColor().GetBlue() / 255.0;
alpha = mesh->GetAlpha(); alpha = legoMesh->GetAlpha();
} }
tglResult = m_melems[meshIndex].m_tglMesh->SetColor(red, green, blue, alpha); tglResult = m_melems[meshIndex].m_tglMesh->SetColor(red, green, blue, alpha);
@ -369,14 +357,14 @@ LegoResult LegoLOD::Read(Tgl::Renderer* p_renderer, LegoTextureContainer* p_text
// clang-format on // clang-format on
} }
if (mesh->GetUnknown0x0d() > 0) { if (legoMesh->GetUnknown0x0d() > 0) {
GetMeshData(&mesh2, &index, m_melems[meshIndex].m_tglMesh); GetMeshData(&d3dmesh, &index, m_melems[meshIndex].m_tglMesh);
mesh2->SetGroupMaterial(index, g_unk0x101013d4); d3dmesh->SetGroupMaterial(index, g_lodMaterial);
} }
if (mesh != NULL) { if (legoMesh != NULL) {
delete mesh; delete legoMesh;
mesh = NULL; legoMesh = NULL;
} }
if (polyIndices != NULL) { if (polyIndices != NULL) {
delete[] polyIndices; delete[] polyIndices;
@ -413,8 +401,8 @@ LegoResult LegoLOD::Read(Tgl::Renderer* p_renderer, LegoTextureContainer* p_text
if (textureVertices != NULL) { if (textureVertices != NULL) {
delete[] textureVertices; delete[] textureVertices;
} }
if (mesh != NULL) { if (legoMesh != NULL) {
delete mesh; delete legoMesh;
} }
if (polyIndices != NULL) { if (polyIndices != NULL) {
delete[] polyIndices; delete[] polyIndices;

View File

@ -23,6 +23,12 @@
#define sizeOfArray(arr) (sizeof(arr) / sizeof(arr[0])) #define sizeOfArray(arr) (sizeof(arr) / sizeof(arr[0]))
#endif #endif
#ifdef BETA10
#define assertIfBeta10(A) assert(A)
#else
#define assertIfBeta10(A)
#endif
typedef unsigned char undefined; typedef unsigned char undefined;
typedef unsigned short undefined2; typedef unsigned short undefined2;
typedef unsigned int undefined4; typedef unsigned int undefined4;