
// 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
uniform float		aaa_fu_float[6];

// 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 sample(const int x, const int y)
{
	vec2 uv = gl_TexCoord[0].st + vec2(x, y) / aaa_tex_size[0].xy;
	return texture2D(aaa_tex2d[0], uv).xyz;
}

float luminance(vec3 c)
{
	return dot(c, vec3(0.2126, 0.7152, 0.0722));
}

vec3 edge(void)
{
	vec3 hc =sample(-1,-1) *  1.0 + sample( 0,-1) *  2.0
		 	+sample( 1,-1) *  1.0 + sample(-1, 1) * -1.0
		 	+sample( 0, 1) * -2.0 + sample( 1, 1) * -1.0;

	vec3 vc =sample(-1,-1) *  1.0 + sample(-1, 0) *  2.0
		 	+sample(-1, 1) *  1.0 + sample( 1,-1) * -1.0
		 	+sample( 1, 0) * -2.0 + sample( 1, 1) * -1.0;

	return sample(0, 0) * pow(luminance(vc*vc + hc*hc), 0.6);
}

void main(void)
{
	vec4 src = (texture2D(aaa_tex2d[0], gl_TexCoord[0].st) * aaa_fu_src) * aaa_fu_vec4[0];
	vec4 fx  = (vec4(edge(), 1.0) * aaa_fu_out) * aaa_fu_vec4[1];

	gl_FragColor = vec4( (src + fx) );
}






