void ParticleController::update() { update_emitter(); update_renderer(); if (particles.size() == 0 && spawned && spawn_once) { removed = true; delete texture; } }
void ParticleEffect::update(void) { float cur_t = g_timer->now(); float delta_t = cur_t - m_last_update_time; m_last_update_time = cur_t; float pe_time = cur_t - m_start_time; update_emitter(delta_t,pe_time); for(unsigned int i=0; i<m_num_particles; ++i) { Particle &p = m_particles[i]; if (p.alive == false) continue; // eliminate dead particles float p_time = cur_t - p.start_time; if (p_time > m_particle_ttl) { p.alive = false; continue; } // update live particle update_single_particle(p,delta_t,p_time); } // emit new particles m_particles_to_emit += delta_t * m_emit_rate; while (m_particles_to_emit>1.0f) { if (m_mep!=0 && m_lifetime_num_emitted>=m_mep) break; m_particles_to_emit -= 1.0f; // emit particle int pos = -1; // find empty space for(unsigned int i=0; i<m_num_particles; ++i) { if (!m_particles[i].alive) { pos = i; break; } } if (pos==-1) { // free space not available ? // printf("particle overflow\n"); break; } if (!m_emitting) continue; Particle &p = m_particles[pos]; p.alive = true; p.start_time = cur_t; emit_single_particle(p); m_lifetime_num_emitted++; } }