feat(model): implement more of CM2Model dtor

This commit is contained in:
fallenoak 2025-10-29 14:53:12 -05:00
parent 12a7752a57
commit de3215afc9
No known key found for this signature in database
GPG Key ID: 7628F8E61AEA070D
2 changed files with 73 additions and 1 deletions

View File

@ -94,6 +94,15 @@ CM2Model::~CM2Model() {
this->DetachFromScene(); this->DetachFromScene();
if (this->m_shared) {
// TODO
this->FreeInternalResources();
this->m_shared->Release();
this->m_shared = nullptr;
}
// TODO // TODO
this->UnlinkFromAttachList(); this->UnlinkFromAttachList();
@ -955,6 +964,65 @@ LABEL_36:
} }
} }
void CM2Model::FreeInternalResources() {
if (!this->m_internalResources) {
return;
}
if (this->m_bones) {
this->m_bones = nullptr;
}
if (this->m_loops) {
this->m_loops = nullptr;
}
if (this->m_skinSections) {
this->m_skinSections = nullptr;
}
if (this->m_colors) {
this->m_colors = nullptr;
}
if (this->m_textureWeights) {
this->m_textureWeights = nullptr;
}
// TODO
// if (this->m_textureTransforms) {
// this->m_textureTransforms = nullptr;
// }
if (this->m_attachments) {
this->m_attachments = nullptr;
}
if (this->m_lights) {
for (int32_t i = 0; i < this->m_shared->m_data->lights.Count(); i++) {
this->m_lights[i].light.~CM2Light();
}
this->m_lights = nullptr;
}
if (this->m_cameras) {
this->m_cameras = nullptr;
}
// TODO
// if (this->m_ribbons) {
// this->m_ribbons = nullptr;
// }
// TODO
// if (this->m_particles) {
// this->m_particles = nullptr;
// }
STORM_FREE(this->m_internalResources);
}
C44Matrix CM2Model::GetAttachmentWorldTransform(uint32_t id) { C44Matrix CM2Model::GetAttachmentWorldTransform(uint32_t id) {
if (!this->m_loaded) { if (!this->m_loaded) {
this->WaitForLoad("GetAttachmentWorldTransform"); this->WaitForLoad("GetAttachmentWorldTransform");

View File

@ -96,7 +96,10 @@ class CM2Model {
uint32_t uint74 = 0; uint32_t uint74 = 0;
float float88 = 0.0f; float float88 = 0.0f;
uint32_t uint90 = 0; uint32_t uint90 = 0;
M2ModelBone* m_bones = nullptr; union {
M2ModelBone* m_bones = nullptr;
void* m_internalResources;
};
C44Matrix* m_boneMatrices = nullptr; C44Matrix* m_boneMatrices = nullptr;
M2ModelColor* m_colors = nullptr; M2ModelColor* m_colors = nullptr;
uint32_t* m_skinSections = nullptr; uint32_t* m_skinSections = nullptr;
@ -159,6 +162,7 @@ class CM2Model {
void DetachFromParent(); void DetachFromParent();
void DetachFromScene(); void DetachFromScene();
void FindKey(M2ModelBoneSeq* sequence, const M2TrackBase& track, uint32_t& currentKey, uint32_t& nextKey, float& ratio); void FindKey(M2ModelBoneSeq* sequence, const M2TrackBase& track, uint32_t& currentKey, uint32_t& nextKey, float& ratio);
void FreeInternalResources();
C44Matrix GetAttachmentWorldTransform(uint32_t id); C44Matrix GetAttachmentWorldTransform(uint32_t id);
CAaBox& GetBoundingBox(CAaBox& bounds); CAaBox& GetBoundingBox(CAaBox& bounds);
HCAMERA GetCameraByIndex(uint32_t index); HCAMERA GetCameraByIndex(uint32_t index);