void ParticleController::update() {
    update_emitter();
    update_renderer();

    if (particles.size() == 0 && spawned && spawn_once) {
        removed = true;
        delete texture;
    }
}
Ejemplo n.º 2
0
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++;
    }

}