vec2 rot( in vec2 p, in float an )
{
    float cc = cos(an);
    float ss = sin(an);
    return mat2(cc,-ss,ss,cc)*p;
}

float bump(float x)
{
    return smoothstep(-1., 0., x) - smoothstep(0., 1., x);
}

float smoothbump(float r, float dr, float d)
{
    return smoothstep(r-dr, r, d) - smoothstep(r, r+dr, d);
}

float hardbump(float r, float dr, float d) 
{
    return step(r-dr/2., d) - step(r+dr/2., d);

}

float repeat(float x) 
{
    return 2.*(.5 - abs(mod(x, 1.0) - 0.5));
}

float circle(in vec2 uv, in vec2 uv0, float r, float w) 
{
    return smoothbump(r, w, length(uv - uv0));
}

#define FLOWING_COLOR 1

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
     // normalize aspect
    vec2 R = iResolution.xy;
    vec2 uv0 = ( R - 2.*fragCoord ) / R.y;

    float r = 1.;
    float dr = 20./R.x;

    // view port
    vec2 uv = rot(uv0*3.2, radians(90.));

    // Time varying pixel color
    #if FLOWING_COLOR == 1
    vec3 col1 = 0.5 + 0.5*cos(iTime+uv0.xyx+vec3(0,2,4));
    vec3 col2 = col1.zyx;
    vec3 col3 = col1.yzx;
    vec3 col4 = col1.zxy;
    #else
    vec3 col1 = vec3(1.,0.,0.);
    vec3 col2 = vec3(0.,1.,0.);
    vec3 col3 = vec3(0.,0.,1.);
    vec3 col4 = vec3(1.,0.,1.);
    #endif

    // starting color
    vec3 col = vec3(.1, .0, .0);
    
    float a = 360./6.;
    float z = 0.0;
    float dcenter = length(uv);
    vec2 start = vec2(0.,0.);
    vec2 unitx = vec2(1., 0.);
    
    // seed circle
    col += col1 * circle(uv, vec2(0.,0.), r, dr);
    
    // bounding circles for the rosette
    col += col3 * circle(uv, vec2(0.,0.), 3.*r, dr);
    col += col3 * circle(uv, vec2(0.,0.), 3.*r + 0.1, dr);
    
    for (float x = 0.; x <= a*6.; x += a) {
        vec2 uv2 = rot(unitx, radians(x));
        col += col2 * circle(uv, uv2, r, dr);
        
        for (float y = 0.; y <= a*1.; y += a) {
            vec2 uv3 = uv2 + rot(unitx, radians(x+y));
            float dd = length(uv - uv3);
            col += col3 * circle(uv, uv3, r, dr);

            for (float z = -a; z <= a*0.; z += a) {
                vec2 uv4 = uv3 + rot(unitx, radians(x+y+z));
                if (dd < r) {
                    col += col4 * circle(uv, uv4, r, dr);
                }
                
                for (float w = 0.; w <= a*2.; w += a) {
                    vec2 uv5 = uv4 + rot(unitx, radians(x+y+z+w));
                    if (dd < r) {
                        col += col1 * circle(uv, uv5, r, dr);
                    }
                }
            }
        }       
    }
                 
    col.x = clamp(0.,.99, col.x);
    col.y = clamp(0.,.99, col.y);
    col.z = clamp(0.,.99, col.z);
    
    // Output to screen
    fragColor = vec4(col,1.0);
}
