69 lines
No EOL
1.7 KiB
GLSL
Executable file
69 lines
No EOL
1.7 KiB
GLSL
Executable file
#extension GL_ARB_explicit_attrib_location : enable
|
|
|
|
// ping pong inputs
|
|
uniform sampler2DRect particles0;
|
|
uniform sampler2DRect particles1;
|
|
uniform sampler2DRect particles2;
|
|
|
|
uniform sampler2DRect u_depth;
|
|
uniform sampler2DRect u_world;
|
|
uniform sampler2DRect u_v4l2cam;
|
|
|
|
uniform ivec2 uFrameSize;
|
|
uniform ivec2 uDepthFrameSize;
|
|
|
|
uniform vec3 mouse;
|
|
uniform float radiusSquared;
|
|
uniform float elapsed;
|
|
|
|
in vec2 texCoordVarying;
|
|
|
|
layout(location = 0) out vec4 posOut;
|
|
layout(location = 1) out vec4 velOut;
|
|
layout(location = 2) out vec4 misOut;
|
|
|
|
void main()
|
|
{
|
|
|
|
float depth = texture(u_depth, texCoordVarying.st).x;
|
|
vec4 ray = texture(u_world, texCoordVarying.st);
|
|
|
|
float vValid = (depth != 0 && ray.x != 0 && ray.y != 0) ? 1 : 0;
|
|
|
|
if(depth < 0.012) vValid = 0;
|
|
if(depth > 0.04) vValid = 0;
|
|
|
|
vec4 posWorld = vec4(1);
|
|
posWorld.z = -depth * 65535.0; // Remap to float range.
|
|
posWorld.x = ray.x * posWorld.z;
|
|
posWorld.y = ray.y * posWorld.z;
|
|
|
|
vec3 pos = texture(particles0, texCoordVarying.st).xyz;
|
|
pos = posWorld.xyz;
|
|
vec3 vel = texture(particles1, texCoordVarying.st).xyz;
|
|
|
|
// mouse attraction
|
|
vec3 direction = mouse - pos.xyz;
|
|
float distSquared = dot(direction, direction);
|
|
float magnitude = 500.0 * (1.0 - distSquared / radiusSquared);
|
|
vec3 force = step(distSquared, radiusSquared) * magnitude * normalize(direction);
|
|
|
|
// gravity
|
|
force += vec3(0.0, -0.5, 0.0);
|
|
|
|
// accelerate
|
|
vel += elapsed * force;
|
|
|
|
// bounce off the sides
|
|
vel.x *= step(abs(pos.x), 512.0) * 2.0 - 1.0;
|
|
vel.y *= step(abs(pos.y), 384.0) * 2.0 - 1.0;
|
|
|
|
// damping
|
|
vel *= 0.995;
|
|
|
|
// move
|
|
pos += elapsed * vel;
|
|
|
|
posOut = vec4(pos, 1.0);
|
|
velOut = vec4(vel, 0.0);
|
|
} |