/*
* License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.
* Created by bal-khan
*/

// Fabrice reduce to 578c

vec2 cmult(vec2 a, vec2 b) { return mat2(a,-a.y,a.x)  * b; }

void	mainImage( out vec4 O, vec2 U ) {
    vec2  R = iResolution.xy, dist,
         uv = ( U - R/2. ) / R.y;
    vec4  z = vec4(16.*abs(uv),0,0);

    float t = iTime*.25,
    	  r = 1.,
          i;
    
    for (i = 0.; i < 12.; ++i)  {
        r = -r;
        z.xy = cmult(z.xy, vec2(1));
        z.xy = abs(z.xy) -10.5+r;
		z.xy = cmult(z.xy, vec2(sin(t),cos(t)) );	
        z.zw = 2. * (z.xy*z.z - z.yx*z.w);
        if ( i > 0. && min(abs(z.x),abs(z.y)) < .51 ) {
            O.xy = exp(-abs(z.xy*z.x*z.y)); 
    	    O.z  = exp(-abs(min(z.x,z.y)));
            break;
        }
     	O.xy += .2*exp(-abs(-z.xy/i+i/z.xy));
    	O.z  += .2*exp(-abs((z.x+z.y)/i-i/(z.x+z.y)));
        
        dist.x = dot(z.xy,z.xy);
		dist.y = dot(z.zw,z.zw);
        if (max(dist.x,dist.y) > 1e7 )
            break;
    }
}



/*
#define I_MAX 12
float	t;
vec2 	cmult(vec2 a, vec2 b);
vec2	cadd(vec2 a, vec2 b);
vec2	g(vec2 n);
vec2	dg(vec2 n);
vec2	cdiv(vec2 a, vec2 b);

void	mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    t = iTime*.25;
    vec2 R = iResolution.xy,
          uv  = vec2(fragCoord-R/2.) / R.y;
    vec4	z = vec4(0.0, 0.0, 0.0, 0.0);
    vec2	of = 2.*vec2( abs(uv.x )/0.125, abs(uv.y )/0.125);
    vec3	col = vec3(0.0);
    vec2	dist = vec2(0.0);
    z.xy = of;
    int ii = -1;
    float	param_i = .0;
    float	r = 1.;
    for (int i = -1; i < I_MAX; ++i)
    {
        r*=-1.;
        ++ii;
        z.xy = float(ii)*.1251*0.+cmult(z.xy, vec2(1.,1.)).xy;
        z.xy = abs(z.xy)-10.5+r;
		z.xy = cmult(z.xy, vec2(sin(t*1.), cos(t*1.) )-0.*vec2(1., -1.) );	
        z.z = 2.0 * (z.x*z.z - z.y*z.w);
        z.w = 2.0 * (z.y*z.z - z.x*z.w);
        dist.x = dot(z.xy,z.xy);
		dist.y = dot(z.zw,z.zw);
        if ( float(ii) > 0.
            &&
            (
             sqrt(z.x*z.x -float(ii)*.0) < .51
            ||
             sqrt(z.y*z.y -float(ii)*.0) < .51
                )
           )
        {
        col.x = exp(-abs(z.x*z.x*z.y)-0.*abs(cos(float(ii)*.06125+t*8.)) )*1.; // expensive but pretty
    	col.y = exp(-abs(z.y*z.x*z.y)-0.*abs(cos(float(ii)*.06125+t*8.)) )*1.;
    	col.z = exp(-abs(min(z.x,z.y)-0.*abs(cos(float(ii)*.06125+t*8.)) ))*1.;
            break;
        }

     	col.x += .1*exp(-abs(-z.x/float(ii)+float(ii)/z.x))*2.; // expensive but pretty
    	col.y += .1*exp(-abs(-z.y/float(ii)+float(ii)/z.y))*2.;
    	col.z += .1*exp(-abs((-z.x-z.y)/float(ii)+float(ii)/(z.x+z.y)))*2.;
        if (dist.x > 10000000.0 || dist.y > 100000000000.0)
            break;
    }
    fragColor = 1.*vec4(col, 1.0);
}

vec2 	cmult(vec2 a, vec2 b)
{
    return (vec2(a.x * b.x - a.y * b.y, a.x * b.y + a.y * b.x));
}

vec2	cadd(vec2 a, vec2 b)
{
	return (vec2(a.x + b.x, a.y + b.y));
}

vec2 g(vec2 n) {
    return vec2(
        n.x*n.x*n.x - 3.*n.x*n.y*n.y - 100.,
        -n.y*n.y*n.y + 3.*n.x*n.x*n.y
    );
}

vec2 dg(vec2 n) {
    return 2. * vec2(
        n.x*n.x - n.y*n.y,
        2. * n.x * n.y
    );
}

vec2 cdiv(vec2 a, vec2 b) {
    float d = dot(b, b);
    if(d == 0.) return a;
    else return vec2(
        (a.x*b.x + a.y*b.y),
        (a.y*b.x - a.x*b.y)) / d;;
}
*/
