random_wgsl 0.1.2

Random utility package for WGSL/WESL
Documentation
// PCG pseudo random generator from vec2u to vec4f
// the random output is in the range from zero to 1
fn pcg_2u_3f(pos: vec2u) -> vec3f {
    let seed = mix2to3(pos);
    let random = pcg_3u_3u(seed);
    let normalized = ldexp(vec3f(random), vec3(-32));
    return vec3f(normalized);
}

// PCG random generator from vec3u to vec3u
// adapted from http://www.jcgt.org/published/0009/03/02/
fn pcg_3u_3u(seed: vec3u) -> vec3u {
    var v = seed * 1664525u + 1013904223u;

    v = mixing(v);
    v ^= v >> vec3(16u);
    v = mixing(v);

    return v;
}

// permuted lcg 
fn mixing(v: vec3u) -> vec3u {
    var m: vec3u = v;
    m.x += v.y * v.z;
    m.y += v.z * v.x;
    m.z += v.x * v.y;

    return m;
}

// mix position into a seed as per: https://www.shadertoy.com/view/XlGcRh
fn mix2to3(p: vec2u) -> vec3u {
    let seed = vec3u(
        p.x,
        p.x ^ p.y,
        p.x + p.y,
    );
    return seed;
}

// from https://stackoverflow.com/questions/12964279/whats-the-origin-of-this-glsl-rand-one-liner
fn sinRand(co: vec2f) -> f32 {
  return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
}