1fn init_random(state: ptr<function, u32>, value: u32) {
2 * state ^= value;
3 * state = pcg(*state);
4}
5
6fn pcg(n: u32) -> u32 {
7 var h = n * 747796405u + 2891336453u;
8 h = ((h >> ((h >> 28u) + 4u)) ^ h) * 277803737u;
9 return (h >> 22u) ^ h;
10}
11
12fn uniform_uint(state: ptr<function, u32>, max: u32) -> u32 {
13 * state = pcg(*state);
14 return * state % max;
15}
16
17fn uniform_float(state: ptr<function, u32>) -> f32 {
18 * state = pcg(*state);
19 return f32(*state) / 4294967295.0;
20}
21
22fn animated_blue_noise(coord: vec2<i32>, frame_count: u32, frame_count_cycle: u32) -> vec2f {
23 // spatial
24 let tex_size = vec2<u32>(textureDimensions(blueNoiseTexture).xy);
25 let wrapped_coord = vec2<i32>((coord.x % i32(tex_size.x) + i32(tex_size.x)) % i32(tex_size.x), (coord.y % i32(tex_size.y) + i32(tex_size.y)) % i32(tex_size.y));
26 let blue_noise = textureLoad(blueNoiseTexture, wrapped_coord).xy;
27 let idx = (f32(wrapped_coord.y) % blue_noise.y) * blue_noise.x + (f32(wrapped_coord.x) % blue_noise.x);
28 // temporal
29 let n = frame_count % frame_count_cycle;
30 let a1 = 0.7548776662466927f;
31 let a2 = 0.5698402909980532f;
32 let r2_seq = fract(vec2(a1 * f32(n), a2 * f32(n)));
33 return fract(blue_noise + r2_seq);
34}