Constant ROOM_FIELD_WGSL
Source pub const ROOM_FIELD_WGSL: &str = r#"
struct Field { lo: vec4f, hi: vec4f, size: vec4u, }
@group(0) @binding(0) var<uniform> field: Field;
@group(0) @binding(1) var target_field: texture_storage_3d<rgba8unorm, write>;
fn pcg(value: u32) -> u32 {
let state = value * 747796405u + 2891336453u;
let mixed = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;
return (mixed >> 22u) ^ mixed;
}
fn hash3(p: vec3i) -> f32 {
let h = pcg(bitcast<u32>(p.x) * 73856093u ^ pcg(bitcast<u32>(p.y) * 19349663u ^ pcg(bitcast<u32>(p.z) * 83492791u ^ field.size.w)));
return f32(h >> 8u) / 16777216.0;
}
fn vnoise(p: vec3f) -> f32 {
let i = vec3i(floor(p));
let f = fract(p);
let u = f * f * (3.0 - 2.0 * f);
let a = mix(hash3(i), hash3(i + vec3i(1, 0, 0)), u.x);
let b = mix(hash3(i + vec3i(0, 1, 0)), hash3(i + vec3i(1, 1, 0)), u.x);
let c = mix(hash3(i + vec3i(0, 0, 1)), hash3(i + vec3i(1, 0, 1)), u.x);
let d = mix(hash3(i + vec3i(0, 1, 1)), hash3(i + vec3i(1, 1, 1)), u.x);
return mix(mix(a, b, u.y), mix(c, d, u.y), u.z);
}
fn fbm(p: vec3f, octaves: i32) -> f32 {
var sum = 0.0;
var amp = 0.5;
var q = p;
for (var i = 0; i < octaves; i++) {
sum += amp * vnoise(q);
q = q * 2.03 + vec3f(1.7, 9.2, 3.1);
amp *= 0.5;
}
return sum;
}
@compute @workgroup_size(4, 4, 4)
fn main(@builtin(global_invocation_id) id: vec3u) {
if (any(id >= field.size.xyz)) { return; }
let p = field.lo.xyz + (vec3f(id) + vec3f(0.5)) / vec3f(field.size.xyz) * (field.hi.xyz - field.lo.xyz);
let w = p * 2.4;
let warp = vec3f(fbm(w + vec3f(1.7, 0.0, 0.0), 3), fbm(w + vec3f(0.0, 9.2, 0.0), 3), fbm(w + vec3f(0.0, 0.0, 4.4), 3)) - vec3f(0.5);
let q = p + warp * 0.18;
let body = fbm(q * vec3f(2.6, 4.0, 2.6), 3);
let ridge = 1.0 - abs(fbm(q * vec3f(7.0, 16.0, 7.0) + vec3f(11.0), 4) * 2.0 - 1.0);
let curl = pow(ridge, 6.0) * smoothstep(0.42, 0.7, body);
let top = fbm(q * vec3f(3.0, 6.0, 3.0) + vec3f(5.0), 4);
let low = fbm(q * vec3f(5.0, 12.0, 5.0) + vec3f(3.0), 3);
textureStore(target_field, vec3i(id), vec4f(body, curl, top, low));
}
"#;