float borderFunc(float edge, float x)
{
    float thick = .05;
    return
        step(edge, x);
        //smoothstep(edge-thick, edge+thick, x);
}

float distCircle(vec2 p, float rad)
{
    float dist = borderFunc(rad, length(p-vec2(.0)));
    dist = max(dist, 1.-borderFunc(p.x, .3)); // flat @ right half
    return dist;
}
float sdBox( in vec2 p, in vec2 b )
{
    vec2 d = abs(p)-b;
    return length(max(d,0.0)) + min(max(d.x,d.y),0.0);
}

float spiral(vec2 m, float t)
{
    m.y -= .1;
	float r = .8*length(m);
	float a = atan(m.y, m.x);
    
    a += .2 + (-.5+.5*sin(t));
    float thick = 20.;// * r/10.;

	float v = sign(sin(thick*(sqrt(r)-0.05*a)));
	return clamp(v,0.,1.);
}


void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    // Normalized pixel coordinates (from 0 to 1)
    vec2 uv = fragCoord/iResolution.xy;
    uv -= vec2(.5);
    
    float t = 1.5*iTime;
    uv *= 4. + sin(t);
    float aspect = iResolution.x/iResolution.y;
    uv.x *= aspect*.8;

    vec3 col = 0.5 + 0.5*cos(iTime+uv.xyx+vec3(0,2,4));
    t = 8.*t;


    // Combined dist field
    float bri = 1.-distCircle(uv, .5); // outer backwards "D" shape
    bri = max(bri,spiral(uv, t));
    //bri = min(bri,distCircle(2.2*uv, .5)); // inner "D"
    float boxsz = 1.+(-.125+.125*sin(t-3.1459));
    bri = min(bri,sdBox(uv-vec2(-.05,0.), boxsz*vec2(.2))> 0.?1.:0.); // inner square
    
    col = vec3(bri);
    
    uv.x -= .3;
	float a = atan(uv.x, uv.y);
    float PI = 3.1415927;
    a += 1.;//PI*.25;
    
    vec2 colShift = .5*vec2(
        .2*abs(a-PI*2.*sin(.25*t)),
        .2*abs(a-PI*2.*sin(.25*t+1.)));
        
        
    col.rg *= .5 +(colShift * .9*(2.+fract(.125*t)));
    //col.b *= .2*abs(a-PI*2.*sin(.25*t+2.));
    

    // Output to screen
    fragColor = vec4(col,1.0);
}
