

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


vec3 field(vec3 p)
{
	p *= .1;
	float f = .1;
	for (int i = 0; i < 4; i++)
	{
		p = p.yzx * mat3( .8,.6,0,-.6,.8,0,0,0,1);
		p += vec3(.123,.456,.789) * aaa_fu_float[4] * 1;
		p = abs(fract(p)-.5);
		p *= 2.0;
		f *= 2.0;
	}
	p *= p;
	return sqrt(p+p.yzx) / f-.035;
}

void main( void )
{
	float jit = aaa_fu_float[3] * .3 - .4;
	//if (mod(aaa_fu_float[0], 1.1) < 0.5) jit = 0.001;
	vec3 dir = normalize(vec3(	gl_TexCoord[0].st ,aaa_fu_float[5]+2.) );
	float a = sin(aaa_fu_float[1] * 3.14159 );
	float b = sin(aaa_fu_float[2] * 3.14159 );
	vec3 pos = vec3( 0.0, 0.0, aaa_fu_float[0] );

	dir *= mat3( 1,0,0,				0, cos(a),-sin(a),	0,sin(a),cos(a) );
	dir *= mat3( cos(b),0,-sin(b),	0,1,0,				sin(b),0,cos(b) );
	vec3 color = vec3(0);
	for( int i = 0; i < aaa_fu_int[0]; i++)
	{
		vec3 f2 = field(pos);
		float f = min( min( f2.x, f2.y) ,f2.z );

		pos += dir*f;
		color += float(aaa_fu_int[0]-i)/(f2+jit);
	}
	vec3 color3 = vec3( 1.-1./(1.+color*(.09/float(aaa_fu_int[0]*aaa_fu_int[0]))) );
	color3 = pow( color3, (aaa_fu_float[6] + 2. )  );
	vec4 col = vec4( vec3(1.) , (color3.r+color3.g+color3.b) - aaa_fu_float[7] );

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

	gl_FragColor.xyz = src.xyz + fx.xyz ;
	gl_FragColor.w = fx.a;
}




