/* Creative Commons Licence Attribution-NonCommercial-ShareAlike 
   phreax 2020
*/

#define PI 3.141592
#define TAU 2.*PI
#define hue(v) ( .6 + .6 * cos( 6.3*(v) + vec3(0,23,21) ) )
#define rot(a) mat2(cos(a), sin(a), -sin(a), cos(a))
#define COUNT 30.
#define N 5.
#define DISTORT .7
#define SQR(x) ((x)*(x))


float tt;

vec2 kalei(vec2 uv) { 
    float n = N;
    float r = TAU/n;
    
    for(float i=0.; i<n; i++) {     
    	uv = abs(uv);
        uv.x -= .2*i+.2;
    	uv *= rot(r*i-.09*tt);
    }
    
    uv = abs(uv) - (sin(.15*tt)+1.2);

    return uv;
}


float flower(vec2 uv) {
    float n = 3.;
    float a = atan(uv.y,uv.x);

    float d = length( uv) - cos(a*n);
    return smoothstep(fwidth(d), 0., abs(d));    
}


vec3 spiral(vec2 uv, float i) {  
    uv *= rot(i*PI+tt*.3);
    uv += DISTORT*sin(5.*uv.yx);
	return flower(uv)*SQR(hue(i+tt*.2));
}

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
	vec2 uv = (fragCoord-.5*iResolution.xy)/iResolution.y;
    vec3 col = vec3(0);
    tt = iTime;
    
    uv = kalei(uv*5.);

    float s = 1./COUNT;
	
    for(float i=0.; i<1.; i+=s) {   
        float z = fract(i-.1*tt);
        float fade = smoothstep(0., .1, 1.-abs(2.*z-1.));
        col += spiral(uv*z, i)*fade;
    }

    col = sqrt(col);
    fragColor = vec4(col,1.);
}
