// Parameters from our host // x: #sceneid.#scenetime (float) // y: undefined // z: Snare drum intensity (amiga ball radius gain) // w: undefined uniform vec4 Z; float rnd(vec2 p) { p.x += p.y * 57.; return sin(cos(p.x) * p.x); } float scale; vec2 hash( vec2 p ) { p = mod(p, scale); p = vec2( dot(p,vec2(127.1,311.7)), dot(p,vec2(269.5,183.3)) ); return -1.0 + 2.0*fract(sin(p)*43758.5453123); } float noise( in vec2 p, float s ) { scale = s; p *= s; vec2 i = floor( p ); vec2 f = fract( p ); vec2 u = f*f*(3.0-2.0*f); return mix( mix( dot( hash( i + vec2(0.0,0.0) ), f - vec2(0.0,0.0) ), dot( hash( i + vec2(1.0,0.0) ), f - vec2(1.0,0.0) ), u.x), mix( dot( hash( i + vec2(0.0,1.0) ), f - vec2(0.0,1.0) ), dot( hash( i + vec2(1.0,1.0) ), f - vec2(1.0,1.0) ), u.x), u.y); } float voronoi(vec2 p) { p = mod(p, 1.0); float min1 = 1, min2 = 1; float seed = 10; const int numPoints = 256; for (int i = 0; i < numPoints; ++i) { vec2 pointPos = vec2(rnd(vec2(0, seed++)), rnd(vec2(1, seed++)))*.5+.5; //pointPos += vec2(sin(Z.z+rnd(vec2(0, seed++))), cos(Z.z+rnd(vec2(1, seed++))))*0.1; vec2 d = abs(p - pointPos); vec2 s = step(0.5, d); d = s+d*(-s*2+1); float dist = length(d); if (dist < min2) { if (dist < min1) { min2 = min1; min1 = dist; } else { min2 = dist; } } } //return pow(1.0 - (min2 - min1), 32.0); return (min2 - min1) * 8.0; } void main() { vec2 p = gl_FragCoord.xy / Z.xy; float l = voronoi(p); float f = 0.5; float seed = 10.0; for (float t = 2.0; t <= Z.x; t *= 2.0) { f += (0.5 / pow(t, 0.6)) * noise(p,t); } gl_FragColor = vec4(l,f,l,1); }