// Inspired by Noise Value, from iq: https://www.shadertoy.com/view/lsf3WH

float hash(vec2 p)
{
    p  = 50.0*fract( p*0.3183099 + vec2(0.71,0.113));
    return -1.0+2.0*fract( p.x*p.y*(p.x+p.y) );
}

float noise( in vec2 p )
{
    vec2 i = floor( p );
    vec2 f = fract( p );
	
	vec2 u = f*f*(3.0-2.0*f);

    return mix( mix( hash( i + vec2(0.0,0.0) ), 
                     hash( i + vec2(1.0,0.0) ), u.x),
                mix( hash( i + vec2(0.0,1.0) ), 
                     hash( i + vec2(1.0,1.0) ), u.x), u.y);
}

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    vec2 p = fragCoord.xy / iResolution.xy;

	vec2 uv = p*vec2(iResolution.x/iResolution.y,1.0) + iTime*0.05;
	
	float f = 0.0;

    
    // fractal noise (4 octaves)
    
	uv *= 8.0;
    mat2 m = mat2( 1.8,  1.2, -1.4,  1.6 );
	f  = 0.5000*noise( uv ); uv = m*uv;
	f += 0.200*noise( uv ); uv = m*uv;
	f += 0.150*noise( uv ); uv = m*uv;
	f += 0.1*noise( uv ); uv = m*uv;
	

	f = 0.5 + 0.5*f;
	
	fragColor = vec4( f, f, 0.8, 1.0 );
}
