

#define POLES 32.0
#define SCALE 1.0

#define REFLECTIONS 10.0
// 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 = Thickness
// 4 = PI factor
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 ripple(float dist, float shift)
{
	return cos(64.0 * dist + shift) / (1.0 + 1.0 * dist);
}

void main(void)
{
	float larger = max(aaa_tex_size[0].x, aaa_tex_size[0].y) / SCALE;
	vec2 uv = gl_TexCoord[0].st -0.5;
	vec2 cursor = (aaa_tex_size[0].xy*0.5) / larger;

	float lum = 0.5;
	float mul = lum;
	float pi = 3.141592654;
	float twopi = 2.0 * pi;

	const float count = POLES;
	float fcount = float(count);

	vec2 rot = vec2(cos(twopi*.618),  sin(twopi*.618));
	vec2 tor = vec2(-sin(twopi*.618), cos(twopi*.618));
	float f = (0.7 + (1.0 + sin(mod(aaa_fu_float[0]/18.0, twopi))/4.0))/2.0;
	vec3 col = vec3(0.0, 0.0, 0.0);

	for (float i = 0.0; i < count; ++i)
	{
		lum += .2 * ripple(length(cursor - uv), -aaa_fu_float[0]);
		mul += .2 * ripple(length(cursor + uv * lum/16.0), -aaa_fu_float[0]/3.0);
		col += vec3(mod(i + 1.0, 3.0), 0.0, 0.0) * 0.06 * (mul - lum);
		col += vec3(0.0, mod(i + 2.0, 3.0), 0.0) * 0.06 * (lum - mul);
		col += vec3(0.0, 0.0, mod(i, 3.0)) * 0.06 * sqrt(mul * lum);
		cursor = cursor.x*rot*f + cursor.y*tor*f ;
	}


	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) );
}
