
// Uniform variables for texturing
uniform sampler2D 	aaa_tex2d[4];


// Size of Texture for each texture unit
uniform vec2		aaa_tex_size[];

// 0 = time
// 1 = mouse X
// 2 = mouse Y
// 3 = zoom (from 0.01 to 1.0)
uniform float		aaa_fu_float[6];

// 0 = iterations
uniform int			aaa_fu_int[4];

// balance between texture and effect
uniform float		aaa_fu_src;
uniform float		aaa_fu_out;

// Colors factors
// 0 = src colors
// 1 = out color
uniform vec4		aaa_fu_vec4[8];



vec2 rotate(vec2 p, float angle)
{
	return vec2(p.x*cos(angle)-p.y*sin(angle),
				p.y*cos(angle)+p.x*sin(angle));
};

void main(void)
{

	//parameters
	const int iterations		= 18;
	const float scale			= 1.25;
	vec2 fold					= vec2( 0.5+sin(aaa_fu_float[0]*0.2),0.5 );
	const vec2 translate		= vec2( 3.0, 2.0 );
	const vec2 offset			= vec2( 0.0, 0.0 );
	float zoom					= aaa_fu_float[3]; //0.15; // 0.08; (pretty cool)
	const float brightness		= 4.0;
	const float contrast		= 5.0;
	const float saturation		= 0.55;
	const float texturescale	= 0.007;
	const float colspeed		= 0.1;
	const float antialias		= 4.0; //not exactly AA, just reused tweaked code :)

	const float rotspeed		=  0.1;
	const float reactionamount	= -0.3;
	const float timeshift		=  0.003;


	vec3 aacolor 	 = vec3( 0.0 );
	vec2 uv 	 	 = vec2(0.5) - gl_TexCoord[0].st;
	vec2 pos	 	 = uv;
	pos				+= offset;
	pos				/= zoom;
	vec2 pixsize 	 = max( 1.0/zoom, 100.0-aaa_fu_float[0]*50.0 )  / aaa_tex_size[0].xy;

	float gt = aaa_fu_float[0]*rotspeed*reactionamount;

	for( float aa=0.0; aa<25.0; aa++ )
	{
		float t = gt+aa*timeshift;

		if (aa+1.0>antialias*antialias)
			break;

		vec2 aacoord = floor( vec2(aa/antialias, mod(aa,antialias)) );
		vec2 p = pos+aacoord*pixsize/antialias;
		p -= fold;

		float expsmooth = 0.0;
		float average	= 0.0;
		float l = length(p);
		vec2 coord = vec2(0.0);

		for (int i=0; i<iterations; i++)
		{
			p = abs(p+fold)-fold;
			p = p*scale-translate;

			if (length(p)>20.0)
				break;

			p = rotate(p, t);
			coord += p;

		}
		average 	/= float(iterations);
		coord   	+= aaa_fu_float[0]*colspeed;
		vec3 color   = texture2D(aaa_tex2d[0],coord*texturescale).xyz;
			aacolor += color;
	}

	vec3 col = aacolor/(antialias*antialias);
	col		 = pow(col,vec3(contrast))*brightness;
	col		 = min(vec3(1.0), mix(vec3(length(col)),col,saturation));
	col		*= 1.0-length(uv*uv)*2.0;


	vec4 src = (texture2D(aaa_tex2d[0], gl_TexCoord[0].st) * aaa_fu_src) * aaa_fu_vec4[0];
	vec4 fx  = (vec4(col, 1.0) * aaa_fu_out) * aaa_fu_vec4[1];

	gl_FragColor = vec4( (src + fx) * 0.5 );
}





