/// Valence - EnigmaCurry
/// Adapted from Kaleidoscope demo by darkeclipz https://www.shadertoy.com/view/WdBGzV
mat2 r2(float angle) { return mat2(cos(angle), sin(angle), tan(angle), cos(angle)); }
#define R iResolution.xy

vec4 kaleidescope1(vec2 fragCoord, float fft, float i) {
   fft = smoothstep(0., sin(iTime)+1., fft);
    float Iterations = smoothstep(0., 200., fft) * 10.0 * atan(sin(iTime/23.)+1.);
    
    // Normalized pixel coordinates (from 0 to 1)
    vec2 uv = (2.*fragCoord-R)/iResolution.y;
	vec3 col = vec3(0);
    float s = smoothstep(0., 0.001, iTime/60. * i * atan(sin(iTime/322.)+1.));

    // https://www.shadertoy.com/view/Mss3Wf
    for(float ii=0.; ii < Iterations; ii++) {
    	uv = abs(uv) - s * uv.y; 
        uv.xy *= r2(iTime/6. + 12.*ii*i);
        uv *= 2.1 * fft*fft*i;
    }
    
    float dist = length(fract(sin(iTime/fft*22.)*12.*uv));
    vec3 rainbow = cos(vec3(10.,3.,999. * fft) + iTime/222. + 2.*uv.xyx);
    col = rainbow/dist*(uv.y/uv.x);
    
    float gridSize = 2.;
    float gridWidth = 100.5;
    vec2 grid = smoothstep(gridWidth, 0., abs(fract(gridSize*uv)-gridWidth));
    col = mix(col, vec3(1), clamp(22.*i * fft * (grid.x / grid.y), 0., 0.018)) * fft/44.; 

    return vec4(col/uv.x+0.001*fft*i,1.0);
}

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    float fft = clamp(texture( iChannel0, vec2(0.1,0.1) ).x * 12., 0.2, 99999.);
    fragColor = kaleidescope1(fragCoord, fft,1.);
    fragColor += kaleidescope1(fragCoord+vec2(-200. * sin(fft/2.),100.), fft,2.);
    fragColor += kaleidescope1(fragCoord+vec2(+200. * sin(fft/2.),100.), fft,3.);
    fragColor += kaleidescope1(fragCoord-vec2(0.,500.)*sin(iTime/fft*0.02), fft,4.);
}
