float seed=0.;
float hash(float x)
{
    return fract(seed+sin(x*556.4556+123.3*seed)*453.54);
}
float cubic(float x,float a,float da,float b, float db)
{
    vec4 abcd = vec4(2.*a-2.*b+da+db,-3.*a+3.*b-2.*da-db,da,a);
    return x*x*x*abcd.x+x*x*abcd.y+x*abcd.z+abcd.w;
}

float cubicnoise1(float t)
{
    float T=floor(t);
    float a = hash(T++);
    float b = hash(T++);
    float c = hash(T++);
    float d = hash(T);
    float db =(c-a)*.5;
    float dc =(d-b)*.5;
    return cubic(fract(t),b,db,c,dc)*2.-1.;
}
float fbm1(float t)
{
    float n =cubicnoise1(t);
    n+=cubicnoise1(2.*t)/2.;
    n+=cubicnoise1(4.*t)/4.;
    n+=cubicnoise1(8.*t)/8.;
    return n;
}
vec2 Ccubn(float t)
{
    t*=.2;
    seed++;
    return vec2(fbm1(t),fbm1(.5-t));
}

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
	vec2 uv = 5.*(2.*fragCoord.xy - iResolution.xy)/iResolution.x;
    mat2 z = mat2(uv.x,-uv.y,uv.yx);
	vec2 a,b,c,d;
    a=Ccubn(iDate.w);
    b=Ccubn(iDate.w);
    c=Ccubn(iDate.w);
    d=Ccubn(iDate.w);

	vec2 i = c*z+d;
	i*= vec2(1,-1)/dot(i,i);
	uv =(a*z+b)*mat2(i.x,-i.y,i.yx); //formula is m(z)=(az+b)/(cz+d)
    uv-=1.;
    //uv= mod(uv,2.)-1.;
	//fragColor = vec4(.5/length(uv),1.-abs(uv),1.0);
    fragColor = texture(iChannel0,uv);
}
