92 lines
2.0 KiB
GLSL
92 lines
2.0 KiB
GLSL
in vec2 v_uv;
|
|
in float v_aa;
|
|
in float v_range;
|
|
in vec2 v_period;
|
|
in vec4 v_color;
|
|
|
|
out vec4 o_color;
|
|
|
|
vec2 uv_;
|
|
float len_;
|
|
float theta_;
|
|
|
|
float atan2(in vec2 p) {
|
|
return p.x == 0.? PI/2.*sign(p.y): atan(p.y, p.x);
|
|
}
|
|
float thetadist(in vec2 p, in float t) {
|
|
float a = tan(t);
|
|
float b = 1.;
|
|
if (cos(t) == 0.) {
|
|
a = 1.;
|
|
b = 0.;
|
|
}
|
|
return abs(b*p.y-a*p.x)/sqrt(a*a+b*b);
|
|
}
|
|
|
|
float grid(in float n, in float ri, in float ro) {
|
|
float u = PI/n;
|
|
float t = floor(theta_/u)*u;
|
|
|
|
float d = min(thetadist(uv_, t), thetadist(uv_, t+u));
|
|
return
|
|
step(ri, len_)*step(len_, ro)*
|
|
smoothstep(v_aa, .0, d);
|
|
}
|
|
|
|
float belt(in float t1, in float t2, in float r) {
|
|
float t1a = smoothstep(v_aa, 0., thetadist(uv_, t1))*step(abs(theta_-t1), .1);
|
|
float t2a = smoothstep(v_aa, 0., thetadist(uv_, t2))*step(abs(theta_-t2), .1);
|
|
|
|
float a = t1a + t2a + step(t1, theta_)*step(theta_, t2);
|
|
a *=
|
|
(t1a + t2a)*smoothstep(.4, .45, len_) +
|
|
smoothstep(r-v_aa, r, len_)*
|
|
(1.-max(len_-r, 0.)/.2) +
|
|
smoothstep(v_aa, 0., abs(len_-.7*r));
|
|
return clamp(a, 0., 1.);
|
|
}
|
|
|
|
float circle(in float r) {
|
|
return
|
|
smoothstep(v_aa, 0., abs(len_-r));
|
|
}
|
|
|
|
float clockhand(in float t) {
|
|
float r = smoothstep(.25, .3, len_)*smoothstep(1., .85, len_);
|
|
float a =
|
|
r *
|
|
smoothstep(v_aa, 0., thetadist(uv_, t)) *
|
|
step(abs(theta_-t), .1);
|
|
float b =
|
|
r * max(1.-abs(theta_-t)/(PI/12.), 0.)*.7;
|
|
|
|
return a + b;
|
|
}
|
|
|
|
void main(void) {
|
|
uv_ = v_uv.yx;
|
|
len_ = length(uv_);
|
|
theta_ = atan2(uv_);
|
|
theta_ = theta_ < 0.? theta_+2.*PI: theta_;
|
|
|
|
if (v_range <= -1.) {
|
|
o_color = v_color;
|
|
float a =
|
|
grid( 2., .4, 1.) +
|
|
grid(60., .75, .8) +
|
|
grid(10., .65, .8) +
|
|
grid(8., .5, .55) +
|
|
grid( 4., .3, .4) +
|
|
circle(.8);
|
|
o_color.a *= clamp(a, 0., 1.);
|
|
|
|
} else if (v_range <= 0.) {
|
|
o_color = v_color*clockhand(v_period.x*PI*2.);
|
|
o_color.a = pow(o_color.a, 2.);
|
|
|
|
} else {
|
|
o_color = v_color;
|
|
o_color.a *= belt(v_period.x*PI*2., v_period.y*PI*2., v_range);
|
|
}
|
|
}
|