xxxxxxxxxx
89
precision highp float;
varying vec2 vPos;
varying vec2 vTexCoord;
uniform float seconds;
uniform float minutes;
uniform float hours;
uniform int click;
float sdBox(vec2 p, vec2 b)
{
vec2 d = abs(p) - b;
return min(max(d.x,d.y), 0.) + length(max(d, 0.));
}
mat2 rotate(float a)
{
float c = cos(a), s = sin(a);
return mat2(c, -s, s, c);
}
int id = 0;
float sdClock(vec2 p)
{
float smult = 1.0;
float x = 1e5;
float y = 1e5;
float z = 1e5;
float w = 1e5;
for (int i = 0; i < 20; i++) {
if (click < 1) {
p = abs(p)/dot(p, p) - 0.5;
p *= rotate(seconds);
p *= 0.5;
smult *= 0.99;
}
float secondhand = 0.35*smult;
vec2 q = p;
p *= rotate(seconds);
p.y -= secondhand;
float b = sdBox(p, vec2(0.001, secondhand));
x = min(x,b);
float minutehand = 0.25*smult;
p = q;
p *= rotate(minutes);
p.y -= minutehand;
b = sdBox(p, vec2(0.001, minutehand));
y = min(y, b);
float hourhand = 0.15*smult;
p = q;
p *= rotate(hours);
p.y -= hourhand;
float c = sdBox(p, vec2(0.004, hourhand));
z = min(z, c);
smult *= 0.35;
}
float d = 1e5;
d = min(y, z);
//d = min(d, w);
id = x < d ? 1 : 0;
d = min(d, x);
return smoothstep(0.0015, 0.001, d);
}
void main() {
vec2 uv = vPos;
vec2 q = uv;
float d = 0.;
uv *= 0.5;
/*
for (int i = 0; i < 12; i++) {
uv = abs(uv)/dot(uv, uv) - 0.5;
uv *= rotate(seconds);
uv *= 0.5;
}
*/
d = click == 0 ? sdClock(uv) : sdClock(q);
//id = 0;
vec3 col = (id == 1) ? vec3(1, 0, 0) : vec3(1);
gl_FragColor = vec4(d * col, 1.0);
}