#define CS(a) vec2(cos(a), sin(a))
#define N(r) ((abs(r) > 1.) ? 1./(2.*sign(r)-r): r)  // range +/-2 to number line

void mainImage(out vec4 C, in vec2 U)
{
    vec2 R = iResolution.xy,
         m = iMouse.xy/R*4.-2.,
         u = (U-R/2.)/R.y,
         w, f;
    u = u.yx; // clock orientation
    float pi = 3.1416,
          pi2 = pi*2.,
          t = 1. + iTime/60.,
          s = 25.,                      // scale
          wr = 2.5,                     // warp radius
          ps = 1.,                      // point size
          l = 10.,                      // detail loop
          e = N(clamp(m.y, -1.8, 1.8)), // exponent from mouse
          z = pow(s, e),                // zoom
          a1 = -t*s*pi2,                // spiral 1 rotation
          a2 = -sqrt(t*s*2.)*pi2,       // spiral 2 rotation
          a3 = -log(t)*s*pi,            // spiral 3 rotation
          fr = length(u)*wr,            // frame
          fe = pow(fr, 1./e),           // frame with exponent
          i = 0., r, h, j, v, rv, sc;

    vec3 c = vec3(0);
    u *= z*wr; // apply zoom
    r = pow(length(u), 1./e); // radius
    w = fwidth(u); // pixel size
    c.gb += pow(min(fr, 1./fr), 5.)*.2; // circle frame

    for (; i++<l;) // cell overlap loop
        h = max(0., round((r-i)/l))*l+i, // rounded radius
        j = pow(h, e), // apply exponent
        f.x = max(f.x, ps/length((u-CS(a1+pi2*t*h)*j)/w)),          // spiral 1
        f.y = max(f.y, ps/length((u-CS(a2+pi2*sqrt(t*h*2.))*j)/w)); // spiral 2
    f = min(f, 1.) * min(fe, 1./fe); // limit brightness & darken limits
    c.rg += f; // add spirals

    v = (atan(u.y, u.x)-a3)/pi2;
    rv = r-v;
    sc = pi*pow(ceil(rv)+v, 2.)/t; // spiral coords
    c.b += max(0., sin(sc)*cos(sc*2.)) // spiral 3
         * pow(abs(sin(pi*rv)), abs(e)+1.) // smooth edges
         * min(1., 1./fe); // darken limits

    C = vec4(c+c.brg, 1);
}
