use nightshade::prelude::*;
pub fn emit_fire(world: &mut World, position: Vec3) -> Entity {
spawn_emitter(world, ParticleEmitter::fire(position))
}
pub fn emit_smoke(world: &mut World, position: Vec3) -> Entity {
spawn_emitter(world, ParticleEmitter::smoke(position))
}
pub fn emit_burst(world: &mut World, position: Vec3, color: [f32; 4], count: u32) -> Entity {
spawn_emitter(
world,
ParticleEmitter::firework_explosion(
position,
Vec3::new(color[0], color[1], color[2]),
count,
),
)
}
pub fn emit_sparks(world: &mut World, position: Vec3) -> Entity {
spawn_emitter(world, ParticleEmitter::sparks(position))
}
pub fn emit_firework(world: &mut World, position: Vec3, velocity: Vec3) -> Entity {
spawn_emitter(world, ParticleEmitter::firework_shell(position, velocity))
}
pub fn emit_particles(
world: &mut World,
position: Vec3,
rate: f32,
lifetime: f32,
size: f32,
gravity: Vec3,
) -> Entity {
let mut emitter = ParticleEmitter::smoke(position);
emitter.spawn_rate = rate;
emitter.particle_lifetime_min = lifetime;
emitter.particle_lifetime_max = lifetime;
emitter.size_start = size;
emitter.size_end = size;
emitter.gravity = gravity;
emitter.one_shot = false;
emitter.enabled = true;
spawn_emitter(world, emitter)
}
pub fn spawn_particle_emitter(world: &mut World, emitter: ParticleEmitter) -> Entity {
spawn_emitter(world, emitter)
}
pub fn set_emitter(world: &mut World, emitter_entity: Entity, emitter: ParticleEmitter) {
crate::placement::set_position(world, emitter_entity, emitter.position);
world.core.set_particle_emitter(emitter_entity, emitter);
}
fn spawn_emitter(world: &mut World, emitter: ParticleEmitter) -> Entity {
let entity = spawn_entities(
world,
PARTICLE_EMITTER | LOCAL_TRANSFORM | LOCAL_TRANSFORM_DIRTY | GLOBAL_TRANSFORM | NAME,
1,
)[0];
world.core.set_name(entity, Name("api::effect".to_string()));
assign_local_transform(
world,
entity,
LocalTransform {
translation: emitter.position,
..Default::default()
},
);
world.core.set_particle_emitter(entity, emitter);
entity
}