mirror of
https://github.com/CookieCollective/Live-Coding-Sources.git
synced 2025-07-13 21:16:05 +02:00
125 lines
3.0 KiB
GLSL
125 lines
3.0 KiB
GLSL
|
|
precision mediump float;
|
|
|
|
uniform float time;
|
|
uniform vec2 resolution;
|
|
|
|
#define PI 3.14159
|
|
#define TAU (PI*2.)
|
|
#define repeat(p,c) (mod(p,c)-c/2.)
|
|
|
|
float sdSphere (vec3 p, float r) { return length(p) - r; }
|
|
float sdCyl (vec2 p, float r) { return length(p) - r; }
|
|
float sdDisk (vec3 p, float r, float h) { return max(length(p.xz) - r, abs(p.y) - h); }
|
|
float sdIso (vec3 p, float r) { return dot(p, normalize(sign(p))) - r; }
|
|
|
|
mat2 rot (float a) {
|
|
float c = cos(a), s = sin(a);
|
|
return mat2(c,-s,s,c);
|
|
}
|
|
|
|
void amod (inout vec2 p, float c) {
|
|
float an = TAU/c;
|
|
float a = mod(atan(p.y,p.x), an)-an/2.;
|
|
p = vec2(cos(a),sin(a)) * length(p);
|
|
}
|
|
|
|
float map (vec3 pos) {
|
|
float scene = 1000.;
|
|
vec3 p = pos;
|
|
|
|
vec3 pppp = p;
|
|
p.xz *= rot(p.y * (.5 + .1 * sin(time * .1)) * .2);
|
|
amod(p.xz, 5.);
|
|
p.x -= 6.;
|
|
vec3 ppp = p;
|
|
|
|
scene = min(scene, sdCyl(p.xz, .04));
|
|
|
|
float d = length(p);
|
|
p = abs(p);
|
|
p.xz *= rot(time + d * .1);
|
|
p.yz *= rot(time + d * .1);
|
|
p.xy *= rot(time + d * .1);
|
|
scene = min(scene, sdCyl(p.xy, .04));
|
|
scene = min(scene, sdCyl(p.xz, .04));
|
|
scene = min(scene, sdCyl(p.zy, .04));
|
|
|
|
float r = .3;
|
|
|
|
vec3 pp = p;
|
|
p.x = repeat(p.x - time, 1.);
|
|
scene = min(scene, sdIso(p, r));
|
|
scene = min(scene, sdCyl(p.xz, .03));
|
|
|
|
p = pp;
|
|
p.y = repeat(p.y - time, 1.);
|
|
scene = min(scene, sdIso(p, r));
|
|
scene = min(scene, sdCyl(p.yz, .03));
|
|
|
|
p = pp;
|
|
p.z = repeat(p.z - time, 1.);
|
|
scene = min(scene, sdIso(p, r));
|
|
scene = min(scene, sdCyl(p.xz, .03));
|
|
scene = min(scene, sdCyl(p.yz, .03));
|
|
|
|
scene = max(scene, sdSphere(pos, 8.));
|
|
|
|
p = pppp;
|
|
p.xz *= rot(p.y * .05);
|
|
amod(p.xz, 16.);
|
|
p.x -= 6. + 4. * (.5+.5*sin(p.y * .2 + time));
|
|
scene = min(scene, sdCyl(p.xz, .05));
|
|
|
|
p = pppp;
|
|
p.xz *= rot(-p.y * .05);
|
|
amod(p.xz, 16.);
|
|
p.x -= 6. + 4. * (.5+.5*sin(p.y * .2 + time));
|
|
scene = min(scene, sdCyl(p.xz, .05));
|
|
|
|
p = pppp;
|
|
p.y = repeat(p.y + time * 5., 10.);
|
|
p.y += sin(atan(p.z,p.x)*5. + time * 5.);
|
|
|
|
pp = pppp;
|
|
amod(pp.xz, 32.);
|
|
pp.x -= 9.;
|
|
|
|
scene = min(scene, max(max(sdDisk(p, 10., .01), -sdCyl(p.xz, 8.)), -sdCyl(pp.xz, .5)));
|
|
//amod(p.yz, 32.);
|
|
//p.z -= 5.;
|
|
p.xz = repeat(p.xz, 2.);
|
|
p.xz *= rot(d*.1);
|
|
//scene = min(scene, sdCyl(p.xy, .01));
|
|
//scene = min(scene, sdCyl(p.zy, .01));
|
|
|
|
return scene;
|
|
}
|
|
|
|
vec3 lookAt (vec3 eye, vec3 at, vec2 uv) {
|
|
vec3 forward = normalize(at - eye);
|
|
vec3 right = normalize(cross(forward, vec3(0,1,0)));
|
|
vec3 up = normalize(cross(right, forward));
|
|
return normalize(forward + right * uv.x + up * uv.y);
|
|
}
|
|
|
|
void main () {
|
|
vec2 uv = (gl_FragCoord.xy-.5*resolution.xy)/resolution.y;
|
|
vec3 eye = vec3(0,10,-15);
|
|
vec3 ray = lookAt(eye, vec3(0), uv);
|
|
vec3 pos = eye;
|
|
float shade = 0.;
|
|
for (float i = 0.; i <= 1.; i += 1./30.) {
|
|
float dist = map(pos);
|
|
if (dist < .01) {
|
|
shade = 1.-i;
|
|
break;
|
|
}
|
|
pos += dist * ray;
|
|
}
|
|
vec3 color = vec3(1.);
|
|
color = mix(vec3(.9,.2,.4),vec3(.1,.2,.8),sin(length(pos)*.6+time*5.));
|
|
color *= shade;
|
|
gl_FragColor = vec4(color, 1);
|
|
}
|