Skip to main content

NOISE

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";