mat2 _rot1(float a) {
  float s = sin(a), c = cos(a);
  return mat2(c,s,-s,c);
}

const mat2 m = mat2( 0.80,  0.60, -0.60,  0.80 );

float noise( in vec2 p )
{
    return sin(p.x)*sin(p.y);
}

float fbm4( vec2 p )
{
    float f = 0.0;
    f += 0.5000*noise( p ); p = m*p*2.02;
    f += 0.2500*noise( p ); p = m*p*2.03;
    f += 0.1250*noise( p ); p = m*p*2.01;
    f += 0.0625*noise( p );
    return f/0.9375;
}

vec2 fbm4_2( vec2 p )
{
    return vec2(fbm4(p), fbm4(p+vec2(7.8)));
}

void drawCircle( inout float d, in vec2 uv, in vec2 pos, float r ){
    float g = smoothstep( .0, r + .01, length( uv - pos ) );
    
    d = mix(
        d,
        1.,
        g
    );
    
    d = mix(
        d,
        2.,
        smoothstep( r + .05, .0, length( uv - pos ) )
    );
    
}

// pulse
float Pulse2Pixel( in vec2 uv, vec2 pos, float rot, float size, float idx ){
    float b = 0.;
    vec2 bUv = uv;
    uv -= pos;
    uv *= _rot1( rot );
    uv += pos;
    
    uv = fbm4_2( uv + fbm4_2( uv +fbm4_2( uv - rot ) ) );
    b = cos( uv.x ) * sin( uv.y );
    // b = noise( uv ) + cos( uv.x ) * sin( uv.y ) * .3;
    

    b *= 1. - smoothstep(.0, size, length( bUv - pos ) );
    
    b = mix(
        b, 
        0.,
        1. - smoothstep(.0, size * .6, length( bUv - pos ) )
    );
    
    // pulse overlay
    b = mix(
        b, 
        uv.x * .2,
        1. - smoothstep(.0, size, length( bUv - pos ) )
    );
    
    return b;
}


void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    // Normalized pixel coordinates (from 0 to 1)
    vec2 uv = fragCoord/iResolution.yy;
    uv.x -= ( iResolution.x - iResolution.y ) / iResolution.y * .5;
    vec2 center = vec2( .5 );
    
    float d = 1.;
    vec3 col;
    
    
    float t = fract( iTime * .5 );

    
    for( float i = 0.; i < 5.; i++ ){
    
        t = fract( iTime * .5 - .25 * i );
        

        d = Pulse2Pixel( uv, ( center ) * 2. - .5, t, t, 0. );

        col = mix(
            col,
            vec3( 3. - 3. * ( t ) ),
            d
        );
        

    
    }
    
    d = col.x;
    
    uv -= .5;
    uv *= _rot1( iTime );
    uv += .5;
    
    uv *= 3.;

    uv = fbm4_2(uv+d+fbm4_2(uv+d+fbm4_2(uv + d - iTime)) + fbm4_2( uv + d - iTime ) + d);

    // Time varying pixel color
    col = 0.5 + 0.5*cos(iTime+uv.xyx+vec3(0,2,4));
    col *= 5.;
    // col = vec3( d );
    col *= d;
    
 
    

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