use rdpe::prelude::*;
#[derive(rdpe::Particle, Clone)]
struct Spark {
position: Vec3,
velocity: Vec3,
#[color]
color: Vec3,
}
fn main() {
Simulation::<Spark>::new()
.with_particle_count(50_000)
.with_bounds(2.0)
.with_particle_size(0.008) .with_spawner(|ctx| {
let pos = ctx.random_in_sphere(0.8);
let speed = ctx.random_range(0.3, 0.6);
Spark {
position: pos,
velocity: ctx.tangent_velocity(pos, speed),
color: ctx.rainbow(0.8, 1.0),
}
})
.with_visuals(|v| {
v.blend_mode(BlendMode::Additive);
})
.with_rule(Rule::AttractTo {
point: Vec3::ZERO,
strength: 0.5,
})
.with_rule(Rule::Custom(
r#"
let r = length(p.position.xz);
let swirl_strength = 0.3 / (r + 0.1);
p.velocity += vec3<f32>(-p.position.z, 0.0, p.position.x) * swirl_strength * uniforms.delta_time;
"#
.into(),
))
.with_rule(Rule::Drag(0.3))
.with_rule(Rule::SpeedLimit { min: 0.0, max: 1.5 })
.with_rule(Rule::BounceWalls { restitution: 1.0 })
.run().expect("Simulation failed");
}