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

// Dimension of textures : 0, 1, 2, 3 dimension, -1 if unused per Tex Unit
uniform	int			aaa_tex_dim[4];

// Size of Texture for each texture unit
uniform vec2		aaa_tex_0_size;

// 0 = time
// 1 = mouse X
// 2 = mouse Y
uniform float		aaa_pu_float[6];


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(.5+sin(aaa_pu_float[0]*0.2),0.5);
	const vec2 translate	= vec2(3.0,2.0);
	const vec2 offset		= vec2(0.0,0.0);
	const float zoom		= 0.15;
	const float brightness	= 2.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.);
	vec2 uv=gl_FragCoord.xy / aaa_tex_0_size.xy-.5;
	vec2 pos=uv;
	float aspect=aaa_tex_0_size.y/aaa_tex_0_size.x;
	pos.y*=aspect;
	pos+=offset;
	pos/=zoom; 
	vec2 pixsize=max(1./zoom,100.0-aaa_pu_float[0]*50.0)/aaa_tex_0_size.xy;
	pixsize.y*=aspect;
	
	float gt=aaa_pu_float[0]*rotspeed*reactionamount;
	
	for (float aa=0.; aa<25.0; aa++) 
	{
		float t=gt+aa*timeshift;
		if (aa+1.>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_pu_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;
	gl_FragColor = vec4(col,1.0);
}