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

// Dimension of textures : 0, 1, 2, 3 dimension, -1 if unused per Tex Unit
uniform	int			aaa_tex_dim[4];

// Size of Texture for each texture unit
uniform vec2		aaa_tex_0_size;

// 0 = time
// 1 = mouse X
// 2 = mouse Y
// 3 = steps -> from 0.1 to 10.0
uniform float		aaa_pu_float[6];

float noise(vec2 p)
{
	float sample = texture2D(aaa_tex2d[1],vec2(1.,2.*cos(aaa_pu_float[0]))*aaa_pu_float[0]*8. + p*1.).x;
	sample *= sample;
	return sample;
}

float onOff(float a, float b, float c)
{
	return step(c, sin(aaa_pu_float[0] + a*cos(aaa_pu_float[0]*b)));
}

float ramp(float y, float start, float end)
{
	float inside = step(start,y) - step(end,y);
	float fact = (y-start)/(end-start)*inside;
	return (1.-fact) * inside;
	
}

float stripes(vec2 uv)
{
	
	float noi = noise(uv*vec2(0.5,1.) + vec2(1.,3.));
	return ramp(mod(uv.y*4. + aaa_pu_float[0]/2.+sin(aaa_pu_float[0] + sin(aaa_pu_float[0]*0.63)),1.),0.5,0.6)*noi;
}

vec3 getVideo(vec2 uv)
{
	vec2 look = uv;
	float window = 1./(1.+20.*(look.y-mod(aaa_pu_float[0]/4.,1.))*(look.y-mod(aaa_pu_float[0]/4.,1.)));
	look.x = look.x + sin(look.y*10. + aaa_pu_float[0])/50.*onOff(4.,4.,.3)*(1.+cos(aaa_pu_float[0]*80.))*window;
	float vShift = 0.4*onOff(2.,3.,.9)*(sin(aaa_pu_float[0])*sin(aaa_pu_float[0]*20.) + 
										 (0.5 + 0.1*sin(aaa_pu_float[0]*200.)*cos(aaa_pu_float[0])));
	look.y = mod(look.y + vShift, 1.);
	vec3 video = vec3(texture2D(aaa_tex2d[0],look));
	return video;
}

vec2 screenDistort(vec2 uv)
{
	uv -= vec2(.5,.5);
	uv = uv*1.2*(1./1.2+2.*uv.x*uv.x*uv.y*uv.y);
	uv += vec2(.5,.5);
	return uv;
}

void main(void)
{
	vec2 uv = gl_FragCoord.xy / aaa_tex_0_size.xy;
	uv = screenDistort(uv);
	vec3 video = getVideo(uv);
	float vigAmt = 3.+.3*sin(aaa_pu_float[0] + 5.*cos(aaa_pu_float[0]*5.));
	float vignette = (1.-vigAmt*(uv.y-.5)*(uv.y-.5))*(1.-vigAmt*(uv.x-.5)*(uv.x-.5));
	
	video += stripes(uv);
	video += noise(uv*2.)/2.;
	video *= vignette;
	video *= (12.+mod(uv.y*30.+aaa_pu_float[0],1.))/13.;
	
	gl_FragColor = vec4(video,1.0);
}