Implement/match LegoCharacterManager::FUN_10085870 (#764)

This commit is contained in:
Christian Semmler 2024-04-02 08:04:17 -04:00 committed by GitHub
parent 60388c8c5d
commit 8225a38a01
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 43 additions and 6 deletions

View file

@ -11,6 +11,8 @@
#include "roi/legolod.h" #include "roi/legolod.h"
#include "roi/legoroi.h" #include "roi/legoroi.h"
#include <vec.h>
DECOMP_SIZE_ASSERT(LegoCharacter, 0x08) DECOMP_SIZE_ASSERT(LegoCharacter, 0x08)
DECOMP_SIZE_ASSERT(LegoCharacterManager, 0x08) DECOMP_SIZE_ASSERT(LegoCharacterManager, 0x08)
@ -554,11 +556,46 @@ LegoROI* LegoCharacterManager::FUN_10085210(const char* p_name, const char* p_lo
return roi; return roi;
} }
// STUB: LEGO1 0x10085870 // FUNCTION: LEGO1 0x10085870
MxResult LegoCharacterManager::FUN_10085870(LegoROI* p_roi) MxResult LegoCharacterManager::FUN_10085870(LegoROI* p_roi)
{ {
// TODO MxResult result = FAILURE;
return SUCCESS;
BoundingSphere boundingSphere;
BoundingBox boundingBox;
const Tgl::MeshBuilder* meshBuilder = ((ViewLOD*) p_roi->GetLOD(0))->GetMeshBuilder();
if (meshBuilder != NULL) {
float min[3], max[3];
FILLVEC3(min, 88888.0);
FILLVEC3(max, -88888.0);
meshBuilder->GetBoundingBox(min, max);
float center[3];
center[0] = (min[0] + max[0]) / 2.0f;
center[1] = (min[1] + max[1]) / 2.0f;
center[2] = (min[2] + max[2]) / 2.0f;
SET3(boundingSphere.Center(), center);
float radius[3];
VMV3(radius, max, min);
boundingSphere.Radius() = sqrt(NORMSQRD3(radius)) / 2.0;
p_roi->SetBoundingSphere(boundingSphere);
SET3(boundingBox.Min(), min);
SET3(boundingBox.Max(), max);
p_roi->SetUnknown0x80(boundingBox);
p_roi->VTable0x14();
result = SUCCESS;
}
return result;
} }
// FUNCTION: LEGO1 0x10085a80 // FUNCTION: LEGO1 0x10085a80

View file

@ -362,7 +362,7 @@ class MeshBuilderImpl : public MeshBuilder {
unsigned long (*pTextureIndices)[3], unsigned long (*pTextureIndices)[3],
ShadingModel shadingModel ShadingModel shadingModel
) override; ) override;
Result GetBoundingBox(float min[3], float max[3]) override; Result GetBoundingBox(float min[3], float max[3]) const override;
// vtable+0x10 // vtable+0x10
MeshBuilder* Clone() override; MeshBuilder* Clone() override;

View file

@ -159,7 +159,7 @@ inline Result MeshBuilderImpl::CreateMeshImpl(
} }
// FUNCTION: LEGO1 0x100a3ae0 // FUNCTION: LEGO1 0x100a3ae0
Result MeshBuilderImpl::GetBoundingBox(float min[3], float max[3]) Result MeshBuilderImpl::GetBoundingBox(float min[3], float max[3]) const
{ {
D3DRMBOX box; D3DRMBOX box;
Result result = ResultVal(m_data->GetBox(&box)); Result result = ResultVal(m_data->GetBox(&box));

View file

@ -330,7 +330,7 @@ class MeshBuilder : public Object {
unsigned long (*pTextureIndices)[3], unsigned long (*pTextureIndices)[3],
ShadingModel shadingModel ShadingModel shadingModel
) = 0; ) = 0;
virtual Result GetBoundingBox(float min[3], float max[3]) = 0; virtual Result GetBoundingBox(float min[3], float max[3]) const = 0;
virtual MeshBuilder* Clone() = 0; virtual MeshBuilder* Clone() = 0;
// SYNTHETIC: LEGO1 0x100a27b0 // SYNTHETIC: LEGO1 0x100a27b0