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);
  }
}