2 uniform vec3 handPos[2];
3 uniform vec3 handVel[2];
8 vec4 padding2; // for LÖVR's limited ShaderBlock type :(
9 vec4 padding3; // for LÖVR's limited ShaderBlock type :(
11 layout(std430) buffer particleData {
13 particle_t particles[];
16 vec3 wrap(vec3 v) { return mod(v, 2.0) - 1.0 + vec3(0.0, 1.0, 0.0); }
18 layout(local_size_x = 128) in;
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);
29 particles[id].positionAndSize.xyz = wrap(pos + vel * dt);
30 particles[id].velocity.xyz = vel - vel * length(vel) * dt;