

// float noise3D(vec3 pos) {
//     vec3 p  = floor(pos); 
//     vec3 b  = fract(pos);

//     vec2 uv = (p.xy-3.0*sin(pos.z))+b.xy;
//     vec2 rg = textureLod(noisetex, (uv)*noiseResInv, 0.0).xy;

//     return (mix(rg.x, rg.y, 0.5));
// }

vec3 hash(vec3 p3)
{
	p3 = fract(p3 * vec3(.1031));
	p3 += dot(p3, p3.yxz+19.19);
	return fract((p3.xxy + p3.yxx)*p3.zyx);
}

vec3 noise3( in vec3 x )
{
	vec3 p = floor(x);
	vec3 f = fract(x);
	f = f*f*(3.0-2.0*f);
	
	return mix(	mix(mix( hash(p+vec3(0,0,0)), 
						hash(p+vec3(1,0,0)),f.x),
					mix( hash(p+vec3(0,1,0)), 
						hash(p+vec3(1,1,0)),f.x),f.y),
				mix(mix( hash(p+vec3(0,0,1)), 
						hash(p+vec3(1,0,1)),f.x),
					mix( hash(p+vec3(0,1,1)), 
						hash(p+vec3(1,1,1)),f.x),f.y),f.z);
}

const mat3 m3 = mat3( 0.00,  0.80,  0.60,
					-0.80,  0.36, -0.48,
					-0.60, -0.48,  0.64 );
// float fbm(in vec3 q)
// {
// 	vec3 f  = 0.5000*noise3( q ); q = m3*q*2.01;
// 	f += 0.2500*noise3( q ); q = m3*q*2.02;

// 	return f.x;
// }

// vec4 blueNoiseTemporal(vec2 coord) {
// 	return (fract(texelFetch(noisetex, ivec2(coord + frameTimeCounter*666)%noiseRes, 0)));
// }
vec4 blueNoiseTemporal(vec2 coord) {
	return fract(texelFetch(noisetex, ivec2(coord)%noiseRes, 0) + torroidalShift*float(frameCounter%9999999));
}

vec4 blueNoiseStatic(vec2 coord) {
	return texelFetch(noisetex, ivec2(coord)%noiseRes, 0);
}