public void Simulate(float elapsedMS) { //Advance the time of the simulation m_time.TickMS(elapsedMS); //Emit particles as necessary if (m_active) { m_particleToEmit += Definition.EmitRate * elapsedMS / 1000.0f; } if (m_active && /*m_emissionTimer.Active == false && */ m_particleToEmit >= 1) { m_emissionTimer.Start(); for (int i = 0; i < m_particleToEmit; i++) { Emit(); m_particleToEmit--; } } //ResetModifiers for (int i = 0; i <= m_maxUsedIndex; i++) { m_particles[i].ScaleModifier = Vector2.One; m_particles[i].ColorModifier = m_particles[i].Color; } //Run through all modifiers for (int i = 0; i <= m_maxUsedIndex; i++) { for (int iMod = 0; iMod < m_modifiers.Count; iMod++) { m_modifiers[iMod].Modify(m_particles, i, i + 1, elapsedMS); } } //Update age and position float velocityScale = 0.1f; for (int i = 0; i <= m_maxUsedIndex; i++) { m_particles[i].Age += elapsedMS; m_particles[i].Position += m_particles[i].Velocity * elapsedMS * velocityScale; m_particles[i].Orientation += m_particles[i].AngularVelocity * elapsedMS; } //Finally, remove all dead particle for (int i = 0; i <= m_maxUsedIndex; i++) { if (m_particles[i].Alive && m_particles[i].Age >= m_particles[i].LifetimeMS) { m_particles[i].Alive = false; m_freeParticles.Push(i); } } }