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

// 0 = time
// 1 = mouse X
// 2 = mouse Y
uniform float		aaa_fu_float[8];

// 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];


float noise2D(vec2 uv)
{
	uv = fract(uv)*1e3;
	vec2 f = fract(uv);
	uv = floor(uv);
	float v = uv.x+uv.y*1e3;
	vec4 r = vec4(v, v+1., v+1e3, v+1e3+1.);
	r = fract(1e5*sin(r*1e-2));
	f = f*f*(3.0-2.0*f);
	return (mix(mix(r.x, r.y, f.x), mix(r.z, r.w, f.x), f.y));
}

float fractal(vec2 p)
{
	float v = 0.15;
	p += 0.5;
	v += noise2D(p*0.01); v*=.5;
	v += noise2D(p*0.002); v*=.5;
	v += noise2D(p*0.03); v*=.5;
	v += noise2D(p*0.04); v*=.5;
	v += noise2D(p*0.005); v*=.5;
	return v;
}


float t(vec2 uv, float distort, float size)
{
	return 0.5*(sin(uv.x*size+distort)+cos(uv.y*size+distort));
}

void main(void)
{
	vec2 uv  = gl_TexCoord[0].st - 0.5;
	vec2 uv0 = uv;
	uv.x += cos( aaa_fu_float[0]*0.125 );
	uv.y += sin( aaa_fu_float[0]*0.125 );

	float x = t(uv, aaa_fu_float[0]*0.5, 20.0);
	float y = t(uv, aaa_fu_float[0]*0.5, 20.0);

	vec4 col = texture2D(aaa_tex2d[0], vec2((uv.x*x)+uv0.x,uv.y*y)+uv0.y)*t(vec2(x*uv.x,y*uv.y),aaa_fu_float[0]*2.0, 20.0);

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

	gl_FragColor = vec4( (src + fx) );

}










