vec3 palette(in float t)
{
    vec3 a = vec3(1.338, 0.500, 0.538);
    vec3 b = vec3(1.807, 0.319, 0.641);
    vec3 c = vec3(0.192, 1.020, 1.020);
    vec3 d = vec3(-1.422, -1.088, 0.587);

    return a + b*cos( 6.28318*(c*t+d) );
}

void mainImage(out vec4 fragColor, in vec2 fragCoord)
{
    float time = -iTime * .3 + 0.5;// * sin(iTime / 2.5);
    vec3 sampledCol = vec3(0.0);

    //msaa
    int samples = 12;

    for (int x = 0; x < samples; x++)
    {
        for (int y = 0; y < samples; y++)
        {
            vec2 offset = vec2(float(x), float(y)) / float(samples);

            vec2 uv = 2.0 * (fragCoord + offset) / iResolution.xy - 1.0;
            uv.x *= iResolution.x / iResolution.y;
            uv *= 0.5;

            vec3 finalColor = vec3(0.0);
            vec2 uv0 = uv;

            for (float i = 1.0; i < 3.0; i++)
            {
                uv *= 1.4 + 0.3*sin(time*1.0) - .5*cos(uv.x/uv.y*8.);
                uv = fract(uv);
                uv -= 0.5;
                // uv *= 2.0;

                float d = length(uv);

                vec3 col = palette(time + d + length(uv0)*1. + i / 8.0);

                d = sin(5.0*d + time)/5.;
                d = abs(d);
                d = sin(d/pow(0.5, -time+1.)) / 6.28*d/pow(0.5, -time+1.);
                //d = smoothstep(0.0, 0.1, d);

                d = (0.05*pow(0.9, -time)+0.0000) / d;

                finalColor += col * d * pow(1.6, -i);
            }

            sampledCol += finalColor;
        }
    }

    fragColor = vec4(sampledCol / float(samples*samples), 1.0);
}
