]> Witch of Git - lovr-particles/blob - shaders/particles.comp
Use hand motion to influence particle motion
[lovr-particles] / shaders / particles.comp
1 uniform float dt;
2 uniform vec3 handPos[2];
3 uniform vec3 handVel[2];
4
5 struct particle_t {
6 vec4 positionAndSize;
7 vec4 velocity;
8 vec4 padding2; // for LÖVR's limited ShaderBlock type :(
9 vec4 padding3; // for LÖVR's limited ShaderBlock type :(
10 };
11 layout(std430) buffer particleData {
12 float reloadFlag;
13 particle_t particles[];
14 };
15
16 vec3 wrap(vec3 v) { return mod(v, 2.0) - 1.0 + vec3(0.0, 1.0, 0.0); }
17
18 layout(local_size_x = 128) in;
19 void compute() {
20 uint id = gl_GlobalInvocationID.x;
21 vec3 vel = particles[id].velocity.xyz;
22 vec3 pos = particles[id].positionAndSize.xyz;
23 for (int i = 0; i < 2; i++) {
24 float speed = clamp(length(handVel[i]), 0.0, 3.0);
25 float dist = distance(handPos[i], pos);
26 float factor = 1.0 - smoothstep(0.0, speed * 0.1, dist);
27 vel = mix(vel, handVel[i], factor * 0.01);
28 }
29 particles[id].positionAndSize.xyz = wrap(pos + vel * dt);
30 particles[id].velocity.xyz = vel - vel * length(vel) * dt;
31 }