//basically makes fine noise
float rand(vec2 num)
{
return fract(sin(dot(num,vec2(12.9898,4.1414)))*43759.5453);
}

//bigger noise
float noise (vec2 p ){
    vec2 ip = floor(p);
    vec2 u = fract(p);
    u = u*u*(3.0-2.0*u);
    
    float res = mix(
    mix(rand(ip), rand(ip+vec2(1.0,0.0)), u.x),
    mix(rand(ip+vec2(0.0,1.0)), rand(ip+vec2(1.0,1.0)), u.x), u.y);
    return res*res;
}

const mat2 m2 = mat2(0.8, -0.6, 0.6, 0.8);

float fbm(in vec2 p){
    float f = 0.0;
    f+= 0.5*noise(p);
    p = m2*p*2.5;
    f+=0.25*noise(p);
    p = m2*p*0.5;
    f+=0.125*noise(p);
   // p = m2*p*10.;
   // f+=0.0625*noise(p);
    return f;
}
float pattern (in vec2 p)
{
    vec2 q = vec2(fbm(p+vec2(0.0,0.0)));
    vec2 r = vec2(fbm(p-10.0*q + vec2(0,20.)));
    r+=iTime*0.05;
    return fbm(p+1.76*r);
    
}
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    // Normalized pixel coordinates (from 0 to 1)
    vec2 uv = fragCoord/iResolution.xy;
    uv*= 2.;
    //uv+= vec2(1.0,0.0);
    // Output to screen
    //fragColor = vec4(col,1.0);
    float disp =pattern(uv)*pattern(uv);
    vec3 color = vec3(disp*2., disp*4., disp*7.);
    
    fragColor = vec4(color, 1);
}
