Particles system: water splash
#![allow(unused)] fn main() { fn new() -> Player { Player { ... water_particles: Emitter::new(EmitterConfig { emitting: false, lifetime: 0.8, lifetime_randomness: 0.5, initial_size: 0.3, initial_velocity: 50.0, initial_velocity_randomness: 0.3, initial_direction_spread: 0.5, gravity: vec2(0.0, 150.0), material: Some(ParticleMaterial::new(VERTEX, FRAGMENT)), ..Default::default() }), } } }
There are two options of using emitters: set emit speed, amount etc parameters to EmitterConfig and let emitter emit by itself.
Or just manually emit some particles in certain place.
#![allow(unused)] fn main() { fn water_splash_effect(&mut self) { let amount = 7; // Spawn some particles in equally spreaded straight line for i in 0..amount { self.water_particles.emit( self.pos + vec2(i as f32 / amount as f32 * self.width, 0.0), 1, ); } } }
Vertex shader:
#include "particles.glsl"
PARTICLE_MESH_DECL
varying lowp vec2 texcoord;
varying lowp vec4 particle_data;
void main() {
gl_Position = particle_transform_vertex();
texcoord = particle_transform_uv();
particle_data = in_attr_inst_data;
}
Fragment shader:
#include "particles.glsl"
precision lowp float;
varying lowp vec2 texcoord;
varying lowp vec4 particle_data;
uniform sampler2D texture;
void main() {
// particle_ix is uniquad id of each particle
float randomize_initial_color = 0.5 + rand(vec2(particle_ix(particle_data), 0)) * 0.5;
// particle_lifetime is 0..1 value with 0 at the beginning of particle life and 1 just before particle removal
float fade_during_lifetime = 0.5 + (1.0 - particle_lifetime(particle_data));
gl_FragColor = texture2D(texture, texcoord) * randomize_initial_color * fade_during_lifetime;
}