#define gray vec3(.1, .1, .1)
#define root sqrt(2.0)
#define pi 3.14159265359

float gradient(float value, float weight){
    value *= pi;
    value = max(0.0, min(pi, value));
    value = 1.0/2.0 + 1.0/2.0*cos(value - weight*pi/2.0);
    return value*value;
}

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    // Normalized pixel coordinates (from 0 to 1)
    vec2 uv = (fragCoord/iResolution.xy - 0.5) * 200.0;
    uv.x *= iResolution.x/iResolution.y;
    vec4 iM = iMouse/10.0;

    vec3 final = vec3(0.0, 0.0, 0.0);
    for (float i = root+1.0; i < 6.0; i++){
            vec3 temp = vec3(tan(sin((uv.x/i-iM.x)/i+cos(log(i)*iTime/root)*i)
                               + cos((uv.y/i-iM.y)/i-sin(log(i)*iTime/pi)*i)
                               - iTime*i/pi
                                 ));
            temp *= gray;
            final += temp;
    }
    
    // Output to screen
    fragColor = vec4(gradient(final[0], 1.5), gradient(final[1], 2.0), gradient(final[2], 1.0), 1.0);
}
