mirror of
https://github.com/isledecomp/isle.git
synced 2025-10-23 00:14:22 +00:00
Implement LegoCharacterManager::CreateROI (#709)
* WIP * Create globals * Add Read * Name Init * Add LegoCharacter init data * Add define for NULL * Use MxS8 * Add LegoCharacterLOD * WIP CreateROI * Fix * WIP * Match * Match * Match, implement Find * Fix MeshBuilder * Fix * space
This commit is contained in:

committed by
GitHub

parent
8cffa7cf8c
commit
68bb20f04f
@@ -28,7 +28,7 @@ LegoLOD::LegoLOD(Tgl::Renderer* p_renderer) : ViewLOD(p_renderer)
|
||||
GetD3DRM(p_renderer)->CreateMaterial(10.0, &g_unk0x101013d4);
|
||||
}
|
||||
|
||||
m_meshes = NULL;
|
||||
m_melems = NULL;
|
||||
m_numMeshes = 0;
|
||||
m_numVertices = 0;
|
||||
m_numPolys = 0;
|
||||
@@ -38,17 +38,17 @@ LegoLOD::LegoLOD(Tgl::Renderer* p_renderer) : ViewLOD(p_renderer)
|
||||
// FUNCTION: LEGO1 0x100aa450
|
||||
LegoLOD::~LegoLOD()
|
||||
{
|
||||
if (m_numMeshes && m_meshes != NULL) {
|
||||
if (m_numMeshes && m_melems != NULL) {
|
||||
for (LegoU32 i = 0; i < m_numMeshes; i++) {
|
||||
if (m_meshes[i].m_tglMesh != NULL) {
|
||||
delete m_meshes[i].m_tglMesh;
|
||||
m_meshes[i].m_tglMesh = NULL;
|
||||
if (m_melems[i].m_tglMesh != NULL) {
|
||||
delete m_melems[i].m_tglMesh;
|
||||
m_melems[i].m_tglMesh = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (m_meshes) {
|
||||
delete[] m_meshes;
|
||||
if (m_melems) {
|
||||
delete[] m_melems;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -90,8 +90,8 @@ LegoResult LegoLOD::Read(Tgl::Renderer* p_renderer, LegoTextureContainer* p_text
|
||||
|
||||
SetFlag(c_bit4);
|
||||
|
||||
m_meshes = new Mesh[m_numMeshes];
|
||||
memset(m_meshes, 0, sizeof(*m_meshes) * m_numMeshes);
|
||||
m_melems = new Mesh[m_numMeshes];
|
||||
memset(m_melems, 0, sizeof(*m_melems) * m_numMeshes);
|
||||
|
||||
meshUnd1 = m_numMeshes - 1;
|
||||
meshUnd2 = 0;
|
||||
@@ -193,7 +193,7 @@ LegoResult LegoLOD::Read(Tgl::Renderer* p_renderer, LegoTextureContainer* p_text
|
||||
meshUnd2++;
|
||||
}
|
||||
|
||||
m_meshes[meshIndex].m_tglMesh = m_meshBuilder->CreateMesh(
|
||||
m_melems[meshIndex].m_tglMesh = m_meshBuilder->CreateMesh(
|
||||
numPolys & MAXWORD,
|
||||
numVertices & MAXWORD,
|
||||
vertices,
|
||||
@@ -204,11 +204,11 @@ LegoResult LegoLOD::Read(Tgl::Renderer* p_renderer, LegoTextureContainer* p_text
|
||||
shadingModel
|
||||
);
|
||||
|
||||
if (m_meshes[meshIndex].m_tglMesh == NULL) {
|
||||
if (m_melems[meshIndex].m_tglMesh == NULL) {
|
||||
goto done;
|
||||
}
|
||||
|
||||
m_meshes[meshIndex].m_tglMesh->SetShadingModel(shadingModel);
|
||||
m_melems[meshIndex].m_tglMesh->SetShadingModel(shadingModel);
|
||||
|
||||
if (textureName != NULL) {
|
||||
if (mesh->GetUnknown0x21()) {
|
||||
@@ -221,9 +221,9 @@ LegoResult LegoLOD::Read(Tgl::Renderer* p_renderer, LegoTextureContainer* p_text
|
||||
goto done;
|
||||
}
|
||||
|
||||
m_meshes[meshIndex].m_tglMesh->SetColor(1.0F, 1.0F, 1.0F, 0.0F);
|
||||
LegoTextureInfo::SetGroupTexture(m_meshes[meshIndex].m_tglMesh, textureInfo);
|
||||
m_meshes[meshIndex].m_unk0x04 = TRUE;
|
||||
m_melems[meshIndex].m_tglMesh->SetColor(1.0F, 1.0F, 1.0F, 0.0F);
|
||||
LegoTextureInfo::SetGroupTexture(m_melems[meshIndex].m_tglMesh, textureInfo);
|
||||
m_melems[meshIndex].m_unk0x04 = TRUE;
|
||||
}
|
||||
else {
|
||||
LegoFloat red = 1.0F;
|
||||
@@ -241,13 +241,13 @@ LegoResult LegoLOD::Read(Tgl::Renderer* p_renderer, LegoTextureContainer* p_text
|
||||
alpha = mesh->GetAlpha();
|
||||
}
|
||||
|
||||
m_meshes[meshIndex].m_tglMesh->SetColor(red, green, blue, alpha);
|
||||
m_melems[meshIndex].m_tglMesh->SetColor(red, green, blue, alpha);
|
||||
}
|
||||
|
||||
if (mesh->GetUnknown0x0d() > 0) {
|
||||
IDirect3DRMMesh* mesh;
|
||||
D3DRMGROUPINDEX index;
|
||||
GetMeshData(mesh, index, m_meshes[meshIndex].m_tglMesh);
|
||||
GetMeshData(mesh, index, m_melems[meshIndex].m_tglMesh);
|
||||
mesh->SetGroupMaterial(index, g_unk0x101013d4);
|
||||
}
|
||||
|
||||
@@ -302,12 +302,34 @@ done:
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
// FUNCTION: LEGO1 0x100aabb0
|
||||
LegoLOD* LegoLOD::Clone(Tgl::Renderer* p_renderer)
|
||||
{
|
||||
LegoLOD* dupLod = new LegoLOD(p_renderer);
|
||||
|
||||
dupLod->m_meshBuilder = m_meshBuilder->Clone();
|
||||
dupLod->m_melems = new Mesh[m_numMeshes];
|
||||
|
||||
for (LegoU32 i = 0; i < m_numMeshes; i++) {
|
||||
dupLod->m_melems[i].m_tglMesh = m_melems[i].m_tglMesh->ShallowClone(dupLod->m_meshBuilder);
|
||||
dupLod->m_melems[i].m_unk0x04 = m_melems[i].m_unk0x04;
|
||||
}
|
||||
|
||||
dupLod->m_unk0x08 = m_unk0x08;
|
||||
dupLod->m_numMeshes = m_numMeshes;
|
||||
dupLod->m_numVertices = m_numVertices;
|
||||
dupLod->m_numPolys = m_numPolys;
|
||||
dupLod->m_unk0x1c = m_unk0x1c;
|
||||
|
||||
return dupLod;
|
||||
}
|
||||
|
||||
// FUNCTION: LEGO1 0x100aacb0
|
||||
LegoResult LegoLOD::FUN_100aacb0(LegoFloat p_red, LegoFloat p_green, LegoFloat p_blue, LegoFloat p_alpha)
|
||||
{
|
||||
for (LegoU32 i = m_unk0x1c; i < m_numMeshes; i++) {
|
||||
if (!m_meshes[i].m_unk0x04) {
|
||||
m_meshes[i].m_tglMesh->SetColor(p_red, p_green, p_blue, p_alpha);
|
||||
if (!m_melems[i].m_unk0x04) {
|
||||
m_melems[i].m_tglMesh->SetColor(p_red, p_green, p_blue, p_alpha);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -318,10 +340,10 @@ LegoResult LegoLOD::FUN_100aacb0(LegoFloat p_red, LegoFloat p_green, LegoFloat p
|
||||
LegoResult LegoLOD::FUN_100aad00(LegoTextureInfo* p_textureInfo)
|
||||
{
|
||||
for (LegoU32 i = m_unk0x1c; i < m_numMeshes; i++) {
|
||||
if (m_meshes[i].m_unk0x04) {
|
||||
LegoTextureInfo::SetGroupTexture(m_meshes[i].m_tglMesh, p_textureInfo);
|
||||
m_meshes[i].m_tglMesh->SetColor(1.0F, 1.0F, 1.0F, 0.0F);
|
||||
m_meshes[i].m_unk0x04 = TRUE;
|
||||
if (m_melems[i].m_unk0x04) {
|
||||
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_unk0x04 = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -27,7 +27,8 @@ public:
|
||||
// FUNCTION: LEGO1 0x100aae80
|
||||
float VTable0x10() override { return 0.0; } // vtable+0x10
|
||||
|
||||
LegoResult Read(Tgl::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);
|
||||
LegoResult FUN_100aacb0(LegoFloat p_red, LegoFloat p_green, LegoFloat p_blue, LegoFloat p_alpha);
|
||||
LegoResult FUN_100aad00(LegoTextureInfo* p_textureInfo);
|
||||
|
||||
@@ -37,7 +38,7 @@ public:
|
||||
// LegoLOD::`scalar deleting destructor'
|
||||
|
||||
protected:
|
||||
Mesh* m_meshes; // 0x0c
|
||||
Mesh* m_melems; // 0x0c
|
||||
LegoU32 m_numMeshes; // 0x10
|
||||
LegoU32 m_numVertices; // 0x14
|
||||
LegoU32 m_numPolys; // 0x18
|
||||
|
@@ -553,6 +553,23 @@ void LegoROI::FUN_100a9d30(ROIHandler p_func)
|
||||
g_unk0x101013ac = p_func;
|
||||
}
|
||||
|
||||
// FUNCTION: LEGO1 0x100a9d40
|
||||
void LegoROI::SetName(const LegoChar* p_name)
|
||||
{
|
||||
if (m_name != NULL) {
|
||||
delete[] m_name;
|
||||
}
|
||||
|
||||
if (p_name != NULL) {
|
||||
m_name = new LegoChar[strlen(p_name) + 1];
|
||||
strcpy(m_name, p_name);
|
||||
strlwr(m_name);
|
||||
}
|
||||
else {
|
||||
m_name = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
// FUNCTION: LEGO1 0x100a9e10
|
||||
void LegoROI::SetDisplayBB(int p_displayBB)
|
||||
{
|
||||
|
@@ -34,6 +34,7 @@ public:
|
||||
LegoResult SetFrame(LegoAnim* p_anim, LegoTime p_time);
|
||||
LegoResult FUN_100a9170(LegoFloat p_red, LegoFloat p_green, LegoFloat p_blue, LegoFloat p_alpha);
|
||||
LegoResult FUN_100a9210(LegoTextureInfo* p_textureInfo);
|
||||
void SetName(const LegoChar* p_name);
|
||||
|
||||
float IntrinsicImportance() const override; // vtable+0x04
|
||||
void UpdateWorldBoundingVolumes() override; // vtable+0x18
|
||||
@@ -58,6 +59,9 @@ public:
|
||||
inline LegoEntity* GetEntity() { return m_entity; }
|
||||
|
||||
inline void SetEntity(LegoEntity* p_entity) { m_entity = p_entity; }
|
||||
inline void SetComp(CompoundObject* p_comp) { comp = p_comp; }
|
||||
inline void SetBoundingSphere(const BoundingSphere& p_sphere) { m_sphere = m_world_bounding_sphere = p_sphere; }
|
||||
inline void SetUnknown0x80(const BoundingBox& p_unk0x80) { m_unk0x80 = p_unk0x80; }
|
||||
|
||||
// SYNTHETIC: LEGO1 0x100a82b0
|
||||
// LegoROI::`scalar deleting destructor'
|
||||
|
Reference in New Issue
Block a user