#version 300 es
precision highp float;
uniform vec2 r;
uniform float t;
uniform int n;
uniform vec2 p;
out vec4 o;

mat2 turn(float a){float c=cos(a),s=sin(a);return mat2(c,-s,s,c);}
float hash(vec2 x){return fract(sin(dot(x,vec2(127.1,311.7)))*43758.5453);}

void main(){
  vec2 x=(2.*gl_FragCoord.xy-r)/r.y;
  x=turn(.025*sin(.17*t))*x;
  float R=length(x),A=atan(x.y,x.x);
  vec3 c=vec3(.003,.005,.006)+.012*vec3(.2,.55,.75)*(1.-R);
  vec3 ink[3]=vec3[3](
    vec3(.08,1.,.92),
    vec3(1.,.08,.48),
    vec3(.66,1.,.06)
  );
  for(int i=0;i<10;i++){
    float k=float(i),group=mod(k,3.);
    float petals=5.+mod(k,4.);
    float radius=.09+.061*k
      +.029*sin(petals*A+.56*k+.17*t)
      +.014*sin(13.*A-.37*k-.11*t)
      +.008*cos(29.*A+.8*k+.07*t);
    float d=abs(R-radius);
    vec3 hue=group<.5?ink[0]:(group<1.5?ink[1]:ink[2]);
    c+=hue*(.72*(1.-smoothstep(.0012,.006,d))+.00024/(d+.002));
  }
  float dial=(1.-smoothstep(0.,.007,abs(R-.765)))*
    smoothstep(.35,.85,.5+.5*sin(64.*A-.35*t));
  c+=dial*vec3(.16,.25,.22);
  float spokes=(1.-smoothstep(0.,.0025,abs(sin(8.*A))))*
    (1.-smoothstep(.7,.73,R))*smoothstep(.64,.67,R);
  c+=spokes*vec3(.08,.13,.12);
  float pulse=1.-smoothstep(0.,.014,abs(R-.042-.007*sin(.8*t)));
  c+=pulse*vec3(.7,.9,.82);
  c*=1.-smoothstep(.43,1.18,R);
  c*=.9+.1*sin(gl_FragCoord.y*3.14159);
  c+=(hash(gl_FragCoord.xy+float(n))-.5)/255.;
  c=1.-exp(-1.3*c);
  o=vec4(pow(max(c,0.),vec3(.82)),1.);
}
