mirror of
https://github.com/isledecomp/isle.git
synced 2026-01-11 18:51:16 +00:00
73 % beta match on LegoLOD::Read
This commit is contained in:
parent
36acc2463b
commit
c394e43cfa
@ -69,10 +69,50 @@ LegoLOD::~LegoLOD()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Consider moving somewhere else and refactor other code;
|
||||||
|
// alternative: AssertIfBeta10(0), more versatile
|
||||||
|
#ifdef BETA10
|
||||||
|
#define Assert0IfBeta10() assert(0)
|
||||||
|
#else
|
||||||
|
#define Assert0IfBeta10()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BETA10
|
||||||
|
/// This class does not appear to exist in LEGO1.
|
||||||
|
class UnknownBeta0x1018e7e0 {
|
||||||
|
public:
|
||||||
|
// FUNCTION: BETA10 0x1018e7e0
|
||||||
|
UnknownBeta0x1018e7e0()
|
||||||
|
{
|
||||||
|
m_unk0x00 = 0;
|
||||||
|
m_unk0x04 = 0;
|
||||||
|
m_unk0x08 = 0;
|
||||||
|
m_unk0x0c = 0;
|
||||||
|
m_unk0x10 = 0;
|
||||||
|
m_unk0x14 = 0;
|
||||||
|
m_unk0x18 = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// STUB: BETA10 0x1018e840
|
||||||
|
undefined4 BETA10_1018e840(LegoStorage* p_storage) { return 0; }
|
||||||
|
|
||||||
|
undefined4 m_unk0x00;
|
||||||
|
undefined4 m_unk0x04;
|
||||||
|
undefined4 m_unk0x08;
|
||||||
|
undefined4 m_unk0x0c;
|
||||||
|
undefined4 m_unk0x10;
|
||||||
|
undefined4 m_unk0x14;
|
||||||
|
undefined4 m_unk0x18;
|
||||||
|
undefined4 m_unk0x1c;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
// FUNCTION: LEGO1 0x100aa510
|
// FUNCTION: LEGO1 0x100aa510
|
||||||
// STUB: BETA10 0x1018d15d
|
// FUNCTION: BETA10 0x1018d15d
|
||||||
LegoResult LegoLOD::Read(Tgl::Renderer* p_renderer, LegoTextureContainer* p_textureContainer, LegoStorage* p_storage)
|
LegoResult LegoLOD::Read(Tgl::Renderer* p_renderer, LegoTextureContainer* p_textureContainer, LegoStorage* p_storage)
|
||||||
{
|
{
|
||||||
|
using Tgl::Succeeded;
|
||||||
|
|
||||||
float(*normals)[3] = NULL;
|
float(*normals)[3] = NULL;
|
||||||
float(*vertices)[3] = NULL;
|
float(*vertices)[3] = NULL;
|
||||||
float(*textureVertices)[2] = NULL;
|
float(*textureVertices)[2] = NULL;
|
||||||
@ -85,6 +125,8 @@ LegoResult LegoLOD::Read(Tgl::Renderer* p_renderer, LegoTextureContainer* p_text
|
|||||||
LegoTextureInfo* textureInfo = NULL;
|
LegoTextureInfo* textureInfo = NULL;
|
||||||
|
|
||||||
LegoU32 i, indexBackwards, indexForwards, tempNumVertsAndNormals;
|
LegoU32 i, indexBackwards, indexForwards, tempNumVertsAndNormals;
|
||||||
|
LegoU8 local4c = 0; // BETA10 only, only written, never read
|
||||||
|
|
||||||
unsigned char paletteEntries[256];
|
unsigned char paletteEntries[256];
|
||||||
|
|
||||||
if (p_storage->Read(&m_flags, sizeof(LegoU32)) != SUCCESS) {
|
if (p_storage->Read(&m_flags, sizeof(LegoU32)) != SUCCESS) {
|
||||||
@ -92,7 +134,15 @@ LegoResult LegoLOD::Read(Tgl::Renderer* p_renderer, LegoTextureContainer* p_text
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (SkipReadingData()) {
|
if (SkipReadingData()) {
|
||||||
|
#ifdef BETA10
|
||||||
|
// There was an additional field of the correct type here in BETA10
|
||||||
|
m_flags = (unsigned int) new UnknownBeta0x1018e7e0();
|
||||||
|
if (((UnknownBeta0x1018e7e0*) m_flags)->BETA10_1018e840(p_storage)) {
|
||||||
|
assert(0);
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
m_meshBuilder = p_renderer->CreateMeshBuilder();
|
m_meshBuilder = p_renderer->CreateMeshBuilder();
|
||||||
@ -102,11 +152,15 @@ LegoResult LegoLOD::Read(Tgl::Renderer* p_renderer, LegoTextureContainer* p_text
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (m_numMeshes == 0) {
|
if (m_numMeshes == 0) {
|
||||||
|
#ifndef BETA10
|
||||||
ClearFlag(c_hasMesh);
|
ClearFlag(c_hasMesh);
|
||||||
|
#endif
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef BETA10
|
||||||
SetFlag(c_hasMesh);
|
SetFlag(c_hasMesh);
|
||||||
|
#endif
|
||||||
|
|
||||||
m_melems = new Mesh[m_numMeshes];
|
m_melems = new Mesh[m_numMeshes];
|
||||||
memset(m_melems, 0, sizeof(*m_melems) * m_numMeshes);
|
memset(m_melems, 0, sizeof(*m_melems) * m_numMeshes);
|
||||||
@ -115,19 +169,24 @@ 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();
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Can't get this one right
|
||||||
numVerts = *((LegoU16*) &tempNumVertsAndNormals) & MAXSHORT;
|
numVerts = *((LegoU16*) &tempNumVertsAndNormals) & MAXSHORT;
|
||||||
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();
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (numVerts > 0) {
|
if (numVerts > 0) {
|
||||||
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
|
||||||
|
Assert0IfBeta10();
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -135,6 +194,8 @@ 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
|
||||||
|
Assert0IfBeta10();
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -142,37 +203,50 @@ LegoResult LegoLOD::Read(Tgl::Renderer* p_renderer, LegoTextureContainer* p_text
|
|||||||
if (numTextureVertices > 0) {
|
if (numTextureVertices > 0) {
|
||||||
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
|
||||||
|
Assert0IfBeta10();
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < m_numMeshes; i++) {
|
for (i = 0; i < m_numMeshes; i++) {
|
||||||
|
local4c = 0;
|
||||||
LegoU32 numPolys, numVertices, numTextureIndices, meshIndex;
|
LegoU32 numPolys, numVertices, numTextureIndices, meshIndex;
|
||||||
const LegoChar *textureName, *materialName;
|
const LegoChar *textureName, *materialName;
|
||||||
Tgl::ShadingModel shadingModel;
|
Tgl::ShadingModel shadingModel;
|
||||||
|
|
||||||
if (p_storage->Read(&numPolys, 2) != SUCCESS) {
|
if (p_storage->Read(&numPolys, 2) != SUCCESS) {
|
||||||
|
// LINE: BETA10
|
||||||
|
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
|
||||||
|
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
|
||||||
|
Assert0IfBeta10();
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p_storage->Read(&numTextureIndices, sizeof(numTextureIndices)) != SUCCESS) {
|
if (p_storage->Read(&numTextureIndices, sizeof(numTextureIndices)) != SUCCESS) {
|
||||||
|
// LINE: BETA10
|
||||||
|
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
|
||||||
|
Assert0IfBeta10();
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -183,6 +257,7 @@ LegoResult LegoLOD::Read(Tgl::Renderer* p_renderer, LegoTextureContainer* p_text
|
|||||||
mesh = new LegoMesh();
|
mesh = new LegoMesh();
|
||||||
|
|
||||||
if (mesh->Read(p_storage) != SUCCESS) {
|
if (mesh->Read(p_storage) != SUCCESS) {
|
||||||
|
Assert0IfBeta10();
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -207,11 +282,15 @@ LegoResult LegoLOD::Read(Tgl::Renderer* p_renderer, LegoTextureContainer* p_text
|
|||||||
indexBackwards--;
|
indexBackwards--;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
local4c = 1;
|
||||||
meshIndex = indexForwards;
|
meshIndex = indexForwards;
|
||||||
indexForwards++;
|
indexForwards++;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_melems[meshIndex].m_tglMesh = m_meshBuilder->CreateMesh(
|
Tgl::MeshBuilder* locMesh = m_meshBuilder;
|
||||||
|
assert(locMesh);
|
||||||
|
|
||||||
|
m_melems[meshIndex].m_tglMesh = locMesh->CreateMesh(
|
||||||
numPolys & USHRT_MAX,
|
numPolys & USHRT_MAX,
|
||||||
numVertices & USHRT_MAX,
|
numVertices & USHRT_MAX,
|
||||||
vertices,
|
vertices,
|
||||||
@ -223,24 +302,43 @@ 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();
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_melems[meshIndex].m_tglMesh->SetShadingModel(shadingModel);
|
Tgl::Result tglResult = m_melems[meshIndex].m_tglMesh->SetShadingModel(shadingModel);
|
||||||
|
|
||||||
|
// clang-format off
|
||||||
|
assert(Succeeded( tglResult ));
|
||||||
|
// clang-format on
|
||||||
|
|
||||||
if (textureName != NULL) {
|
if (textureName != NULL) {
|
||||||
if (mesh->GetUseAlias()) {
|
if (mesh->GetUseAlias() &&
|
||||||
LegoROI::GetPaletteEntries(textureName, paletteEntries, sizeOfArray(paletteEntries));
|
LegoROI::GetPaletteEntries(textureName, paletteEntries, sizeOfArray(paletteEntries))) {
|
||||||
|
// TODO: BETA10 only?
|
||||||
|
textureName = (const LegoChar*) paletteEntries;
|
||||||
}
|
}
|
||||||
|
|
||||||
textureInfo = p_textureContainer->Get(mesh->GetTextureName());
|
textureInfo = p_textureContainer->Get(mesh->GetTextureName());
|
||||||
|
|
||||||
if (textureInfo == NULL) {
|
if (textureInfo == NULL) {
|
||||||
|
Assert0IfBeta10();
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_melems[meshIndex].m_tglMesh->SetColor(1.0F, 1.0F, 1.0F, 0.0F);
|
tglResult = m_melems[meshIndex].m_tglMesh->SetColor(1.0F, 1.0F, 1.0F, 0.0F);
|
||||||
|
// clang-format off
|
||||||
|
assert(Succeeded( tglResult ));
|
||||||
|
// clang-format on
|
||||||
|
|
||||||
|
// TODO: Fix BETA10 call
|
||||||
|
|
||||||
LegoTextureInfo::SetGroupTexture(m_melems[meshIndex].m_tglMesh, textureInfo);
|
LegoTextureInfo::SetGroupTexture(m_melems[meshIndex].m_tglMesh, textureInfo);
|
||||||
|
|
||||||
|
// clang-format off
|
||||||
|
assert(Succeeded( tglResult ));
|
||||||
|
// clang-format on
|
||||||
|
|
||||||
m_melems[meshIndex].m_textured = TRUE;
|
m_melems[meshIndex].m_textured = TRUE;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -259,7 +357,11 @@ LegoResult LegoLOD::Read(Tgl::Renderer* p_renderer, LegoTextureContainer* p_text
|
|||||||
alpha = mesh->GetAlpha();
|
alpha = mesh->GetAlpha();
|
||||||
}
|
}
|
||||||
|
|
||||||
m_melems[meshIndex].m_tglMesh->SetColor(red, green, blue, alpha);
|
tglResult = m_melems[meshIndex].m_tglMesh->SetColor(red, green, blue, alpha);
|
||||||
|
// clang-format off
|
||||||
|
// LINE: BETA10 0x1018dc72
|
||||||
|
assert(Succeeded( tglResult ));
|
||||||
|
// clang-format on
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mesh->GetUnknown0x0d() > 0) {
|
if (mesh->GetUnknown0x0d() > 0) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user