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

// 0 = time
// 1 = mouse X
// 2 = mouse Y
// 3 = line weight
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 time = aaa_fu_float[0];

float e( vec3 c )
{
	c=cos(vec3(cos(c.r+time/8.0)*c.r-cos(c.g+time/9.0)*c.g,c.b/3.0*c.r-cos(time/7.0)*c.g,c.r+c.g+c.b/1.25+time));
	return dot(c*c,vec3(1.0))-1.0;
}

void main(void)
{
  vec2 c = gl_TexCoord[0].st;
  vec3 o = vec3( c.r, c.g+cos(aaa_fu_float[0]/2.0)/30., 0 );
  //o *= aaa_fu_float[5] * 10.;
  vec3 g = vec3( c.r+cos(aaa_fu_float[0])/30.0, c.g, 1.0) / 64.0 ;
  float m = 1.0;
  float t = 0.0;
  for( int j=0; j<aaa_fu_int[0]; j++)
  {
    if( m > aaa_fu_float[1] ) //0.4 )
    {
      t = (1.0+float(j)) * 2.;
      m = e( o + g*t );
    }
  }
  vec3 r=vec3(0.1, 0.0, 0.0);
  vec3 n=m-vec3( e(vec3(o+g*t+r.rgg)),
  e(vec3(o+g*t+r.grg)),
  e(vec3(o+g*t+r.ggr)) );
  vec3 v=vec3(dot(vec3(0.0, 0.0, -0.5),n)+dot(vec3(0.0, -0.5, 0.5),n));

  vec4 col = vec4(v + vec3(1,1,1)*.2*(t/41.0),1.0);

  float f = smoothstep( aaa_fu_float[2], aaa_fu_float[3], col.r );
  vec4 fx  = mix( aaa_fu_vec4[1], aaa_fu_vec4[2], f ); // * aaa_fu_vec4[1];

  fx *= aaa_fu_out;
  if( aaa_fu_src > 0. )
  {
    vec4 src = (texture2D(aaa_tex2d[0], gl_TexCoord[0].st) * aaa_fu_src) * aaa_fu_vec4[0];
    gl_FragColor = vec4( (src + fx) );
  }
  else
  {
    gl_FragColor = fx;
  }
}