Constant NOISE
Source pub const NOISE: &str = "fn pcg(v: u32) -> u32 {\n let s = v * 747796405u + 2891336453u;\n let w = ((s >> ((s >> 28u) + 4u)) ^ s) * 277803737u;\n return (w >> 22u) ^ w;\n}\n\nfn hash3_xor(p: vec3i) -> f32 {\n let h = u32(p.x) * 73856093u ^ u32(p.y) * 19349663u ^ u32(p.z) * 83492791u;\n return f32(pcg(h) >> 8u) / 16777216.0;\n}\n\nfn hash3_nested(p: vec3i) -> f32 {\n let h = pcg(u32(p.x) * 73856093u ^ pcg(u32(p.y) * 19349663u ^ pcg(u32(p.z) * 83492791u)));\n return f32(h >> 8u) / 16777216.0;\n}\n\nfn hash2(p: vec2i, seed: u32) -> f32 {\n var h = u32(p.x) * 0x8da6b343u ^ u32(p.y) * 0xd8163841u;\n h ^= seed;\n h ^= h >> 15u;\n h *= 0x2c1b3c6du;\n h ^= h >> 12u;\n h *= 0x297a2d39u;\n h ^= h >> 15u;\n return f32(h >> 8u) / 16777216.0;\n}\n\nfn value_noise3(p: vec3f, nested: bool) -> f32 {\n let i = vec3i(floor(p));\n let f = fract(p);\n let u = f * f * (3.0 - 2.0 * f);\n var a0: f32;\n var a1: f32;\n var a2: f32;\n var a3: f32;\n var b0: f32;\n var b1: f32;\n var b2: f32;\n var b3: f32;\n if (nested) {\n a0 = hash3_nested(i);\n a1 = hash3_nested(i + vec3i(1, 0, 0));\n a2 = hash3_nested(i + vec3i(0, 1, 0));\n a3 = hash3_nested(i + vec3i(1, 1, 0));\n b0 = hash3_nested(i + vec3i(0, 0, 1));\n b1 = hash3_nested(i + vec3i(1, 0, 1));\n b2 = hash3_nested(i + vec3i(0, 1, 1));\n b3 = hash3_nested(i + vec3i(1, 1, 1));\n } else {\n a0 = hash3_xor(i);\n a1 = hash3_xor(i + vec3i(1, 0, 0));\n a2 = hash3_xor(i + vec3i(0, 1, 0));\n a3 = hash3_xor(i + vec3i(1, 1, 0));\n b0 = hash3_xor(i + vec3i(0, 0, 1));\n b1 = hash3_xor(i + vec3i(1, 0, 1));\n b2 = hash3_xor(i + vec3i(0, 1, 1));\n b3 = hash3_xor(i + vec3i(1, 1, 1));\n }\n let a = mix(mix(a0, a1, u.x), mix(a2, a3, u.x), u.y);\n let b = mix(mix(b0, b1, u.x), mix(b2, b3, u.x), u.y);\n return mix(a, b, u.z);\n}\n\nfn fbm3(p: vec3f, octaves: i32, nested: bool) -> f32 {\n return fbm3_filtered(p, octaves, max(length(dpdx(p)), length(dpdy(p))), nested);\n}\n\nfn octave_weight(footprint: f32) -> f32 {\n let t = clamp((footprint - 0.5) * 2.0, 0.0, 1.0);\n return 1.0 - t * t * (3.0 - 2.0 * t);\n}\n\nfn fbm3_filtered(p: vec3f, octaves: i32, footprint: f32, nested: bool) -> f32 {\n var sum = 0.0;\n var amp = 0.5;\n var q = p;\n var width = footprint;\n for (var i = 0; i < max(octaves, 0); i++) {\n let weight = octave_weight(width);\n if (weight == 1.0) {\n sum += amp * value_noise3(q, nested);\n } else if (weight == 0.0) {\n sum += amp * 0.5;\n } else {\n sum += amp * (weight * value_noise3(q, nested) + (1.0 - weight) * 0.5);\n }\n q = q * 2.03 + vec3f(1.7, 9.2, 3.1);\n amp *= 0.5;\n width *= 2.03;\n }\n return sum;\n}\n\nfn noise2(p: vec2f, seed: u32) -> f32 {\n let i = vec2i(floor(p));\n let f = fract(p);\n let u = f * f * (3.0 - 2.0 * f);\n let a = mix(hash2(i, seed), hash2(i + vec2i(1, 0), seed), u.x);\n let b = mix(hash2(i + vec2i(0, 1), seed), hash2(i + vec2i(1, 1), seed), u.x);\n return mix(a, b, u.y);\n}\n\nfn hash21(p: vec2f) -> f32 {\n var q = fract(p * vec2f(123.34, 456.21));\n let d = q.x * (q.x + 45.32) + q.y * (q.y + 45.32);\n q += vec2f(d);\n return fract(q.x * q.y);\n}\n\nfn value_noise2_signed(p: vec2f) -> f32 {\n let i = floor(p);\n let f = fract(p);\n let u = f * f * (3.0 - 2.0 * f);\n let a = mix(hash21(i), hash21(i + vec2f(1.0, 0.0)), u.x);\n let b = mix(hash21(i + vec2f(0.0, 1.0)), hash21(i + vec2f(1.0, 1.0)), u.x);\n return mix(a, b, u.y) * 2.0 - 1.0;\n}\n\nfn flow(p: vec2f, time: f32) -> f32 {\n let warp = vec2f(\n value_noise2_signed(p * 0.006 + vec2f(time * 0.010, 3.1)),\n value_noise2_signed(p * 0.006 + vec2f(7.7, -time * 0.008)),\n );\n return value_noise2_signed(p * 0.009 + warp * 1.6 + vec2f(time * 0.006, 0.0)) * 0.65\n + value_noise2_signed(p * 0.021 - warp + vec2f(0.0, time * 0.009)) * 0.35;\n}\n\nfn lattice_plane_x(i: vec3i) -> vec4f {\n return vec4f(\n hash3_xor(i),\n hash3_xor(i + vec3i(0, 1, 0)),\n hash3_xor(i + vec3i(0, 0, 1)),\n hash3_xor(i + vec3i(0, 1, 1)),\n );\n}\n\nfn lattice_plane_y(i: vec3i) -> vec4f {\n return vec4f(\n hash3_xor(i),\n hash3_xor(i + vec3i(1, 0, 0)),\n hash3_xor(i + vec3i(0, 0, 1)),\n hash3_xor(i + vec3i(1, 0, 1)),\n );\n}\n\nfn lattice_plane_z(i: vec3i) -> vec4f {\n return vec4f(\n hash3_xor(i),\n hash3_xor(i + vec3i(1, 0, 0)),\n hash3_xor(i + vec3i(0, 1, 0)),\n hash3_xor(i + vec3i(1, 1, 0)),\n );\n}\n\nfn bilerp4(p: vec4f, u: f32, v: f32) -> f32 {\n return mix(mix(p.x, p.y, u), mix(p.z, p.w, u), v);\n}\n\nfn fade_cubic(f: f32) -> f32 {\n return f * f * (3.0 - 2.0 * f);\n}\n\nfn value_noise3_gradient(p: vec3f, scale: f32) -> vec3f {\n let q = p * scale;\n let footprint = max(length(dpdx(q)), length(dpdy(q)));\n let weight = octave_weight(footprint);\n if (weight == 0.0) {\n return vec3f(0.0);\n }\n let i = vec3i(floor(q));\n let f = fract(q);\n let u = fade_cubic(f.x);\n let v = fade_cubic(f.y);\n let w = fade_cubic(f.z);\n let left = floor(q - vec3f(0.35)) != floor(q);\n let right = floor(q + vec3f(0.35)) != floor(q);\n let x0 = lattice_plane_x(i);\n let x1 = lattice_plane_x(i + vec3i(1, 0, 0));\n var xlo = x0;\n var xhi = x1;\n if (left.x) {\n xlo = lattice_plane_x(i - vec3i(1, 0, 0));\n }\n if (right.x) {\n xhi = lattice_plane_x(i + vec3i(2, 0, 0));\n }\n let xminus = mix(bilerp4(xlo, v, w), bilerp4(select(x1, x0, left.x), v, w), fade_cubic(fract(q.x - 0.35)));\n let xplus = mix(bilerp4(select(x0, x1, right.x), v, w), bilerp4(xhi, v, w), fade_cubic(fract(q.x + 0.35)));\n\n let y0 = vec4f(x0.x, x1.x, x0.z, x1.z);\n let y1 = vec4f(x0.y, x1.y, x0.w, x1.w);\n var ylo = y0;\n var yhi = y1;\n if (left.y) {\n ylo = lattice_plane_y(i - vec3i(0, 1, 0));\n }\n if (right.y) {\n yhi = lattice_plane_y(i + vec3i(0, 2, 0));\n }\n let yminus = mix(bilerp4(ylo, u, w), bilerp4(select(y1, y0, left.y), u, w), fade_cubic(fract(q.y - 0.35)));\n let yplus = mix(bilerp4(select(y0, y1, right.y), u, w), bilerp4(yhi, u, w), fade_cubic(fract(q.y + 0.35)));\n\n let z0 = vec4f(x0.x, x1.x, x0.y, x1.y);\n let z1 = vec4f(x0.z, x1.z, x0.w, x1.w);\n var zlo = z0;\n var zhi = z1;\n if (left.z) {\n zlo = lattice_plane_z(i - vec3i(0, 0, 1));\n }\n if (right.z) {\n zhi = lattice_plane_z(i + vec3i(0, 0, 2));\n }\n let zminus = mix(bilerp4(zlo, u, v), bilerp4(select(z1, z0, left.z), u, v), fade_cubic(fract(q.z - 0.35)));\n let zplus = mix(bilerp4(select(z0, z1, right.z), u, v), bilerp4(zhi, u, v), fade_cubic(fract(q.z + 0.35)));\n return vec3f(xplus - xminus, yplus - yminus, zplus - zminus) * (weight / 0.7);\n}\n";