diff --git a/apps/openmw/mwrender/actoranimation.cpp b/apps/openmw/mwrender/actoranimation.cpp index 91847afe4e..c238664ae5 100644 --- a/apps/openmw/mwrender/actoranimation.cpp +++ b/apps/openmw/mwrender/actoranimation.cpp @@ -58,13 +58,7 @@ ActorAnimation::ActorAnimation(const MWWorld::Ptr& ptr, osg::ref_ptr removeEffects(); } -ActorAnimation::~ActorAnimation() -{ - for (ItemLightMap::iterator iter = mItemLights.begin(); iter != mItemLights.end(); ++iter) - { - mInsert->removeChild(iter->second); - } -} +ActorAnimation::~ActorAnimation() = default; PartHolderPtr ActorAnimation::attachMesh(const std::string& model, const std::string& bonename, bool enchantedGlow, osg::Vec4f* glowColor) { @@ -594,4 +588,11 @@ void ActorAnimation::removeHiddenItemLight(const MWWorld::ConstPtr& item) mItemLights.erase(iter); } +void ActorAnimation::removeFromScene() +{ + for (const auto& [k, v] : mItemLights) + mInsert->removeChild(v); + Animation::removeFromScene(); +} + } diff --git a/apps/openmw/mwrender/actoranimation.hpp b/apps/openmw/mwrender/actoranimation.hpp index 1ece0c326d..41978eb785 100644 --- a/apps/openmw/mwrender/actoranimation.hpp +++ b/apps/openmw/mwrender/actoranimation.hpp @@ -40,6 +40,8 @@ class ActorAnimation : public Animation, public MWWorld::ContainerStoreListener bool useShieldAnimations() const override; bool updateCarriedLeftVisible(const int weaptype) const override; + void removeFromScene() override; + protected: osg::Group* getBoneByName(const std::string& boneName) const; virtual void updateHolsteredWeapon(bool showHolsteredWeapons); diff --git a/apps/openmw/mwrender/animation.cpp b/apps/openmw/mwrender/animation.cpp index 90417973e5..9a85aabeb2 100644 --- a/apps/openmw/mwrender/animation.cpp +++ b/apps/openmw/mwrender/animation.cpp @@ -527,13 +527,7 @@ namespace MWRender mLightListCallback = new SceneUtil::LightListCallback; } - Animation::~Animation() - { - Animation::setLightEffect(0.f); - - if (mObjectRoot) - mInsert->removeChild(mObjectRoot); - } + Animation::~Animation() = default; void Animation::setActive(int active) { @@ -1769,6 +1763,15 @@ namespace MWRender return mHeadYawRadians; } + void Animation::removeFromScene() + { + if (mGlowLight != nullptr) + mInsert->removeChild(mGlowLight); + + if (mObjectRoot != nullptr) + mInsert->removeChild(mObjectRoot); + } + // ------------------------------------------------------ float Animation::AnimationTime::getValue(osg::NodeVisitor*) diff --git a/apps/openmw/mwrender/animation.hpp b/apps/openmw/mwrender/animation.hpp index c1d36b35c4..d7c5749df7 100644 --- a/apps/openmw/mwrender/animation.hpp +++ b/apps/openmw/mwrender/animation.hpp @@ -497,6 +497,8 @@ public: virtual void setAccurateAiming(bool enabled) {} virtual bool canBeHarvested() const { return false; } + virtual void removeFromScene(); + private: Animation(const Animation&); void operator=(Animation&); diff --git a/apps/openmw/mwrender/objects.cpp b/apps/openmw/mwrender/objects.cpp index 9dc4e04e24..c241892987 100644 --- a/apps/openmw/mwrender/objects.cpp +++ b/apps/openmw/mwrender/objects.cpp @@ -115,6 +115,7 @@ bool Objects::removeObject (const MWWorld::Ptr& ptr) const auto iter = mObjects.find(ptr.mRef); if(iter != mObjects.end()) { + iter->second->removeFromScene(); mObjects.erase(iter); if (ptr.getClass().isActor()) @@ -148,7 +149,8 @@ void Objects::removeCell(const MWWorld::CellStore* store) ptr.getClass().getContainerStore(ptr).setContListener(nullptr); } - mObjects.erase(iter++); + iter->second->removeFromScene(); + iter = mObjects.erase(iter); } else ++iter;