nightshade 0.13.3

A cross-platform data-oriented game engine.
Documentation
use crate::ecs::world::World;

pub fn update_particle_emitters(world: &mut World) {
    let delta_time = world.resources.window.timing.delta_time;
    let emitter_entities: Vec<_> = world
        .core
        .query_entities(crate::ecs::PARTICLE_EMITTER)
        .collect();
    let _span = tracing::info_span!("particles", emitters = emitter_entities.len()).entered();

    for entity in emitter_entities {
        if let Some(emitter) = world.core.get_particle_emitter_mut(entity) {
            if !emitter.enabled {
                continue;
            }

            if emitter.one_shot && emitter.has_fired {
                continue;
            }

            if emitter.burst_count > 0 && !emitter.has_fired {
                emitter.accumulated_spawn = emitter.burst_count as f32;
                emitter.has_fired = true;
            } else if emitter.spawn_rate > 0.0 {
                emitter.accumulated_spawn += emitter.spawn_rate * delta_time;
            }
        }
    }
}