particles afectors upgrade and timer rework

This commit is contained in:
Henrique Santiago
2011-12-17 00:28:51 -02:00
parent a4eed64709
commit eed6fab4b1
8 changed files with 173 additions and 75 deletions

View File

@@ -68,8 +68,7 @@ void ParticleSystem::render()
void ParticleSystem::update()
{
float elapsedTime = g_clock.timeElapsed(m_lastUpdateTime);
m_lastUpdateTime = g_clock.time();
static const double delay = 0.0166; // 60 updates/s
// check if finished
if(m_particles.empty() && m_emitters.empty()) {
@@ -77,30 +76,50 @@ void ParticleSystem::update()
return;
}
// update emitters
for(auto it = m_emitters.begin(), end = m_emitters.end(); it != end;) {
const ParticleEmitterPtr& emitter = *it;
if(emitter->hasFinished()) {
it = m_emitters.erase(it);
continue;
}
emitter->update();
++it;
}
// check time
double elapsedTime = g_clock.timeElapsed(m_lastUpdateTime);
if(elapsedTime < delay)
return;
m_lastUpdateTime = g_clock.time() - std::fmod(elapsedTime, delay);
// update particles
for(auto it = m_particles.begin(), end = m_particles.end(); it != end;) {
const ParticlePtr& particle = *it;
if(particle->hasFinished()) {
it = m_particles.erase(it);
continue;
for(int i = 0; i < elapsedTime / delay; ++i) {
// update emitters
for(auto it = m_emitters.begin(), end = m_emitters.end(); it != end;) {
const ParticleEmitterPtr& emitter = *it;
if(emitter->hasFinished()) {
it = m_emitters.erase(it);
continue;
}
emitter->update(delay);
++it;
}
// pass particles through affectors
for(const ParticleAffectorPtr& particleAffector : m_affectors)
particleAffector->update(particle, elapsedTime);
// update affectors
for(auto it = m_affectors.begin(), end = m_affectors.end(); it != end;) {
const ParticleAffectorPtr& affector = *it;
if(affector->hasFinished()) {
it = m_affectors.erase(it);
continue;
}
affector->update(delay);
++it;
}
particle->update();
++it;
// update particles
for(auto it = m_particles.begin(), end = m_particles.end(); it != end;) {
const ParticlePtr& particle = *it;
if(particle->hasFinished()) {
it = m_particles.erase(it);
continue;
}
// pass particles through affectors
for(const ParticleAffectorPtr& particleAffector : m_affectors)
particleAffector->updateParticle(particle, delay);
particle->update(delay);
++it;
}
}
}