diff --git a/src/model/CM2Model.cpp b/src/model/CM2Model.cpp index ab9a33d..c863d1d 100644 --- a/src/model/CM2Model.cpp +++ b/src/model/CM2Model.cpp @@ -86,21 +86,22 @@ CM2Model::~CM2Model() { // Unlink from lists - if (this->m_animatePrev) { - *this->m_animatePrev = this->m_animateNext; - } - if (this->m_animateNext) { - this->m_animateNext->m_animatePrev = this->m_animatePrev; - } - - if (this->m_drawPrev) { - *this->m_drawPrev = this->m_drawNext; - } - if (this->m_drawNext) { - this->m_drawNext->m_drawPrev = this->m_drawPrev; - } + this->UnlinkFromCallbackList(); + this->UnlinkFromAnimateList(); + this->UnlinkFromDrawList(); // TODO + + this->DetachFromScene(); + + // TODO + + this->UnlinkFromAttachList(); + + // TODO + + this->m_attachParent = nullptr; + this->m_currentLighting = nullptr; } void CM2Model::AddRef() { @@ -812,7 +813,22 @@ void CM2Model::DetachFromParent() { } void CM2Model::DetachFromScene() { + // Unlink from scene list + + if (this->m_scenePrev) { + *this->m_scenePrev = this->m_sceneNext; + } + + if (this->m_sceneNext) { + this->m_sceneNext->m_scenePrev = this->m_scenePrev; + } + + this->m_scenePrev = nullptr; + this->m_sceneNext = nullptr; + // TODO + + this->m_scene = nullptr; } void CM2Model::FindKey(M2ModelBoneSeq* sequence, const M2TrackBase& track, uint32_t& currentKey, uint32_t& nextKey, float& ratio) { @@ -1914,6 +1930,26 @@ void CM2Model::Sub826E60(uint32_t* a2, uint32_t* a3) { // TODO } +void CM2Model::UnlinkFromAnimateList() { + if (this->m_animatePrev) { + *this->m_animatePrev = this->m_animateNext; + } + + if (this->m_animateNext) { + this->m_animateNext->m_animatePrev = this->m_animatePrev; + } +} + +void CM2Model::UnlinkFromAttachList() { + if (this->m_attachPrev) { + *this->m_attachPrev = this->m_attachNext; + } + + if (this->m_attachNext) { + this->m_attachNext->m_attachPrev = this->m_attachPrev; + } +} + void CM2Model::UnlinkFromCallbackList() { if (this->m_callbackPrev) { *this->m_callbackPrev = this->m_callbackNext; @@ -1929,6 +1965,16 @@ void CM2Model::UnlinkFromCallbackList() { } } +void CM2Model::UnlinkFromDrawList() { + if (this->m_drawPrev) { + *this->m_drawPrev = this->m_drawNext; + } + + if (this->m_drawNext) { + this->m_drawNext->m_drawPrev = this->m_drawPrev; + } +} + void CM2Model::UnoptimizeVisibleGeometry() { // TODO } diff --git a/src/model/CM2Model.hpp b/src/model/CM2Model.hpp index 92434fe..792ce93 100644 --- a/src/model/CM2Model.hpp +++ b/src/model/CM2Model.hpp @@ -189,7 +189,10 @@ class CM2Model { void Sub826350(M2SequenceFallback& fallback, uint32_t sequenceId); int32_t Sub8269C0(uint32_t boneId, uint16_t boneIndex); void Sub826E60(uint32_t* a2, uint32_t* a3); + void UnlinkFromAnimateList(); + void UnlinkFromAttachList(); void UnlinkFromCallbackList(); + void UnlinkFromDrawList(); void UnoptimizeVisibleGeometry(); void UnsetBoneSequence(uint32_t boneId, int32_t a3, int32_t a4); void UpdateLoaded();