#define R                           iResolution
#define SCENE_SCALE                 1.0
#define TAU                         6.2831853071795862
#define UNIT                      ( 2.5*SCENE_SCALE / R.y  )
#define SMAA(x)                   ( smoothstep(UNIT, 0., x) )

float squareSDF_L2(in vec2 NDC, in vec2 C, in float size, in float r, in float rad)
{
    const float half_pi = 1.5707963267948966;
    //vec4 c = cos(rad+vec4(0, half_pi, -half_pi, 0)); // row order
    vec4 c = cos(rad+vec4(0, -half_pi, half_pi, 0)); // column order
    
    vec2 P = abs(mat2(c.x, c.y, c.z, c.w) * (NDC-C)) - size*0.5; 
    
    return 
        (P.x > 0. && P.y > 0. ?
            length(P) :
            max(P.x, P.y)) - r;       
}

#define MOUSE_OFFSET ( iMouse.z > 0. ? iMouse.xy - iResolution.xy * 0.5 : vec2(0) )
vec2 map_to_centered_ndc(in vec2 SC, in float scale, in vec2 origin, in bool mouse_drag)
{
    vec2 M = MOUSE_OFFSET * (mouse_drag == true ? 1. : 0.);
    return ((2. * (SC - M) - iResolution.xy) / iResolution.y) * scale + origin;
}

void mainImage( out vec4 O, in vec2 SC )
{
    vec2 NDC = map_to_centered_ndc(SC, SCENE_SCALE, vec2(0), false);
    vec3 color = vec3(1);    
    float count = 64.,
          da = TAU/count,
          T = iTime*1.;
    
    for (float i = 0.; i < count; i += 1.)
    //float k = 0.; for (float i = k; i < k+1.; i+= 1.) // shows only one square
    {
        float rad = TAU * 0.125 + i * da,               // static angle
              s = (1. + sin(rad+T)) * 0.5,
              size = 1.4*s,                             // dynamic square size
              dist = squareSDF_L2(NDC, vec2(0), size, 0., rad);
        
        color = 
            i == 0. ?
                mix(color, vec3(0), SMAA(abs(dist*0.5))) :
                mix(color, vec3(0,0,1), SMAA(abs(dist)));           
    }

    O = vec4(color, 1.0);
}
