From 6a65a4cf5b6b10839254c0c5846ec2dbfea882f8 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Sat, 23 Jul 2016 02:14:30 +0300 Subject: Allow delete untracker being particle effects. This fix some possible memory leaks. --- src/particle/particle.cpp | 11 +++++++++++ src/particle/particle.h | 7 +++++++ src/particle/particlelist.cpp | 5 +++-- 3 files changed, 21 insertions(+), 2 deletions(-) (limited to 'src/particle') diff --git a/src/particle/particle.cpp b/src/particle/particle.cpp index 4e7b154c0..a04cee6f3 100644 --- a/src/particle/particle.cpp +++ b/src/particle/particle.cpp @@ -22,8 +22,11 @@ #include "particle/particle.h" +#include "actormanager.h" #include "logger.h" +#include "being/actorsprite.h" + #include "particle/animationparticle.h" #include "particle/particleemitter.h" #include "particle/rotationalparticle.h" @@ -61,6 +64,7 @@ Particle::Particle() : mType(ParticleType::Normal), mAnimation(nullptr), mImage(nullptr), + mActor(BeingId_zero), mChildEmitters(), mChildParticles(), mChildMoveParticles(), @@ -82,6 +86,13 @@ Particle::Particle() : Particle::~Particle() { + if (mActor != BeingId_zero && + actorManager) + { + ActorSprite *const actor = actorManager->findActor(mActor); + if (actor) + actor->controlParticleDeleted(this); + } // Delete child emitters and child particles clear(); delete2(mAnimation); diff --git a/src/particle/particle.h b/src/particle/particle.h index f1a8154b6..859a61505 100644 --- a/src/particle/particle.h +++ b/src/particle/particle.h @@ -28,6 +28,8 @@ #include "enums/particle/alivestatus.h" #include "enums/particle/particletype.h" +#include "enums/simpletypes/beingid.h" + #include "particle/particleengine.h" #include "localconsts.h" @@ -238,6 +240,9 @@ class Particle notfinal : public Actor const signed char conditions) restrict2 { mDeathEffect = effectFile; mDeathEffectConditions = conditions; } + void setActor(const BeingId actor) + { mActor = actor; } + protected: void updateSelf() restrict2; @@ -270,6 +275,8 @@ class Particle notfinal : public Actor /**< The image used for this particle. */ Image *restrict mImage; + BeingId mActor; + private: // List of child emitters. Emitters mChildEmitters; diff --git a/src/particle/particlelist.cpp b/src/particle/particlelist.cpp index 0d2a2f195..209ecfd32 100644 --- a/src/particle/particlelist.cpp +++ b/src/particle/particlelist.cpp @@ -44,8 +44,6 @@ void ParticleList::addLocally(Particle *const particle) { if (particle) { - // The effect may not die without the beings permission or we segfault - particle->disableAutoDelete(); mElements.push_back(particle); mSize ++; } @@ -74,7 +72,10 @@ void ParticleList::removeLocally(const Particle *const particle) void ParticleList::clearLocally() { FOR_EACH (ParticleListCIter, it, mElements) + { (*it)->kill(); + (*it)->prepareToDie(); + } mElements.clear(); mSize = 0U; -- cgit v1.2.3-70-g09d2