From 4aabb4e18d3924002e936b887887190d236744ca Mon Sep 17 00:00:00 2001 From: ghostly_zsh Date: Mon, 7 Jul 2025 13:24:33 -0500 Subject: [PATCH] batch spawning particles --- crates/unified/src/particle_editor/spawn.rs | 34 +++++++++++---------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/crates/unified/src/particle_editor/spawn.rs b/crates/unified/src/particle_editor/spawn.rs index bab3efbed96ad797e58091854dc235c0d8bae018..3462c0c4d73c8be4a933be1ccaefe4f9bde4fea3 100644 --- a/crates/unified/src/particle_editor/spawn.rs +++ b/crates/unified/src/particle_editor/spawn.rs @@ -19,23 +19,25 @@ fn spawn_particles( ) { for (transform, effect, mut delay_timer) in particle_effects { delay_timer.0.tick(time.delta()); - let circle = CircleMesh(meshes.add(Circle::new(1.0)), - materials.add(effect.color.sample(effect.color.clamp_time(0.0).unwrap()).unwrap())); if delay_timer.0.just_finished() { - commands.spawn(( - RigidBody::Dynamic, - Particle, - transform.with_scale(Vec3::splat(effect.scale.sample(effect.scale.clamp_time(0.0).unwrap()).unwrap())), - Mesh2d(circle.0.clone()), - MeshMaterial2d(circle.1.clone()), - Velocity { - linvel: effect.initial_linear_velocity.sample(&mut rand::rng()), - angvel: effect.initial_angular_velocity.sample(&mut rand::rng()), - }, - LifetimeTimer(Timer::from_seconds(effect.lifetime_seconds.sample(&mut rand::rng()), TimerMode::Once)), - circle, - ParentEffect(effect.clone()), - )); + for _ in 0..effect.particles_in_batch.sample(&mut rand::rng()) { + let circle = CircleMesh(meshes.add(Circle::new(1.0)), + materials.add(effect.color.sample(effect.color.clamp_time(0.0).unwrap()).unwrap())); + commands.spawn(( + RigidBody::Dynamic, + Particle, + transform.with_scale(Vec3::splat(effect.scale.sample(effect.scale.clamp_time(0.0).unwrap()).unwrap())), + Mesh2d(circle.0.clone()), + MeshMaterial2d(circle.1.clone()), + Velocity { + linvel: effect.initial_linear_velocity.sample(&mut rand::rng()), + angvel: effect.initial_angular_velocity.sample(&mut rand::rng()), + }, + LifetimeTimer(Timer::from_seconds(effect.lifetime_seconds.sample(&mut rand::rng()), TimerMode::Once)), + circle, + ParentEffect(effect.clone()), + )); + } delay_timer.0.set_duration(Duration::from_secs_f32(effect.batch_spawn_delay_seconds.sample(&mut rand::rng()))); delay_timer.0.reset(); }