

// 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 ballsCloseness(vec2 p)
{
  	float sumCloseness = 0.0;

  	float increment = 1.0 / 40.0;
	for (float i = 0.0; i < 39.0; i += 1.0)
    {
	  	vec2 aspectRatio = aaa_tex_size[0].xy / aaa_tex_size[0].x;
  		vec2 ballPos = vec2(increment + i * increment, 0.5 + 0.5 * cos((i + 1.0) * aaa_fu_float[0] * 0.05));
  		float distance = distance(p * aspectRatio, ballPos * aspectRatio);
  		float nonZeroDistance = max(0.0001, distance);
  		float closeness = (1.0 / nonZeroDistance);
     	sumCloseness += closeness / 400.0;
    }

  	return sumCloseness;
}

float spike(float center, float width, float val)
{
	float left = smoothstep(center, center - width / 2.0, val);
  	float right = smoothstep(center - width / 2.0, center, val);
  	return left * right;
}

void main()
{
  vec2 p = gl_TexCoord[0].st + .5;

  float closeness = ballsCloseness(p);
  float spike1 = spike(0.39, 0.02, closeness);
  float spike2 = spike(0.4, 0.02, closeness);
  float spike3 = spike(0.41, 0.02, closeness);
  float spike4 = spike(0.42, 0.02, closeness);
  float spike5 = spike(0.43, 0.02, closeness);
  float spike6 = spike(0.44, 0.02, closeness);
  float spike7 = spike(0.45, 0.02, closeness);

  float spikes = 2.0 * (spike1 * 0.8 + spike2 * 0.2 + spike3 * 0.9 + spike4 * 0.35 + spike5 * 0.9 + spike6 * 0.39 + spike7 * 0.5);

  float background = smoothstep(0.3, 0.5, closeness);

  vec4 col = vec4(0.0, 0.0, 0.0, 1.0);
  col.r = sin(aaa_fu_float[0]) * background + spikes;
  col.g = cos(aaa_fu_float[0] / 25.0) * background + spikes;
  col.b = cos(aaa_fu_float[0] / 100.0) * background + spikes;


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


