summaryrefslogtreecommitdiff
path: root/src/particle/particle.cpp
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2016-03-16 23:39:55 +0300
committerAndrei Karas <akaras@inbox.ru>2016-03-16 23:39:55 +0300
commit68151e88af407f5c45cd4fbf671c59645d8b4557 (patch)
tree5bb23c212922a53ad8d240b7e373b65a671ef629 /src/particle/particle.cpp
parent9a8e4dd9e99abff3b6e9b8351edd6bd1c009ed0e (diff)
downloadmv-68151e88af407f5c45cd4fbf671c59645d8b4557.tar.gz
mv-68151e88af407f5c45cd4fbf671c59645d8b4557.tar.bz2
mv-68151e88af407f5c45cd4fbf671c59645d8b4557.tar.xz
mv-68151e88af407f5c45cd4fbf671c59645d8b4557.zip
Improve performance in moving child particles.
Diffstat (limited to 'src/particle/particle.cpp')
-rw-r--r--src/particle/particle.cpp19
1 files changed, 15 insertions, 4 deletions
diff --git a/src/particle/particle.cpp b/src/particle/particle.cpp
index 0705c1ed1..94d5acd17 100644
--- a/src/particle/particle.cpp
+++ b/src/particle/particle.cpp
@@ -66,6 +66,7 @@ Particle::Particle() :
mImage(nullptr),
mChildEmitters(),
mChildParticles(),
+ mChildMoveParticles(),
mDeathEffect(),
mGravity(0.0F),
mBounce(0.0F),
@@ -213,6 +214,8 @@ void Particle::updateSelf() restrict2
Particle *const p = *it;
p->moveBy(mPos);
mChildParticles.push_back(p);
+ if (p->mFollow)
+ mChildMoveParticles.push_back(p);
}
}
}
@@ -305,15 +308,20 @@ bool Particle::update() restrict2
return true;
}
- // Update child particles
- for (ParticleIterator p = mChildParticles.begin(),
- fp2 = mChildParticles.end(); p != fp2; )
+ for (ParticleIterator p = mChildMoveParticles.begin(),
+ fp2 = mChildMoveParticles.end(); p != fp2; )
{
Particle *restrict const particle = *p;
// move particle with its parent if desired
if (particle->mFollow)
particle->moveBy(change);
+ }
+ // Update child particles
+ for (ParticleIterator p = mChildParticles.begin(),
+ fp2 = mChildParticles.end(); p != fp2; )
+ {
+ Particle *restrict const particle = *p;
// update particle
if (particle->update())
{
@@ -321,6 +329,7 @@ bool Particle::update() restrict2
}
else
{
+ mChildMoveParticles.remove(*p);
delete particle;
p = mChildParticles.erase(p);
}
@@ -338,7 +347,7 @@ bool Particle::update() restrict2
void Particle::moveBy(const Vector &restrict change) restrict2
{
mPos += change;
- FOR_EACH (ParticleConstIterator, p, mChildParticles)
+ FOR_EACH (ParticleConstIterator, p, mChildMoveParticles)
{
Particle *restrict const particle = *p;
if (particle->mFollow)
@@ -523,4 +532,6 @@ void Particle::clear() restrict2
delete_all(mChildParticles);
mChildParticles.clear();
+
+ mChildMoveParticles.clear();
}