Revision control

Copy as Markdown

{
"QEN": {
"description": "This node contains noise / hash helper functions which other nodes can utilize.",
"fragmentCode": [
"#define HASH_BOX_SIZE 1920U",
"#define PI 3.14159265359",
"#define TAU 6.28318530718",
"#define SQRT2 1.41421356237",
"",
"float hash21(vec2 n);",
"vec3 hash23(vec2 n);",
"float _hash11(uint n);",
"float _hash21( uvec2 x );",
"vec3 _hash13(uint n);",
"",
"// Hash from vec2 to float",
"// Can be used directly with fragCoord",
"float hash21(vec2 n)",
"{",
" uvec2 uin = uvec2(n);",
" return _hash21(uin);",
"}",
"",
"// Hash from vec2 to vec3",
"// Can be used directly with fragCoord",
"vec3 hash23(vec2 n)",
"{",
" uvec2 uin = uvec2(n);",
" return _hash13(uin.x + HASH_BOX_SIZE * uin.y);",
"}",
"",
"// Hash from uint to float",
"float _hash11(uint n)",
"{",
" n = (n << 13U) ^ n;",
" n = n * (n * n * 15731U + 789221U) + 1376312589U;",
" return float( n & uint(0x7fffffffU))/float(0x7fffffff);",
"}",
"",
"// Hash from uvec2 to float",
"float _hash21( uvec2 x )",
"{",
" uvec2 q = 1103515245U * ( (x>>1U) ^ (x.yx ) );",
" uint n = 1103515245U * ( (q.x ) ^ (q.y>>3U) );",
" return float(n) * (1.0/float(0xffffffffU));",
"}",
"",
"// Hash from uint to vec3",
"vec3 _hash13(uint n)",
"{",
" n = (n << 13U) ^ n;",
" n = n * (n * n * 15731U + 789221U) + 1376312589U;",
" uvec3 k = n * uvec3(n,n*16807U,n*48271U);",
" return vec3( k & uvec3(0x7fffffffU))/float(0x7fffffff);",
"}",
"",
"vec2 pseudo3dNoiseLevel(vec2 intPos, float t) {",
" float rand = hash21(intPos);",
" float angle = TAU * rand + t * rand;",
" return vec2(cos(angle), sin(angle));",
"}",
"",
"// Generates noise which resembles 3D perlin-noise",
"float pseudo3dNoise(vec3 pos) {",
" const vec2 i = floor(pos.xy);",
" const vec2 f = fract(pos.xy);",
" const vec2 blend = f * f * (3.0 - 2.0 * f);",
" float noiseVal = mix(",
" mix(",
" dot(pseudo3dNoiseLevel(i + vec2(0.0, 0.0), pos.z), f - vec2(0.0, 0.0)),",
" dot(pseudo3dNoiseLevel(i + vec2(1.0, 0.0), pos.z), f - vec2(1.0, 0.0)),",
" blend.x),",
" mix(",
" dot(pseudo3dNoiseLevel(i + vec2(0.0, 1.0), pos.z), f - vec2(0.0, 1.0)),",
" dot(pseudo3dNoiseLevel(i + vec2(1.0, 1.0), pos.z), f - vec2(1.0, 1.0)),",
" blend.x),",
" blend.y);",
" return noiseVal * SQRT2;",
"}",
"",
"@main"
],
"name": "NoiseHelper",
"version": 1
}
}