#define SIN(x) (.5+.5*sin(x))

vec3 pal(float t) {

    vec3 a = vec3(.6);
    vec3 b = vec3(1.);
    vec3 c = vec3(.5);
    vec3 d = vec3(0.161,1.000,0.902);
    
   // vec3 d = vec3(0.216,0.14,0.545);
    return a + b*cos(6.283*(c*t+d));
}

// chebyshev distance
float d2(vec2 v, float k) {
    return pow(pow(abs(v.x), k)+pow(abs(v.y), k), 1./k);
}

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

    vec3 col = vec3(0);
    
    float z = 0.;
    for(float i=0.; i< 8.; i++) {
    
        uv = fract(uv*(1.4-z))-.5;
        uv2 = fract(uv2*(1.+.5*sin(iTime*.1)+z))-.5;
        
        vec3 c = pal(length(uv0) + iTime*.4 + i*.4);
        
        
        float d = (d2(uv, 1.2)+length(uv2)*exp(-length(uv0)));
        
        d = abs(.1*d+sin(d*8.+iTime)/8.);
        
        //d = 
        d = .1*pow(0.01/d, 1.2) + smoothstep(.02, .0, d);
        col += c*d;
    
    }
    
    
    
    // Output to screen
    fragColor = vec4(col,1.0);
}
