vec2 kale(vec2 uv, float angle, float base, float spin) {
	float a = atan(uv.y,uv.x)+spin;
	float d = length(uv);
	a = mod(a,angle*2.0);
	a = abs(a-angle);
	uv.x = sin(a+base)*d;
	uv.y = cos(a+base)*d;
    return uv;
}

vec4 dcAdd( vec4 a, vec4 b )
{
    return a + b;
}

vec4 dcMul( vec4 a, vec4 b )
{
    return vec4( a.x*b.x - a.y*b.y,
				 a.x*b.y + a.y*b.x,
				 a.x*b.z + a.z*b.x - a.y*b.w - a.w*b.y,
				 a.x*b.w + a.w*b.x + a.z*b.y + a.y*b.z );
}

vec4 dcSqr( vec4 a )
{
    return vec4( a.x*a.x - a.y*a.y,
				 2.0*a.x*a.y,
				 2.0*(a.x*a.z - a.y*a.w),
				 2.0*(a.x*a.w + a.y*a.z) );
}

//--------------------------------------------------

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    float pi = 3.14159265359;
    vec2 p = -1.0 + 2.0 * fragCoord.xy / iResolution.xy;
    p.x *= iResolution.x/iResolution.y;


    p = kale(p, pi/6.0, iTime*0.1*pi, pi/2.0);
    // animation
	//float tz = 0.5 + cos(0.0111225*iTime);
    //float zo = pow( 0.5, 1.0*tz );
    float tz = 0.5 - 0.5*cos(0.225*iTime);
    float zo = pow( 0.5, 13.0*tz );

    vec4 c = vec4( vec2(-0.05,.6805) + p*zo, 1.0, 0.0 );

	float m2 = 1.0;
    float co = 0.0;

	vec4 z = vec4( 0.0, 0.0, 0.0, 0.0 );

    for( int i=0; i<256; i++ )
    {
        if( m2>1024.0 ) continue;

        // Z -> ZÂ² + c
		z = dcAdd( dcSqr(z), c );

		m2 = dot( z.xy, z.xy );
        co += 1.0;
    }

    // distance
	// d(c) = |Z|Â·log|Z|/|Z'|
	float d = 0.0;
	if( co<256.0 ) d = sqrt( dot(z.xy,z.xy)/dot(z.zw,z.zw) )*log(dot(z.xy,z.xy));


    // do some soft coloring based on distance
	d =  4.0*d/zo, 0.0, 1.0 ;
	d = pow( d, 0.825 );
    vec3 col = vec3( d );


    vec2 q = p;

    // Time varying pixel color
   	vec3 bol = 0.8 + 0.2*sin(iTime+p.xxx+vec3(0,2,6)) - 0.2*cos(iTime+p.yyy+vec3(6,1,3));
    bol /= vec3( p+d, vec2(atan(p.y,p.x*p.x), .2/p.y)+iTime );
    float r = 0.5 + 0.4 * cos(atan(q.y,q.x)*16.0*sin(iTime+q.x-q.y) - 32.0*q.x*q.y*(cos(iTime+q.x-q.y)));
    bol *= smoothstep(d*2., r-0.1-zo/2.0, length(atan(q.x,q.y)-d+1.0));

    fragColor = vec4(bol, 1.0 );
}

