
uniform vec2 iResolution;
uniform float iGlobalTime;
uniform sampler2D iChannel0;
uniform sampler2D iChannel1;
uniform float iQuality; // from 1.0 to 96.0;


vec4 material(vec2 uv)
{
	float t = iGlobalTime;
	uv += texture2D(iChannel1,uv*sin(t*.001)*.1).xy*.02;
	uv += texture2D(iChannel1,uv*sin(t*.001)*.02).xy*.1;

	float q = texture2D(iChannel0,uv*.2).y;

	q-=.5+sin(t+sin(uv.x)+sin(uv.y))*.6; q*=2.0;q=abs(q);
	q=1.0/(q*16.0+1.0);

	// V 1
	//return vec4(q);

	// V 2
	vec4 c=vec4(q)*texture2D(iChannel0,uv*.1);
	return c*texture2D(iChannel1,uv*.001);
}



float hash(vec2 x)
{
	return fract(cos(dot(x.xy,vec2(2.31,53.21))*124.123)*412.0);
}

float hash(float x)
{
	//decent hash for noise generation
	return fract(sin(x*.0127863)*17143.321);
}


void main(void)
{
	vec2 uv = gl_FragCoord.xy / iResolution.xy -.5;
	uv.x*= iResolution.x /iResolution.y;

	vec3 color = vec3(0);

	float t2 = iGlobalTime;
	t2 = cos(t2*.3)*cos(t2*.1)*cos(t2*0.7)*2.0;

	float invQuality = (1.0 / iQuality);

	for (float i = 0.0; i<1.0; i+=invQuality )
	{
		float t = t2;
		float fi = hash(uv*0.0005+vec2(i,t));
		fi=fi*fi;

		vec2 uv2 = uv * mat2(sin(t),cos(t),-cos(t), sin(t)) * 2.0;
		uv2 = uv2 *(fi*0.15+0.5);
		uv2.x += iGlobalTime;
		color += material(uv2).xyz*invQuality*3.5;

	}

	color -= vec3(length(uv*0.1));
	color += hash(uv)*0.01;
	color  = mix(color,vec3(length(color)),length(color)-0.5);


	gl_FragColor = vec4(color,1.0);
}