@yali-engine/clouds 0.12.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  /** Linked from shaders/clouds/clouds.wesl. */
2
2
  export declare const cloudsShader: {
3
- readonly hash: "7f9eec25af765da4";
4
- readonly wgsl: "const PI = 3.14159265;\nconst PLANET = 6360.0;\nstruct CloudParams {\ninv_view_proj: mat4x4f,\nprev_view_proj: mat4x4f,\nsun: vec4f,\neye: vec4f,\nlayer: vec4f,\nshape: vec4f,\nsize: vec4f,\nquality: vec4f,\nlook: vec4f,\npano: vec4f,\nwmap: vec4f,\n}\n@group(0) @binding(0) var<uniform> cp: CloudParams;\n@group(0) @binding(1) var<uniform> lighting: Lighting;\n@group(0) @binding(2) var sky_view: texture_2d<f32>;\n@group(0) @binding(3) var clamp_smp: sampler;\n@group(0) @binding(4) var shape_tex: texture_3d<f32>;\n@group(0) @binding(5) var detail_tex: texture_3d<f32>;\n@group(0) @binding(6) var wrap_smp: sampler;\n@group(0) @binding(7) var shape_out: texture_storage_3d<rgba8unorm, write>;\n@group(0) @binding(8) var detail_out: texture_storage_3d<rgba8unorm, write>;\n@group(0) @binding(9) var current_out: texture_storage_2d<rgba16float, write>;\n@group(0) @binding(10) var current: texture_2d<f32>;\n@group(0) @binding(11) var history: texture_2d<f32>;\n@group(0) @binding(12) var history_out: texture_storage_2d<rgba16float, write>;\n@group(0) @binding(13) var pano_out: texture_storage_2d<rgba16float, write>;\n@group(0) @binding(14) var scene_depth: texture_depth_2d;\n@group(0) @binding(15) var pano_prev: texture_2d<f32>;\n@group(0) @binding(16) var weather_tex: texture_2d<f32>;\n@group(0) @binding(17) var weather_out: texture_storage_2d<rgba8unorm, write>;\nfn pcg(v: u32) -> u32 {\nlet state = v * 747796405u + 2891336453u;\nlet word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;\nreturn (word >> 22u) ^ word;\n}\nfn hash3(c: vec3i, seed: u32) -> vec3f {\nlet h = pcg(bitcast<u32>(c.x) ^ pcg(bitcast<u32>(c.y) ^ pcg(bitcast<u32>(c.z) ^ seed)));\nlet h2 = pcg(h);\nlet h3 = pcg(h2);\nreturn vec3f(f32(h), f32(h2), f32(h3)) / 4294967296.0;\n}\nfn wrap3(c: vec3i, period: i32) -> vec3i {\nreturn ((c % period) + period) % period;\n}\nfn perlin(p: vec3f, period: i32, seed: u32) -> f32 {\nlet i = vec3i(floor(p));\nlet f = fract(p);\nlet u = f * f * f * (f * (f * 6.0 - 15.0) + 10.0);\nvar n: array<f32, 8>;\nfor (var k = 0; k < 8; k++) {\nlet o = vec3i(k & 1, (k >> 1) & 1, (k >> 2) & 1);\nlet g = normalize(hash3(wrap3(i + o, period), seed) * 2.0 - 1.0);\nn[k] = dot(g, f - vec3f(o));\n}\nlet x0 = mix(mix(n[0], n[1], u.x), mix(n[2], n[3], u.x), u.y);\nlet x1 = mix(mix(n[4], n[5], u.x), mix(n[6], n[7], u.x), u.y);\nreturn mix(x0, x1, u.z) * 1.4;\n}\nfn worley(p: vec3f, period: i32, seed: u32) -> f32 {\nlet i = vec3i(floor(p));\nlet f = fract(p);\nvar d = 8.0;\nfor (var k = 0; k < 27; k++) {\nlet o = vec3i(k % 3 - 1, (k / 3) % 3 - 1, k / 9 - 1);\nlet q = vec3f(o) + hash3(wrap3(i + o, period), seed) - f;\nd = min(d, dot(q, q));\n}\nreturn 1.0 - saturate(sqrt(d));\n}\nfn worley_fbm(p: vec3f, period: i32, seed: u32) -> f32 {\nreturn worley(p, period, seed) * 0.625 + worley(p * 2.0, period * 2, seed + 1u) * 0.25 + worley(p * 4.0, period * 4, seed + 2u) * 0.125;\n}\nfn remap(v: f32, a: f32, b: f32, c: f32, d: f32) -> f32 {\nreturn c + (v - a) / max(b - a, 1e-5) * (d - c);\n}\n@compute @workgroup_size(4, 4, 4) fn gen_shape(@builtin(global_invocation_id) id: vec3u) {\nlet n = textureDimensions(shape_out);\nif (any(id >= n)) {\nreturn;\n}\nlet uvw = (vec3f(id) + 0.5) / vec3f(n);\nvar pf = 0.0;\nvar amp = 0.5;\nvar per = 4;\nfor (var o = 0; o < 4; o++) {\npf += amp * perlin(uvw * f32(per), per, 11u + u32(o));\namp *= 0.5;\nper *= 2;\n}\npf = saturate(pf * 0.5 + 0.5);\nlet w4 = worley_fbm(uvw * 4.0, 4, 101u);\nlet w8 = worley_fbm(uvw * 8.0, 8, 211u);\nlet w16 = worley_fbm(uvw * 16.0, 16, 307u);\nlet pw = saturate(remap(pf, w4 - 1.0, 1.0, 0.0, 1.0));\ntextureStore(shape_out, vec3i(id), vec4f(pw, w4, w8, w16));\n}\n@compute @workgroup_size(4, 4, 4) fn gen_detail(@builtin(global_invocation_id) id: vec3u) {\nlet n = textureDimensions(detail_out);\nif (any(id >= n)) {\nreturn;\n}\nlet uvw = (vec3f(id) + 0.5) / vec3f(n);\ntextureStore(detail_out, vec3i(id), vec4f(worley_fbm(uvw * 2.0, 2, 401u), worley_fbm(uvw * 4.0, 4, 503u), worley_fbm(uvw * 8.0, 8, 601u), 1.0));\n}\nfn hash2(p: vec2f) -> f32 {\nlet q = vec2<i32>(floor(p));\nreturn f32(pcg(bitcast<u32>(q.x) ^ pcg(bitcast<u32>(q.y) + 0x9e3779b9u))) / 4294967296.0;\n}\nfn vnoise(p: vec2f) -> f32 {\nlet i = floor(p);\nlet f = fract(p);\nlet u = f * f * (3.0 - 2.0 * f);\nreturn mix(mix(hash2(i), hash2(i + vec2f(1.0, 0.0)), u.x), mix(hash2(i + vec2f(0.0, 1.0)), hash2(i + vec2f(1.0, 1.0)), u.x), u.y);\n}\nfn fbm2(p0: vec2f) -> f32 {\nvar p = p0;\nvar a = 0.5;\nvar s = 0.0;\nfor (var i = 0; i < 4; i++) {\ns += a * vnoise(p);\np = mat2x2f(1.6, 1.2, -1.2, 1.6) * p + vec2f(3.1, 1.7);\na *= 0.5;\n}\nreturn s / 0.9375;\n}\nfn weather(xz: vec2f) -> vec2f {\nlet q = xz / cp.look.x;\nlet w = fbm2(q);\nlet cov = saturate(remap(w, 1.0 - cp.layer.z * 1.15, 1.0, 0.0, 1.0));\nlet kind = saturate(0.5 + (fbm2(q * 0.37 + vec2f(13.0, 7.0)) - 0.5) * 2.0 * cp.look.y);\nreturn vec2f(cov, kind);\n}\nfn profile(h: f32, kind: f32) -> f32 {\nlet base = saturate(remap(h, 0.0, 0.08, 0.0, 1.0));\nlet top = saturate(remap(h, 0.25 + 0.6 * kind, 0.35 + 0.65 * kind, 1.0, 0.0));\nreturn base * top;\n}\n@compute @workgroup_size(8, 8) fn gen_weather(@builtin(global_invocation_id) id: vec3u) {\nlet n = u32(cp.wmap.w);\nif (id.x >= n || id.y >= n) {\nreturn;\n}\nlet xz = cp.wmap.xy + ((vec2f(id.xy) + 0.5) / f32(n) - 0.5) * cp.wmap.z;\ntextureStore(weather_out, vec2i(id.xy), vec4f(weather(xz), 0.0, 1.0));\n}\nfn base_cloud(p: vec3f, far: f32) -> vec4f {\nlet r = length(p);\nlet h = (r - PLANET - cp.layer.x) / (cp.layer.y - cp.layer.x);\nif (h <= 0.0 || h >= 1.0) {\nreturn vec4f(0.0);\n}\nlet xz = p.xz + cp.eye.xy + cp.shape.zw;\nlet wx = textureSampleLevel(weather_tex, clamp_smp, (xz - cp.wmap.xy) / cp.wmap.z + 0.5, 0.0).xy;\nif (wx.x <= 0.004) {\nreturn vec4f(0.0, h, xz);\n}\nlet prof = profile(h, wx.y);\nif (prof <= 0.0) {\nreturn vec4f(0.0, h, xz);\n}\nlet q = vec3f(xz.x, r - PLANET, xz.y) / (cp.shape.x * far);\nlet s = textureSampleLevel(shape_tex, wrap_smp, q, 0.0);\nlet fb = s.g * 0.625 + s.b * 0.25 + s.a * 0.125;\nlet base = saturate(remap(s.r, fb - 1.0, 1.0, 0.0, 1.0));\nreturn vec4f(saturate(remap(base * prof, 1.0 - wx.x, 1.0, 0.0, 1.0)) * wx.x, h, xz);\n}\nfn eroded(b: vec4f, alt: f32) -> f32 {\nlet d = textureSampleLevel(detail_tex, wrap_smp, vec3f(b.z, alt, b.w) / cp.shape.y, 0.0);\nlet df = d.r * 0.625 + d.g * 0.25 + d.b * 0.125;\nlet e = mix(df, 1.0 - df, saturate(b.y * 5.0));\nreturn saturate(remap(b.x, e * 0.35 * cp.look.w, 1.0, 0.0, 1.0)) * cp.layer.w;\n}\nfn density(p: vec3f, full: bool, far: f32) -> f32 {\nlet b = base_cloud(p, far);\nif (b.x <= 0.0) {\nreturn 0.0;\n}\nif (full) {\nreturn eroded(b, length(p) - PLANET);\n}\nreturn b.x * cp.layer.w;\n}\nfn hg(c: f32, g: f32) -> f32 {\nreturn (1.0 - g * g) / (4.0 * PI * pow(max(1.0 + g * g - 2.0 * g * c, 1e-4), 1.5));\n}\nfn phase(c: f32, k: f32) -> f32 {\nreturn mix(hg(c, -0.2 * k), hg(c, 0.75 * k), 0.6);\n}\nfn sun_depth(p: vec3f, steps: u32) -> f32 {\nlet s = cp.sun.xyz;\nvar tau = 0.0;\nvar t = 0.0;\nvar dt = 0.06;\nfor (var i = 0u; i < steps; i++) {\nlet m = t + dt * 0.5;\ntau += density(p + s * m, i < 2u, 1.0) * dt;\nt += dt;\ndt *= 2.1;\n}\nreturn tau;\n}\nfn ambient(h: f32) -> vec3f {\nlet up = lighting.sh[0].rgb * 0.282095 + lighting.sh[1].rgb * 0.488603;\nreturn max(up, vec3f(0.0)) * mix(0.45, 1.0, h);\n}\nfn march(d: vec3f, jitter: f32, steps_max: f32, steps_min: f32, sun_steps: u32, octaves: u32) -> vec4f {\nlet o = vec3f(0.0, cp.eye.z, 0.0);\nlet b = dot(o, d);\nlet rb = PLANET + cp.layer.x;\nlet rt = PLANET + cp.layer.y;\nlet cb = dot(o, o) - rb * rb;\nlet ct = dot(o, o) - rt * rt;\nif (d.y < -0.05 || cb > 0.0) {\nreturn vec4f(0.0, 0.0, 0.0, 1.0);\n}\nlet t0 = -b + sqrt(max(b * b - cb, 0.0));\nvar t1 = -b + sqrt(max(b * b - ct, 0.0));\nt1 = min(t1, t0 + 40.0);\nif (t0 > 220.0) {\nreturn vec4f(0.0, 0.0, 0.0, 1.0);\n}\nlet n = mix(steps_max, steps_min, saturate(d.y));\nlet dt = (t1 - t0) / n;\nlet s = cp.sun.xyz;\nlet cosv = dot(d, s);\nlet sun = lighting.sun_color.rgb;\nvar light = vec3f(0.0);\nvar trans = 1.0;\nvar dist_sum = 0.0;\nvar weight = 0.0;\nvar t = t0 + dt * jitter;\nvar empty = 0u;\nvar last = dt;\nlet rays = u32(n) * 2u;\nfor (var i = 0u; i < rays; i++) {\nif (t >= t1 || trans < 0.01) {\nbreak;\n}\nvar p = o + d * t;\nlet far = 1.0 + smoothstep(25.0, 75.0, t);\nvar cb = base_cloud(p, far);\nif (cb.x <= 0.0) {\nempty++;\nlast = dt * select(1.0, 2.0, empty > 2u);\nt += last;\ncontinue;\n}\nif (empty > 0u || i == 0u) {\nvar a = t - last;\nvar bb = t;\nfor (var k = 0u; k < 3u; k++) {\nlet m = 0.5 * (a + bb);\nif (base_cloud(o + d * m, far).x > 0.0) {\nbb = m;\n} else {\na = m;\n}\n}\nt = bb;\np = o + d * t;\ncb = base_cloud(p, far);\n}\nempty = 0u;\nlet sigma = select(cb.x * cp.layer.w, eroded(cb, length(p) - PLANET), t < 30.0);\nif (sigma > 0.0) {\nlet h = (length(p) - rb) / (rt - rb);\nlet tau = sun_depth(p, sun_steps);\nvar ms = 0.0;\nvar a = 1.0;\nvar bb = 1.0;\nvar c = 1.0;\nfor (var k = 0u; k < octaves; k++) {\nms += a * exp(-tau * bb) * phase(cosv, c);\na *= 0.5;\nbb *= 0.5;\nc *= 0.5;\n}\nlet powder = 1.0 - 0.6 * exp(-sigma * 0.3);\nlet scatter = sun * (ms * powder * 2.5) + ambient(h) * 1.3;\nlet e = exp(-sigma * dt);\nlight += trans * scatter * (1.0 - e);\ndist_sum += trans * (1.0 - e) * t;\nweight += trans * (1.0 - e);\ntrans *= e;\n}\nlast = dt;\nt += dt;\n}\nif (weight > 0.0) {\nlet mean = dist_sum / weight;\nlet haze = 1.0 - exp(-mean / cp.look.z);\nlet behind = sky_view_at(sky_view, clamp_smp, d, s, cp.eye.z) * lighting.view.rgb;\nlight = mix(light, behind * (1.0 - trans), haze * 0.5) * (1.0 - haze * 0.8);\ntrans = mix(trans, 1.0, haze * 0.8);\n}\nreturn vec4f(light, trans);\n}\nfn view_dir(uv: vec2f) -> vec3f {\nlet ndc = vec2f(uv.x * 2.0 - 1.0, 1.0 - uv.y * 2.0);\nlet near = cp.inv_view_proj * vec4f(ndc, 1.0, 1.0);\nreturn normalize(near.xyz / near.w);\n}\nfn ign(px: vec2f, frame: f32) -> f32 {\nlet q = px + 5.588238 * (frame % 64.0);\nreturn fract(52.9829189 * fract(dot(q, vec2f(0.06711056, 0.00583715))));\n}\n@compute @workgroup_size(8, 8) fn march_view(@builtin(global_invocation_id) id: vec3u) {\nlet n = textureDimensions(current_out);\nif (any(id.xy >= n)) {\nreturn;\n}\nlet texel = vec2f(id.xy) * 2.0 + cp.size.zw;\nlet uv = (texel + 0.5) / cp.size.xy;\nlet r = march(view_dir(uv), ign(vec2f(id.xy), cp.sun.w), cp.quality.x, cp.quality.y, u32(cp.quality.z), u32(cp.quality.w));\ntextureStore(current_out, vec2i(id.xy), r);\n}\n@compute @workgroup_size(8, 8) fn reconstruct(@builtin(global_invocation_id) id: vec3u) {\nlet size = vec2u(cp.size.xy);\nif (any(id.xy >= size)) {\nreturn;\n}\nlet cn = vec2i(textureDimensions(current));\nlet px = vec2f(id.xy);\nlet uv = (px + 0.5) / cp.size.xy;\nlet phase_px = cp.size.zw;\nlet mine = all(vec2u(id.xy % 2u) == vec2u(phase_px));\nlet f = (px - phase_px) * 0.5;\nlet i0 = vec2i(floor(f));\nlet w = fract(f);\nlet s00 = textureLoad(current, clamp(i0, vec2i(0), cn - 1), 0);\nlet s10 = textureLoad(current, clamp(i0 + vec2i(1, 0), vec2i(0), cn - 1), 0);\nlet s01 = textureLoad(current, clamp(i0 + vec2i(0, 1), vec2i(0), cn - 1), 0);\nlet s11 = textureLoad(current, clamp(i0 + vec2i(1, 1), vec2i(0), cn - 1), 0);\nvar m1 = vec4f(0.0);\nvar m2 = vec4f(0.0);\nfor (var k = 0; k < 9; k++) {\nlet q = textureLoad(current, clamp(i0 + vec2i(round(w)) + vec2i(k % 3 - 1, k / 3 - 1), vec2i(0), cn - 1), 0);\nm1 += q;\nm2 += q * q;\n}\nm1 /= 9.0;\nlet sd = sqrt(max(m2 / 9.0 - m1 * m1, vec4f(0.0)));\nlet mn = m1 - sd * 1.5;\nlet mx = m1 + sd * 1.5;\nlet spatial = mix(mix(s00, s10, w.x), mix(s01, s11, w.x), w.y);\nlet dir = view_dir(uv);\nlet c = cp.prev_view_proj * vec4f(dir * 1.0e4, 1.0);\nvar out = spatial;\nif (c.w > 0.0) {\nlet prev = vec2f(c.x / c.w * 0.5 + 0.5, 0.5 - c.y / c.w * 0.5);\nif (all(prev >= vec2f(0.0)) && all(prev <= vec2f(1.0)) && cp.sun.w > 0.5) {\nlet hist = textureSampleLevel(history, clamp_smp, prev, 0.0);\nlet held = clamp(hist, mn - vec4f(0.002), mx + vec4f(0.002));\nout = select(held, mix(held, s00, 0.2), mine);\n}\n}\ntextureStore(history_out, vec2i(id.xy), out);\n}\n@compute @workgroup_size(8, 8) fn panorama(@builtin(global_invocation_id) id: vec3u) {\nlet n = vec2u(cp.pano.zw);\nif (id.x >= n.x || id.y >= n.y) {\nreturn;\n}\nlet prev = textureLoad(pano_prev, vec2i(id.xy), 0);\nif (id.y % 8u != u32(cp.pano.x)) {\ntextureStore(pano_out, vec2i(id.xy), prev);\nreturn;\n}\nlet frame = cp.sun.w;\nlet j = vec2f(fract(frame * 0.754877666), fract(frame * 0.569840291));\nlet u = (f32(id.x) + j.x) / f32(n.x);\nlet v = (f32(id.y) + j.y) / f32(n.y);\nlet se = v * v;\nlet ce = sqrt(max(1.0 - se * se, 0.0));\nlet az = 2.0 * PI * u;\nlet d = vec3f(ce * cos(az), se, ce * sin(az));\nlet r = march(d, fract(frame * 0.618034), 64.0, 24.0, 4u, 2u);\nlet w = select(0.3, 1.0, frame < 8.5);\ntextureStore(pano_out, vec2i(id.xy), mix(prev, r, w));\n}\nstruct CompositeOut {\n@builtin(position) clip: vec4f,\n@location(0) uv: vec2f,\n}\n@vertex fn vs_composite(@builtin(vertex_index) i: u32) -> CompositeOut {\nlet p = vec2f(f32((i << 1u) & 2u), f32(i & 2u)) * 2.0 - 1.0;\nvar o: CompositeOut;\no.clip = vec4f(p, 0.0, 1.0);\no.uv = vec2f(p.x * 0.5 + 0.5, 0.5 - p.y * 0.5);\nreturn o;\n}\n@fragment fn fs_composite(in: CompositeOut) -> @location(0) vec4f {\nif (textureLoad(scene_depth, vec2i(in.clip.xy), 0) > 0.0) {\ndiscard;\n}\nlet c = textureSampleLevel(history, clamp_smp, in.uv, 0.0);\nreturn vec4f(c.rgb * lighting.env.z, c.a);\n}\nstruct Lighting {\nsun_color: vec4f,\nenv: vec4f,\nsh: array<vec4f, 9>,\nscreen: vec4f,\nview: vec4f,\nao_reproject: mat4x4f,\nao: vec4f,\nfog: vec4f,\nfog2: vec4f,\nfog_air: vec4f,\ngi_grid: vec4f,\ngi_counts: vec4f,\nssr: vec4f,\ngi_cascades: array<vec4f, 3>,\n}\nfn sky_view_at(lut: texture_2d<f32>, smp: sampler, d: vec3f, s: vec3f, r_cam: f32) -> vec3f {\nlet theta = acos(clamp(d.y, -1.0, 1.0));\nlet hd = vec2f(d.x, d.z);\nlet hs = vec2f(s.x, s.z);\nlet ld = length(hd);\nlet ls = length(hs);\nlet cos_az = select(1.0, dot(hd, hs) / (ld * ls), ld > 1e-5 && ls > 1e-5);\nlet uv = sky_view_uv(theta, clamp(cos_az, -1.0, 1.0), r_cam);\nlet st = (uv * (SKY_VIEW_SIZE - 1.0) + 0.5) / SKY_VIEW_SIZE;\nreturn textureSampleLevel(lut, smp, st, 0.0).rgb;\n}\nfn sky_view_uv(theta: f32, cos_az: f32, r_cam: f32) -> vec2f {\nlet zh = horizon_angle(r_cam);\nlet beta = PI0 - zh;\nvar v: f32;\nif (theta < zh) {\nv = (1.0 - sqrt(max(1.0 - theta / zh, 0.0))) * 0.5;\n} else {\nv = sqrt(saturate((theta - zh) / beta)) * 0.5 + 0.5;\n}\nreturn vec2f(sqrt(saturate(0.5 - 0.5 * cos_az)), v);\n}\nconst SKY_VIEW_SIZE = vec2f(192.0, 108.0);\nfn horizon_angle(r_cam: f32) -> f32 {\nreturn PI0 - acos(clamp(sqrt(max(r_cam * r_cam - BOTTOM * BOTTOM, 0.0)) / r_cam, 0.0, 1.0));\n}\nconst PI0 = 3.14159265;\nconst BOTTOM = 6360.0;";
3
+ readonly hash: "9d46557cec5b7088";
4
+ readonly wgsl: "const PI = 3.14159265;\nconst PLANET = 6360.0;\nstruct CloudParams {\ninv_view_proj: mat4x4f,\nprev_view_proj: mat4x4f,\nsun: vec4f,\neye: vec4f,\nlayer: vec4f,\nshape: vec4f,\nsize: vec4f,\nquality: vec4f,\nlook: vec4f,\npano: vec4f,\nwmap: vec4f,\nsmap: vec4f,\n}\n@group(0) @binding(0) var<uniform> cp: CloudParams;\n@group(0) @binding(1) var<uniform> lighting: Lighting;\n@group(0) @binding(2) var sky_view: texture_2d<f32>;\n@group(0) @binding(3) var clamp_smp: sampler;\n@group(0) @binding(4) var shape_tex: texture_3d<f32>;\n@group(0) @binding(5) var detail_tex: texture_3d<f32>;\n@group(0) @binding(6) var wrap_smp: sampler;\n@group(0) @binding(7) var shape_out: texture_storage_3d<rgba8unorm, write>;\n@group(0) @binding(8) var detail_out: texture_storage_3d<rgba8unorm, write>;\n@group(0) @binding(9) var current_out: texture_storage_2d<rgba16float, write>;\n@group(0) @binding(10) var current: texture_2d<f32>;\n@group(0) @binding(11) var history: texture_2d<f32>;\n@group(0) @binding(12) var history_out: texture_storage_2d<rgba16float, write>;\n@group(0) @binding(13) var pano_out: texture_storage_2d<rgba16float, write>;\n@group(0) @binding(14) var scene_depth: texture_depth_2d;\n@group(0) @binding(15) var pano_prev: texture_2d<f32>;\n@group(0) @binding(16) var weather_tex: texture_2d<f32>;\n@group(0) @binding(17) var weather_out: texture_storage_2d<rgba8unorm, write>;\n@group(0) @binding(18) var shadow_out: texture_storage_2d<rgba16float, write>;\nfn pcg(v: u32) -> u32 {\nlet state = v * 747796405u + 2891336453u;\nlet word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;\nreturn (word >> 22u) ^ word;\n}\nfn hash3(c: vec3i, seed: u32) -> vec3f {\nlet h = pcg(bitcast<u32>(c.x) ^ pcg(bitcast<u32>(c.y) ^ pcg(bitcast<u32>(c.z) ^ seed)));\nlet h2 = pcg(h);\nlet h3 = pcg(h2);\nreturn vec3f(f32(h), f32(h2), f32(h3)) / 4294967296.0;\n}\nfn wrap3(c: vec3i, period: i32) -> vec3i {\nreturn ((c % period) + period) % period;\n}\nfn perlin(p: vec3f, period: i32, seed: u32) -> f32 {\nlet i = vec3i(floor(p));\nlet f = fract(p);\nlet u = f * f * f * (f * (f * 6.0 - 15.0) + 10.0);\nvar n: array<f32, 8>;\nfor (var k = 0; k < 8; k++) {\nlet o = vec3i(k & 1, (k >> 1) & 1, (k >> 2) & 1);\nlet g = normalize(hash3(wrap3(i + o, period), seed) * 2.0 - 1.0);\nn[k] = dot(g, f - vec3f(o));\n}\nlet x0 = mix(mix(n[0], n[1], u.x), mix(n[2], n[3], u.x), u.y);\nlet x1 = mix(mix(n[4], n[5], u.x), mix(n[6], n[7], u.x), u.y);\nreturn mix(x0, x1, u.z) * 1.4;\n}\nfn worley(p: vec3f, period: i32, seed: u32) -> f32 {\nlet i = vec3i(floor(p));\nlet f = fract(p);\nvar d = 8.0;\nfor (var k = 0; k < 27; k++) {\nlet o = vec3i(k % 3 - 1, (k / 3) % 3 - 1, k / 9 - 1);\nlet q = vec3f(o) + hash3(wrap3(i + o, period), seed) - f;\nd = min(d, dot(q, q));\n}\nreturn 1.0 - saturate(sqrt(d));\n}\nfn worley_fbm(p: vec3f, period: i32, seed: u32) -> f32 {\nreturn worley(p, period, seed) * 0.625 + worley(p * 2.0, period * 2, seed + 1u) * 0.25 + worley(p * 4.0, period * 4, seed + 2u) * 0.125;\n}\nfn remap(v: f32, a: f32, b: f32, c: f32, d: f32) -> f32 {\nreturn c + (v - a) / max(b - a, 1e-5) * (d - c);\n}\n@compute @workgroup_size(4, 4, 4) fn gen_shape(@builtin(global_invocation_id) id: vec3u) {\nlet n = textureDimensions(shape_out);\nif (any(id >= n)) {\nreturn;\n}\nlet uvw = (vec3f(id) + 0.5) / vec3f(n);\nvar pf = 0.0;\nvar amp = 0.5;\nvar per = 4;\nfor (var o = 0; o < 4; o++) {\npf += amp * perlin(uvw * f32(per), per, 11u + u32(o));\namp *= 0.5;\nper *= 2;\n}\npf = saturate(pf * 0.5 + 0.5);\nlet w4 = worley_fbm(uvw * 4.0, 4, 101u);\nlet w8 = worley_fbm(uvw * 8.0, 8, 211u);\nlet w16 = worley_fbm(uvw * 16.0, 16, 307u);\nlet pw = saturate(remap(pf, w4 - 1.0, 1.0, 0.0, 1.0));\ntextureStore(shape_out, vec3i(id), vec4f(pw, w4, w8, w16));\n}\n@compute @workgroup_size(4, 4, 4) fn gen_detail(@builtin(global_invocation_id) id: vec3u) {\nlet n = textureDimensions(detail_out);\nif (any(id >= n)) {\nreturn;\n}\nlet uvw = (vec3f(id) + 0.5) / vec3f(n);\ntextureStore(detail_out, vec3i(id), vec4f(worley_fbm(uvw * 2.0, 2, 401u), worley_fbm(uvw * 4.0, 4, 503u), worley_fbm(uvw * 8.0, 8, 601u), 1.0));\n}\nfn hash2(p: vec2f) -> f32 {\nlet q = vec2<i32>(floor(p));\nreturn f32(pcg(bitcast<u32>(q.x) ^ pcg(bitcast<u32>(q.y) + 0x9e3779b9u))) / 4294967296.0;\n}\nfn vnoise(p: vec2f) -> f32 {\nlet i = floor(p);\nlet f = fract(p);\nlet u = f * f * (3.0 - 2.0 * f);\nreturn mix(mix(hash2(i), hash2(i + vec2f(1.0, 0.0)), u.x), mix(hash2(i + vec2f(0.0, 1.0)), hash2(i + vec2f(1.0, 1.0)), u.x), u.y);\n}\nfn fbm2(p0: vec2f) -> f32 {\nvar p = p0;\nvar a = 0.5;\nvar s = 0.0;\nfor (var i = 0; i < 4; i++) {\ns += a * vnoise(p);\np = mat2x2f(1.6, 1.2, -1.2, 1.6) * p + vec2f(3.1, 1.7);\na *= 0.5;\n}\nreturn s / 0.9375;\n}\nfn weather(xz: vec2f) -> vec2f {\nlet q = xz / cp.look.x;\nlet w = fbm2(q);\nlet cov = saturate(remap(w, 1.0 - cp.layer.z * 1.15, 1.0, 0.0, 1.0));\nlet kind = saturate(0.5 + (fbm2(q * 0.37 + vec2f(13.0, 7.0)) - 0.5) * 2.0 * cp.look.y);\nreturn vec2f(cov, kind);\n}\nfn profile(h: f32, kind: f32) -> f32 {\nlet base = saturate(remap(h, 0.0, 0.08, 0.0, 1.0));\nlet top = saturate(remap(h, 0.25 + 0.6 * kind, 0.35 + 0.65 * kind, 1.0, 0.0));\nreturn base * top;\n}\n@compute @workgroup_size(8, 8) fn gen_weather(@builtin(global_invocation_id) id: vec3u) {\nlet n = u32(cp.wmap.w);\nif (id.x >= n || id.y >= n) {\nreturn;\n}\nlet xz = cp.wmap.xy + ((vec2f(id.xy) + 0.5) / f32(n) - 0.5) * cp.wmap.z;\ntextureStore(weather_out, vec2i(id.xy), vec4f(weather(xz), 0.0, 1.0));\n}\nfn base_cloud(p: vec3f, far: f32) -> vec4f {\nlet r = length(p);\nlet h = (r - PLANET - cp.layer.x) / (cp.layer.y - cp.layer.x);\nif (h <= 0.0 || h >= 1.0) {\nreturn vec4f(0.0);\n}\nlet xz = p.xz + cp.eye.xy + cp.shape.zw;\nlet wx = textureSampleLevel(weather_tex, clamp_smp, (xz - cp.wmap.xy) / cp.wmap.z + 0.5, 0.0).xy;\nif (wx.x <= 0.004) {\nreturn vec4f(0.0, h, xz);\n}\nlet prof = profile(h, wx.y);\nif (prof <= 0.0) {\nreturn vec4f(0.0, h, xz);\n}\nlet q = vec3f(xz.x, r - PLANET, xz.y) / (cp.shape.x * far);\nlet s = textureSampleLevel(shape_tex, wrap_smp, q, 0.0);\nlet fb = s.g * 0.625 + s.b * 0.25 + s.a * 0.125;\nlet base = saturate(remap(s.r, fb - 1.0, 1.0, 0.0, 1.0));\nreturn vec4f(saturate(remap(base * prof, 1.0 - wx.x, 1.0, 0.0, 1.0)) * wx.x, h, xz);\n}\nfn eroded(b: vec4f, alt: f32) -> f32 {\nlet d = textureSampleLevel(detail_tex, wrap_smp, vec3f(b.z, alt, b.w) / cp.shape.y, 0.0);\nlet df = d.r * 0.625 + d.g * 0.25 + d.b * 0.125;\nlet e = mix(df, 1.0 - df, saturate(b.y * 5.0));\nreturn saturate(remap(b.x, e * 0.35 * cp.look.w, 1.0, 0.0, 1.0)) * cp.layer.w;\n}\nfn density(p: vec3f, full: bool, far: f32) -> f32 {\nlet b = base_cloud(p, far);\nif (b.x <= 0.0) {\nreturn 0.0;\n}\nif (full) {\nreturn eroded(b, length(p) - PLANET);\n}\nreturn b.x * cp.layer.w;\n}\nfn hg(c: f32, g: f32) -> f32 {\nreturn (1.0 - g * g) / (4.0 * PI * pow(max(1.0 + g * g - 2.0 * g * c, 1e-4), 1.5));\n}\nfn phase(c: f32, k: f32) -> f32 {\nreturn mix(hg(c, -0.2 * k), hg(c, 0.75 * k), 0.6);\n}\nfn sun_depth(p: vec3f, steps: u32) -> f32 {\nlet s = cp.sun.xyz;\nvar tau = 0.0;\nvar t = 0.0;\nvar dt = 0.06;\nfor (var i = 0u; i < steps; i++) {\nlet m = t + dt * 0.5;\ntau += density(p + s * m, i < 2u, 1.0) * dt;\nt += dt;\ndt *= 2.1;\n}\nreturn tau;\n}\nfn ambient(h: f32) -> vec3f {\nlet up = lighting.sh[0].rgb * 0.282095 + lighting.sh[1].rgb * 0.488603;\nreturn max(up, vec3f(0.0)) * mix(0.45, 1.0, h);\n}\nfn march(d: vec3f, jitter: f32, steps_max: f32, steps_min: f32, sun_steps: u32, octaves: u32) -> vec4f {\nlet o = vec3f(0.0, cp.eye.z, 0.0);\nlet b = dot(o, d);\nlet rb = PLANET + cp.layer.x;\nlet rt = PLANET + cp.layer.y;\nlet cb = dot(o, o) - rb * rb;\nlet ct = dot(o, o) - rt * rt;\nif (d.y < -0.05 || cb > 0.0) {\nreturn vec4f(0.0, 0.0, 0.0, 1.0);\n}\nlet t0 = -b + sqrt(max(b * b - cb, 0.0));\nvar t1 = -b + sqrt(max(b * b - ct, 0.0));\nt1 = min(t1, t0 + 40.0);\nif (t0 > 220.0) {\nreturn vec4f(0.0, 0.0, 0.0, 1.0);\n}\nlet n = mix(steps_max, steps_min, saturate(d.y));\nlet dt = (t1 - t0) / n;\nlet s = cp.sun.xyz;\nlet cosv = dot(d, s);\nlet sun = lighting.sun_color.rgb;\nvar light = vec3f(0.0);\nvar trans = 1.0;\nvar dist_sum = 0.0;\nvar weight = 0.0;\nvar t = t0 + dt * jitter;\nvar empty = 0u;\nvar last = dt;\nlet rays = u32(n) * 2u;\nfor (var i = 0u; i < rays; i++) {\nif (t >= t1 || trans < 0.01) {\nbreak;\n}\nvar p = o + d * t;\nlet far = 1.0 + smoothstep(25.0, 75.0, t);\nvar cb = base_cloud(p, far);\nif (cb.x <= 0.0) {\nempty++;\nlast = dt * select(1.0, 2.0, empty > 2u);\nt += last;\ncontinue;\n}\nif (empty > 0u || i == 0u) {\nvar a = t - last;\nvar bb = t;\nfor (var k = 0u; k < 3u; k++) {\nlet m = 0.5 * (a + bb);\nif (base_cloud(o + d * m, far).x > 0.0) {\nbb = m;\n} else {\na = m;\n}\n}\nt = bb;\np = o + d * t;\ncb = base_cloud(p, far);\n}\nempty = 0u;\nlet sigma = select(cb.x * cp.layer.w, eroded(cb, length(p) - PLANET), t < 30.0);\nif (sigma > 0.0) {\nlet h = (length(p) - rb) / (rt - rb);\nlet tau = sun_depth(p, sun_steps);\nvar ms = 0.0;\nvar a = 1.0;\nvar bb = 1.0;\nvar c = 1.0;\nfor (var k = 0u; k < octaves; k++) {\nms += a * exp(-tau * bb) * phase(cosv, c);\na *= 0.5;\nbb *= 0.5;\nc *= 0.5;\n}\nlet powder = 1.0 - 0.6 * exp(-sigma * 0.3);\nlet scatter = sun * (ms * powder * 2.5) + ambient(h) * 1.3;\nlet e = exp(-sigma * dt);\nlight += trans * scatter * (1.0 - e);\ndist_sum += trans * (1.0 - e) * t;\nweight += trans * (1.0 - e);\ntrans *= e;\n}\nlast = dt;\nt += dt;\n}\nif (weight > 0.0) {\nlet mean = dist_sum / weight;\nlet haze = 1.0 - exp(-mean / cp.look.z);\nlet behind = sky_view_at(sky_view, clamp_smp, d, s, cp.eye.z) * lighting.view.rgb;\nlight = mix(light, behind * (1.0 - trans), haze * 0.5) * (1.0 - haze * 0.8);\ntrans = mix(trans, 1.0, haze * 0.8);\n}\nreturn vec4f(light, trans);\n}\nfn view_dir(uv: vec2f) -> vec3f {\nlet ndc = vec2f(uv.x * 2.0 - 1.0, 1.0 - uv.y * 2.0);\nlet near = cp.inv_view_proj * vec4f(ndc, 1.0, 1.0);\nreturn normalize(near.xyz / near.w);\n}\nfn ign(px: vec2f, frame: f32) -> f32 {\nlet q = px + 5.588238 * (frame % 64.0);\nreturn fract(52.9829189 * fract(dot(q, vec2f(0.06711056, 0.00583715))));\n}\n@compute @workgroup_size(8, 8) fn march_view(@builtin(global_invocation_id) id: vec3u) {\nlet n = textureDimensions(current_out);\nif (any(id.xy >= n)) {\nreturn;\n}\nlet texel = vec2f(id.xy) * 2.0 + cp.size.zw;\nlet uv = (texel + 0.5) / cp.size.xy;\nlet r = march(view_dir(uv), ign(vec2f(id.xy), cp.sun.w), cp.quality.x, cp.quality.y, u32(cp.quality.z), u32(cp.quality.w));\ntextureStore(current_out, vec2i(id.xy), r);\n}\n@compute @workgroup_size(8, 8) fn reconstruct(@builtin(global_invocation_id) id: vec3u) {\nlet size = vec2u(cp.size.xy);\nif (any(id.xy >= size)) {\nreturn;\n}\nlet cn = vec2i(textureDimensions(current));\nlet px = vec2f(id.xy);\nlet uv = (px + 0.5) / cp.size.xy;\nlet phase_px = cp.size.zw;\nlet mine = all(vec2u(id.xy % 2u) == vec2u(phase_px));\nlet f = (px - phase_px) * 0.5;\nlet i0 = vec2i(floor(f));\nlet w = fract(f);\nlet s00 = textureLoad(current, clamp(i0, vec2i(0), cn - 1), 0);\nlet s10 = textureLoad(current, clamp(i0 + vec2i(1, 0), vec2i(0), cn - 1), 0);\nlet s01 = textureLoad(current, clamp(i0 + vec2i(0, 1), vec2i(0), cn - 1), 0);\nlet s11 = textureLoad(current, clamp(i0 + vec2i(1, 1), vec2i(0), cn - 1), 0);\nvar m1 = vec4f(0.0);\nvar m2 = vec4f(0.0);\nfor (var k = 0; k < 9; k++) {\nlet q = textureLoad(current, clamp(i0 + vec2i(round(w)) + vec2i(k % 3 - 1, k / 3 - 1), vec2i(0), cn - 1), 0);\nm1 += q;\nm2 += q * q;\n}\nm1 /= 9.0;\nlet sd = sqrt(max(m2 / 9.0 - m1 * m1, vec4f(0.0)));\nlet mn = m1 - sd * 1.5;\nlet mx = m1 + sd * 1.5;\nlet spatial = mix(mix(s00, s10, w.x), mix(s01, s11, w.x), w.y);\nlet dir = view_dir(uv);\nlet c = cp.prev_view_proj * vec4f(dir * 1.0e4, 1.0);\nvar out = spatial;\nif (c.w > 0.0) {\nlet prev = vec2f(c.x / c.w * 0.5 + 0.5, 0.5 - c.y / c.w * 0.5);\nif (all(prev >= vec2f(0.0)) && all(prev <= vec2f(1.0)) && cp.sun.w > 0.5) {\nlet hist = textureSampleLevel(history, clamp_smp, prev, 0.0);\nlet held = clamp(hist, mn - vec4f(0.002), mx + vec4f(0.002));\nout = select(held, mix(held, s00, 0.2), mine);\n}\n}\ntextureStore(history_out, vec2i(id.xy), out);\n}\n@compute @workgroup_size(8, 8) fn panorama(@builtin(global_invocation_id) id: vec3u) {\nlet n = vec2u(cp.pano.zw);\nif (id.x >= n.x || id.y >= n.y) {\nreturn;\n}\nlet prev = textureLoad(pano_prev, vec2i(id.xy), 0);\nif (id.y % 8u != u32(cp.pano.x)) {\ntextureStore(pano_out, vec2i(id.xy), prev);\nreturn;\n}\nlet frame = cp.sun.w;\nlet j = vec2f(fract(frame * 0.754877666), fract(frame * 0.569840291));\nlet u = (f32(id.x) + j.x) / f32(n.x);\nlet v = (f32(id.y) + j.y) / f32(n.y);\nlet se = v * v;\nlet ce = sqrt(max(1.0 - se * se, 0.0));\nlet az = 2.0 * PI * u;\nlet d = vec3f(ce * cos(az), se, ce * sin(az));\nlet r = march(d, fract(frame * 0.618034), 64.0, 24.0, 4u, 2u);\nlet w = select(0.3, 1.0, frame < 8.5);\ntextureStore(pano_out, vec2i(id.xy), mix(prev, r, w));\n}\n@compute @workgroup_size(8, 8) fn shadow_map(@builtin(global_invocation_id) id: vec3u) {\nlet n = textureDimensions(shadow_out);\nif (any(id.xy >= n)) {\nreturn;\n}\nif (cp.smap.w < 3.5 && id.y % 4u != u32(cp.smap.w)) {\nreturn;\n}\nlet rel = cp.smap.xy - cp.eye.xy + ((vec2f(id.xy) + 0.5) / vec2f(n) - 0.5) * cp.smap.z;\nlet o = vec3f(rel.x, PLANET, rel.y);\nlet s = cp.sun.xyz;\nlet sy = max(s.y, 0.05);\nlet t0 = cp.layer.x / sy;\nlet t1 = min(cp.layer.y / sy, t0 + 40.0);\nlet steps = 16u;\nlet dt = (t1 - t0) / f32(steps);\nvar tau = 0.0;\nfor (var i = 0u; i < steps; i++) {\ntau += density(o + s * (t0 + dt * (f32(i) + 0.5)), true, 1.0) * dt;\n}\nlet light = max(exp(-tau), 0.7 * exp(-0.25 * tau));\ntextureStore(shadow_out, vec2i(id.xy), vec4f(select(1.0, light, s.y > 0.0), 0.0, 0.0, 1.0));\n}\nstruct CompositeOut {\n@builtin(position) clip: vec4f,\n@location(0) uv: vec2f,\n}\n@vertex fn vs_composite(@builtin(vertex_index) i: u32) -> CompositeOut {\nlet p = vec2f(f32((i << 1u) & 2u), f32(i & 2u)) * 2.0 - 1.0;\nvar o: CompositeOut;\no.clip = vec4f(p, 0.0, 1.0);\no.uv = vec2f(p.x * 0.5 + 0.5, 0.5 - p.y * 0.5);\nreturn o;\n}\n@fragment fn fs_composite(in: CompositeOut) -> @location(0) vec4f {\nif (textureLoad(scene_depth, vec2i(in.clip.xy), 0) > 0.0) {\ndiscard;\n}\nlet c = textureSampleLevel(history, clamp_smp, in.uv, 0.0);\nreturn vec4f(c.rgb * lighting.env.z, c.a);\n}\nstruct Lighting {\nsun_color: vec4f,\nenv: vec4f,\nsh: array<vec4f, 9>,\nscreen: vec4f,\nview: vec4f,\nao_reproject: mat4x4f,\nao: vec4f,\nfog: vec4f,\nfog2: vec4f,\nfog_air: vec4f,\ngi_grid: vec4f,\ngi_counts: vec4f,\nssr: vec4f,\ngi_cascades: array<vec4f, 3>,\nclouds: vec4f,\n}\nfn sky_view_at(lut: texture_2d<f32>, smp: sampler, d: vec3f, s: vec3f, r_cam: f32) -> vec3f {\nlet theta = acos(clamp(d.y, -1.0, 1.0));\nlet hd = vec2f(d.x, d.z);\nlet hs = vec2f(s.x, s.z);\nlet ld = length(hd);\nlet ls = length(hs);\nlet cos_az = select(1.0, dot(hd, hs) / (ld * ls), ld > 1e-5 && ls > 1e-5);\nlet uv = sky_view_uv(theta, clamp(cos_az, -1.0, 1.0), r_cam);\nlet st = (uv * (SKY_VIEW_SIZE - 1.0) + 0.5) / SKY_VIEW_SIZE;\nreturn textureSampleLevel(lut, smp, st, 0.0).rgb;\n}\nfn sky_view_uv(theta: f32, cos_az: f32, r_cam: f32) -> vec2f {\nlet zh = horizon_angle(r_cam);\nlet beta = PI0 - zh;\nvar v: f32;\nif (theta < zh) {\nv = (1.0 - sqrt(max(1.0 - theta / zh, 0.0))) * 0.5;\n} else {\nv = sqrt(saturate((theta - zh) / beta)) * 0.5 + 0.5;\n}\nreturn vec2f(sqrt(saturate(0.5 - 0.5 * cos_az)), v);\n}\nconst SKY_VIEW_SIZE = vec2f(192.0, 108.0);\nfn horizon_angle(r_cam: f32) -> f32 {\nreturn PI0 - acos(clamp(sqrt(max(r_cam * r_cam - BOTTOM * BOTTOM, 0.0)) / r_cam, 0.0, 1.0));\n}\nconst PI0 = 3.14159265;\nconst BOTTOM = 6360.0;";
5
5
  };
@@ -2,7 +2,7 @@
2
2
  // Regenerate with `node tools/shaders-gen.mjs`; CI runs it with --check.
3
3
  /** Linked from shaders/clouds/clouds.wesl. */
4
4
  export const cloudsShader = {
5
- hash: '7f9eec25af765da4',
6
- wgsl: "const PI = 3.14159265;\nconst PLANET = 6360.0;\nstruct CloudParams {\ninv_view_proj: mat4x4f,\nprev_view_proj: mat4x4f,\nsun: vec4f,\neye: vec4f,\nlayer: vec4f,\nshape: vec4f,\nsize: vec4f,\nquality: vec4f,\nlook: vec4f,\npano: vec4f,\nwmap: vec4f,\n}\n@group(0) @binding(0) var<uniform> cp: CloudParams;\n@group(0) @binding(1) var<uniform> lighting: Lighting;\n@group(0) @binding(2) var sky_view: texture_2d<f32>;\n@group(0) @binding(3) var clamp_smp: sampler;\n@group(0) @binding(4) var shape_tex: texture_3d<f32>;\n@group(0) @binding(5) var detail_tex: texture_3d<f32>;\n@group(0) @binding(6) var wrap_smp: sampler;\n@group(0) @binding(7) var shape_out: texture_storage_3d<rgba8unorm, write>;\n@group(0) @binding(8) var detail_out: texture_storage_3d<rgba8unorm, write>;\n@group(0) @binding(9) var current_out: texture_storage_2d<rgba16float, write>;\n@group(0) @binding(10) var current: texture_2d<f32>;\n@group(0) @binding(11) var history: texture_2d<f32>;\n@group(0) @binding(12) var history_out: texture_storage_2d<rgba16float, write>;\n@group(0) @binding(13) var pano_out: texture_storage_2d<rgba16float, write>;\n@group(0) @binding(14) var scene_depth: texture_depth_2d;\n@group(0) @binding(15) var pano_prev: texture_2d<f32>;\n@group(0) @binding(16) var weather_tex: texture_2d<f32>;\n@group(0) @binding(17) var weather_out: texture_storage_2d<rgba8unorm, write>;\nfn pcg(v: u32) -> u32 {\nlet state = v * 747796405u + 2891336453u;\nlet word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;\nreturn (word >> 22u) ^ word;\n}\nfn hash3(c: vec3i, seed: u32) -> vec3f {\nlet h = pcg(bitcast<u32>(c.x) ^ pcg(bitcast<u32>(c.y) ^ pcg(bitcast<u32>(c.z) ^ seed)));\nlet h2 = pcg(h);\nlet h3 = pcg(h2);\nreturn vec3f(f32(h), f32(h2), f32(h3)) / 4294967296.0;\n}\nfn wrap3(c: vec3i, period: i32) -> vec3i {\nreturn ((c % period) + period) % period;\n}\nfn perlin(p: vec3f, period: i32, seed: u32) -> f32 {\nlet i = vec3i(floor(p));\nlet f = fract(p);\nlet u = f * f * f * (f * (f * 6.0 - 15.0) + 10.0);\nvar n: array<f32, 8>;\nfor (var k = 0; k < 8; k++) {\nlet o = vec3i(k & 1, (k >> 1) & 1, (k >> 2) & 1);\nlet g = normalize(hash3(wrap3(i + o, period), seed) * 2.0 - 1.0);\nn[k] = dot(g, f - vec3f(o));\n}\nlet x0 = mix(mix(n[0], n[1], u.x), mix(n[2], n[3], u.x), u.y);\nlet x1 = mix(mix(n[4], n[5], u.x), mix(n[6], n[7], u.x), u.y);\nreturn mix(x0, x1, u.z) * 1.4;\n}\nfn worley(p: vec3f, period: i32, seed: u32) -> f32 {\nlet i = vec3i(floor(p));\nlet f = fract(p);\nvar d = 8.0;\nfor (var k = 0; k < 27; k++) {\nlet o = vec3i(k % 3 - 1, (k / 3) % 3 - 1, k / 9 - 1);\nlet q = vec3f(o) + hash3(wrap3(i + o, period), seed) - f;\nd = min(d, dot(q, q));\n}\nreturn 1.0 - saturate(sqrt(d));\n}\nfn worley_fbm(p: vec3f, period: i32, seed: u32) -> f32 {\nreturn worley(p, period, seed) * 0.625 + worley(p * 2.0, period * 2, seed + 1u) * 0.25 + worley(p * 4.0, period * 4, seed + 2u) * 0.125;\n}\nfn remap(v: f32, a: f32, b: f32, c: f32, d: f32) -> f32 {\nreturn c + (v - a) / max(b - a, 1e-5) * (d - c);\n}\n@compute @workgroup_size(4, 4, 4) fn gen_shape(@builtin(global_invocation_id) id: vec3u) {\nlet n = textureDimensions(shape_out);\nif (any(id >= n)) {\nreturn;\n}\nlet uvw = (vec3f(id) + 0.5) / vec3f(n);\nvar pf = 0.0;\nvar amp = 0.5;\nvar per = 4;\nfor (var o = 0; o < 4; o++) {\npf += amp * perlin(uvw * f32(per), per, 11u + u32(o));\namp *= 0.5;\nper *= 2;\n}\npf = saturate(pf * 0.5 + 0.5);\nlet w4 = worley_fbm(uvw * 4.0, 4, 101u);\nlet w8 = worley_fbm(uvw * 8.0, 8, 211u);\nlet w16 = worley_fbm(uvw * 16.0, 16, 307u);\nlet pw = saturate(remap(pf, w4 - 1.0, 1.0, 0.0, 1.0));\ntextureStore(shape_out, vec3i(id), vec4f(pw, w4, w8, w16));\n}\n@compute @workgroup_size(4, 4, 4) fn gen_detail(@builtin(global_invocation_id) id: vec3u) {\nlet n = textureDimensions(detail_out);\nif (any(id >= n)) {\nreturn;\n}\nlet uvw = (vec3f(id) + 0.5) / vec3f(n);\ntextureStore(detail_out, vec3i(id), vec4f(worley_fbm(uvw * 2.0, 2, 401u), worley_fbm(uvw * 4.0, 4, 503u), worley_fbm(uvw * 8.0, 8, 601u), 1.0));\n}\nfn hash2(p: vec2f) -> f32 {\nlet q = vec2<i32>(floor(p));\nreturn f32(pcg(bitcast<u32>(q.x) ^ pcg(bitcast<u32>(q.y) + 0x9e3779b9u))) / 4294967296.0;\n}\nfn vnoise(p: vec2f) -> f32 {\nlet i = floor(p);\nlet f = fract(p);\nlet u = f * f * (3.0 - 2.0 * f);\nreturn mix(mix(hash2(i), hash2(i + vec2f(1.0, 0.0)), u.x), mix(hash2(i + vec2f(0.0, 1.0)), hash2(i + vec2f(1.0, 1.0)), u.x), u.y);\n}\nfn fbm2(p0: vec2f) -> f32 {\nvar p = p0;\nvar a = 0.5;\nvar s = 0.0;\nfor (var i = 0; i < 4; i++) {\ns += a * vnoise(p);\np = mat2x2f(1.6, 1.2, -1.2, 1.6) * p + vec2f(3.1, 1.7);\na *= 0.5;\n}\nreturn s / 0.9375;\n}\nfn weather(xz: vec2f) -> vec2f {\nlet q = xz / cp.look.x;\nlet w = fbm2(q);\nlet cov = saturate(remap(w, 1.0 - cp.layer.z * 1.15, 1.0, 0.0, 1.0));\nlet kind = saturate(0.5 + (fbm2(q * 0.37 + vec2f(13.0, 7.0)) - 0.5) * 2.0 * cp.look.y);\nreturn vec2f(cov, kind);\n}\nfn profile(h: f32, kind: f32) -> f32 {\nlet base = saturate(remap(h, 0.0, 0.08, 0.0, 1.0));\nlet top = saturate(remap(h, 0.25 + 0.6 * kind, 0.35 + 0.65 * kind, 1.0, 0.0));\nreturn base * top;\n}\n@compute @workgroup_size(8, 8) fn gen_weather(@builtin(global_invocation_id) id: vec3u) {\nlet n = u32(cp.wmap.w);\nif (id.x >= n || id.y >= n) {\nreturn;\n}\nlet xz = cp.wmap.xy + ((vec2f(id.xy) + 0.5) / f32(n) - 0.5) * cp.wmap.z;\ntextureStore(weather_out, vec2i(id.xy), vec4f(weather(xz), 0.0, 1.0));\n}\nfn base_cloud(p: vec3f, far: f32) -> vec4f {\nlet r = length(p);\nlet h = (r - PLANET - cp.layer.x) / (cp.layer.y - cp.layer.x);\nif (h <= 0.0 || h >= 1.0) {\nreturn vec4f(0.0);\n}\nlet xz = p.xz + cp.eye.xy + cp.shape.zw;\nlet wx = textureSampleLevel(weather_tex, clamp_smp, (xz - cp.wmap.xy) / cp.wmap.z + 0.5, 0.0).xy;\nif (wx.x <= 0.004) {\nreturn vec4f(0.0, h, xz);\n}\nlet prof = profile(h, wx.y);\nif (prof <= 0.0) {\nreturn vec4f(0.0, h, xz);\n}\nlet q = vec3f(xz.x, r - PLANET, xz.y) / (cp.shape.x * far);\nlet s = textureSampleLevel(shape_tex, wrap_smp, q, 0.0);\nlet fb = s.g * 0.625 + s.b * 0.25 + s.a * 0.125;\nlet base = saturate(remap(s.r, fb - 1.0, 1.0, 0.0, 1.0));\nreturn vec4f(saturate(remap(base * prof, 1.0 - wx.x, 1.0, 0.0, 1.0)) * wx.x, h, xz);\n}\nfn eroded(b: vec4f, alt: f32) -> f32 {\nlet d = textureSampleLevel(detail_tex, wrap_smp, vec3f(b.z, alt, b.w) / cp.shape.y, 0.0);\nlet df = d.r * 0.625 + d.g * 0.25 + d.b * 0.125;\nlet e = mix(df, 1.0 - df, saturate(b.y * 5.0));\nreturn saturate(remap(b.x, e * 0.35 * cp.look.w, 1.0, 0.0, 1.0)) * cp.layer.w;\n}\nfn density(p: vec3f, full: bool, far: f32) -> f32 {\nlet b = base_cloud(p, far);\nif (b.x <= 0.0) {\nreturn 0.0;\n}\nif (full) {\nreturn eroded(b, length(p) - PLANET);\n}\nreturn b.x * cp.layer.w;\n}\nfn hg(c: f32, g: f32) -> f32 {\nreturn (1.0 - g * g) / (4.0 * PI * pow(max(1.0 + g * g - 2.0 * g * c, 1e-4), 1.5));\n}\nfn phase(c: f32, k: f32) -> f32 {\nreturn mix(hg(c, -0.2 * k), hg(c, 0.75 * k), 0.6);\n}\nfn sun_depth(p: vec3f, steps: u32) -> f32 {\nlet s = cp.sun.xyz;\nvar tau = 0.0;\nvar t = 0.0;\nvar dt = 0.06;\nfor (var i = 0u; i < steps; i++) {\nlet m = t + dt * 0.5;\ntau += density(p + s * m, i < 2u, 1.0) * dt;\nt += dt;\ndt *= 2.1;\n}\nreturn tau;\n}\nfn ambient(h: f32) -> vec3f {\nlet up = lighting.sh[0].rgb * 0.282095 + lighting.sh[1].rgb * 0.488603;\nreturn max(up, vec3f(0.0)) * mix(0.45, 1.0, h);\n}\nfn march(d: vec3f, jitter: f32, steps_max: f32, steps_min: f32, sun_steps: u32, octaves: u32) -> vec4f {\nlet o = vec3f(0.0, cp.eye.z, 0.0);\nlet b = dot(o, d);\nlet rb = PLANET + cp.layer.x;\nlet rt = PLANET + cp.layer.y;\nlet cb = dot(o, o) - rb * rb;\nlet ct = dot(o, o) - rt * rt;\nif (d.y < -0.05 || cb > 0.0) {\nreturn vec4f(0.0, 0.0, 0.0, 1.0);\n}\nlet t0 = -b + sqrt(max(b * b - cb, 0.0));\nvar t1 = -b + sqrt(max(b * b - ct, 0.0));\nt1 = min(t1, t0 + 40.0);\nif (t0 > 220.0) {\nreturn vec4f(0.0, 0.0, 0.0, 1.0);\n}\nlet n = mix(steps_max, steps_min, saturate(d.y));\nlet dt = (t1 - t0) / n;\nlet s = cp.sun.xyz;\nlet cosv = dot(d, s);\nlet sun = lighting.sun_color.rgb;\nvar light = vec3f(0.0);\nvar trans = 1.0;\nvar dist_sum = 0.0;\nvar weight = 0.0;\nvar t = t0 + dt * jitter;\nvar empty = 0u;\nvar last = dt;\nlet rays = u32(n) * 2u;\nfor (var i = 0u; i < rays; i++) {\nif (t >= t1 || trans < 0.01) {\nbreak;\n}\nvar p = o + d * t;\nlet far = 1.0 + smoothstep(25.0, 75.0, t);\nvar cb = base_cloud(p, far);\nif (cb.x <= 0.0) {\nempty++;\nlast = dt * select(1.0, 2.0, empty > 2u);\nt += last;\ncontinue;\n}\nif (empty > 0u || i == 0u) {\nvar a = t - last;\nvar bb = t;\nfor (var k = 0u; k < 3u; k++) {\nlet m = 0.5 * (a + bb);\nif (base_cloud(o + d * m, far).x > 0.0) {\nbb = m;\n} else {\na = m;\n}\n}\nt = bb;\np = o + d * t;\ncb = base_cloud(p, far);\n}\nempty = 0u;\nlet sigma = select(cb.x * cp.layer.w, eroded(cb, length(p) - PLANET), t < 30.0);\nif (sigma > 0.0) {\nlet h = (length(p) - rb) / (rt - rb);\nlet tau = sun_depth(p, sun_steps);\nvar ms = 0.0;\nvar a = 1.0;\nvar bb = 1.0;\nvar c = 1.0;\nfor (var k = 0u; k < octaves; k++) {\nms += a * exp(-tau * bb) * phase(cosv, c);\na *= 0.5;\nbb *= 0.5;\nc *= 0.5;\n}\nlet powder = 1.0 - 0.6 * exp(-sigma * 0.3);\nlet scatter = sun * (ms * powder * 2.5) + ambient(h) * 1.3;\nlet e = exp(-sigma * dt);\nlight += trans * scatter * (1.0 - e);\ndist_sum += trans * (1.0 - e) * t;\nweight += trans * (1.0 - e);\ntrans *= e;\n}\nlast = dt;\nt += dt;\n}\nif (weight > 0.0) {\nlet mean = dist_sum / weight;\nlet haze = 1.0 - exp(-mean / cp.look.z);\nlet behind = sky_view_at(sky_view, clamp_smp, d, s, cp.eye.z) * lighting.view.rgb;\nlight = mix(light, behind * (1.0 - trans), haze * 0.5) * (1.0 - haze * 0.8);\ntrans = mix(trans, 1.0, haze * 0.8);\n}\nreturn vec4f(light, trans);\n}\nfn view_dir(uv: vec2f) -> vec3f {\nlet ndc = vec2f(uv.x * 2.0 - 1.0, 1.0 - uv.y * 2.0);\nlet near = cp.inv_view_proj * vec4f(ndc, 1.0, 1.0);\nreturn normalize(near.xyz / near.w);\n}\nfn ign(px: vec2f, frame: f32) -> f32 {\nlet q = px + 5.588238 * (frame % 64.0);\nreturn fract(52.9829189 * fract(dot(q, vec2f(0.06711056, 0.00583715))));\n}\n@compute @workgroup_size(8, 8) fn march_view(@builtin(global_invocation_id) id: vec3u) {\nlet n = textureDimensions(current_out);\nif (any(id.xy >= n)) {\nreturn;\n}\nlet texel = vec2f(id.xy) * 2.0 + cp.size.zw;\nlet uv = (texel + 0.5) / cp.size.xy;\nlet r = march(view_dir(uv), ign(vec2f(id.xy), cp.sun.w), cp.quality.x, cp.quality.y, u32(cp.quality.z), u32(cp.quality.w));\ntextureStore(current_out, vec2i(id.xy), r);\n}\n@compute @workgroup_size(8, 8) fn reconstruct(@builtin(global_invocation_id) id: vec3u) {\nlet size = vec2u(cp.size.xy);\nif (any(id.xy >= size)) {\nreturn;\n}\nlet cn = vec2i(textureDimensions(current));\nlet px = vec2f(id.xy);\nlet uv = (px + 0.5) / cp.size.xy;\nlet phase_px = cp.size.zw;\nlet mine = all(vec2u(id.xy % 2u) == vec2u(phase_px));\nlet f = (px - phase_px) * 0.5;\nlet i0 = vec2i(floor(f));\nlet w = fract(f);\nlet s00 = textureLoad(current, clamp(i0, vec2i(0), cn - 1), 0);\nlet s10 = textureLoad(current, clamp(i0 + vec2i(1, 0), vec2i(0), cn - 1), 0);\nlet s01 = textureLoad(current, clamp(i0 + vec2i(0, 1), vec2i(0), cn - 1), 0);\nlet s11 = textureLoad(current, clamp(i0 + vec2i(1, 1), vec2i(0), cn - 1), 0);\nvar m1 = vec4f(0.0);\nvar m2 = vec4f(0.0);\nfor (var k = 0; k < 9; k++) {\nlet q = textureLoad(current, clamp(i0 + vec2i(round(w)) + vec2i(k % 3 - 1, k / 3 - 1), vec2i(0), cn - 1), 0);\nm1 += q;\nm2 += q * q;\n}\nm1 /= 9.0;\nlet sd = sqrt(max(m2 / 9.0 - m1 * m1, vec4f(0.0)));\nlet mn = m1 - sd * 1.5;\nlet mx = m1 + sd * 1.5;\nlet spatial = mix(mix(s00, s10, w.x), mix(s01, s11, w.x), w.y);\nlet dir = view_dir(uv);\nlet c = cp.prev_view_proj * vec4f(dir * 1.0e4, 1.0);\nvar out = spatial;\nif (c.w > 0.0) {\nlet prev = vec2f(c.x / c.w * 0.5 + 0.5, 0.5 - c.y / c.w * 0.5);\nif (all(prev >= vec2f(0.0)) && all(prev <= vec2f(1.0)) && cp.sun.w > 0.5) {\nlet hist = textureSampleLevel(history, clamp_smp, prev, 0.0);\nlet held = clamp(hist, mn - vec4f(0.002), mx + vec4f(0.002));\nout = select(held, mix(held, s00, 0.2), mine);\n}\n}\ntextureStore(history_out, vec2i(id.xy), out);\n}\n@compute @workgroup_size(8, 8) fn panorama(@builtin(global_invocation_id) id: vec3u) {\nlet n = vec2u(cp.pano.zw);\nif (id.x >= n.x || id.y >= n.y) {\nreturn;\n}\nlet prev = textureLoad(pano_prev, vec2i(id.xy), 0);\nif (id.y % 8u != u32(cp.pano.x)) {\ntextureStore(pano_out, vec2i(id.xy), prev);\nreturn;\n}\nlet frame = cp.sun.w;\nlet j = vec2f(fract(frame * 0.754877666), fract(frame * 0.569840291));\nlet u = (f32(id.x) + j.x) / f32(n.x);\nlet v = (f32(id.y) + j.y) / f32(n.y);\nlet se = v * v;\nlet ce = sqrt(max(1.0 - se * se, 0.0));\nlet az = 2.0 * PI * u;\nlet d = vec3f(ce * cos(az), se, ce * sin(az));\nlet r = march(d, fract(frame * 0.618034), 64.0, 24.0, 4u, 2u);\nlet w = select(0.3, 1.0, frame < 8.5);\ntextureStore(pano_out, vec2i(id.xy), mix(prev, r, w));\n}\nstruct CompositeOut {\n@builtin(position) clip: vec4f,\n@location(0) uv: vec2f,\n}\n@vertex fn vs_composite(@builtin(vertex_index) i: u32) -> CompositeOut {\nlet p = vec2f(f32((i << 1u) & 2u), f32(i & 2u)) * 2.0 - 1.0;\nvar o: CompositeOut;\no.clip = vec4f(p, 0.0, 1.0);\no.uv = vec2f(p.x * 0.5 + 0.5, 0.5 - p.y * 0.5);\nreturn o;\n}\n@fragment fn fs_composite(in: CompositeOut) -> @location(0) vec4f {\nif (textureLoad(scene_depth, vec2i(in.clip.xy), 0) > 0.0) {\ndiscard;\n}\nlet c = textureSampleLevel(history, clamp_smp, in.uv, 0.0);\nreturn vec4f(c.rgb * lighting.env.z, c.a);\n}\nstruct Lighting {\nsun_color: vec4f,\nenv: vec4f,\nsh: array<vec4f, 9>,\nscreen: vec4f,\nview: vec4f,\nao_reproject: mat4x4f,\nao: vec4f,\nfog: vec4f,\nfog2: vec4f,\nfog_air: vec4f,\ngi_grid: vec4f,\ngi_counts: vec4f,\nssr: vec4f,\ngi_cascades: array<vec4f, 3>,\n}\nfn sky_view_at(lut: texture_2d<f32>, smp: sampler, d: vec3f, s: vec3f, r_cam: f32) -> vec3f {\nlet theta = acos(clamp(d.y, -1.0, 1.0));\nlet hd = vec2f(d.x, d.z);\nlet hs = vec2f(s.x, s.z);\nlet ld = length(hd);\nlet ls = length(hs);\nlet cos_az = select(1.0, dot(hd, hs) / (ld * ls), ld > 1e-5 && ls > 1e-5);\nlet uv = sky_view_uv(theta, clamp(cos_az, -1.0, 1.0), r_cam);\nlet st = (uv * (SKY_VIEW_SIZE - 1.0) + 0.5) / SKY_VIEW_SIZE;\nreturn textureSampleLevel(lut, smp, st, 0.0).rgb;\n}\nfn sky_view_uv(theta: f32, cos_az: f32, r_cam: f32) -> vec2f {\nlet zh = horizon_angle(r_cam);\nlet beta = PI0 - zh;\nvar v: f32;\nif (theta < zh) {\nv = (1.0 - sqrt(max(1.0 - theta / zh, 0.0))) * 0.5;\n} else {\nv = sqrt(saturate((theta - zh) / beta)) * 0.5 + 0.5;\n}\nreturn vec2f(sqrt(saturate(0.5 - 0.5 * cos_az)), v);\n}\nconst SKY_VIEW_SIZE = vec2f(192.0, 108.0);\nfn horizon_angle(r_cam: f32) -> f32 {\nreturn PI0 - acos(clamp(sqrt(max(r_cam * r_cam - BOTTOM * BOTTOM, 0.0)) / r_cam, 0.0, 1.0));\n}\nconst PI0 = 3.14159265;\nconst BOTTOM = 6360.0;",
5
+ hash: '9d46557cec5b7088',
6
+ wgsl: "const PI = 3.14159265;\nconst PLANET = 6360.0;\nstruct CloudParams {\ninv_view_proj: mat4x4f,\nprev_view_proj: mat4x4f,\nsun: vec4f,\neye: vec4f,\nlayer: vec4f,\nshape: vec4f,\nsize: vec4f,\nquality: vec4f,\nlook: vec4f,\npano: vec4f,\nwmap: vec4f,\nsmap: vec4f,\n}\n@group(0) @binding(0) var<uniform> cp: CloudParams;\n@group(0) @binding(1) var<uniform> lighting: Lighting;\n@group(0) @binding(2) var sky_view: texture_2d<f32>;\n@group(0) @binding(3) var clamp_smp: sampler;\n@group(0) @binding(4) var shape_tex: texture_3d<f32>;\n@group(0) @binding(5) var detail_tex: texture_3d<f32>;\n@group(0) @binding(6) var wrap_smp: sampler;\n@group(0) @binding(7) var shape_out: texture_storage_3d<rgba8unorm, write>;\n@group(0) @binding(8) var detail_out: texture_storage_3d<rgba8unorm, write>;\n@group(0) @binding(9) var current_out: texture_storage_2d<rgba16float, write>;\n@group(0) @binding(10) var current: texture_2d<f32>;\n@group(0) @binding(11) var history: texture_2d<f32>;\n@group(0) @binding(12) var history_out: texture_storage_2d<rgba16float, write>;\n@group(0) @binding(13) var pano_out: texture_storage_2d<rgba16float, write>;\n@group(0) @binding(14) var scene_depth: texture_depth_2d;\n@group(0) @binding(15) var pano_prev: texture_2d<f32>;\n@group(0) @binding(16) var weather_tex: texture_2d<f32>;\n@group(0) @binding(17) var weather_out: texture_storage_2d<rgba8unorm, write>;\n@group(0) @binding(18) var shadow_out: texture_storage_2d<rgba16float, write>;\nfn pcg(v: u32) -> u32 {\nlet state = v * 747796405u + 2891336453u;\nlet word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;\nreturn (word >> 22u) ^ word;\n}\nfn hash3(c: vec3i, seed: u32) -> vec3f {\nlet h = pcg(bitcast<u32>(c.x) ^ pcg(bitcast<u32>(c.y) ^ pcg(bitcast<u32>(c.z) ^ seed)));\nlet h2 = pcg(h);\nlet h3 = pcg(h2);\nreturn vec3f(f32(h), f32(h2), f32(h3)) / 4294967296.0;\n}\nfn wrap3(c: vec3i, period: i32) -> vec3i {\nreturn ((c % period) + period) % period;\n}\nfn perlin(p: vec3f, period: i32, seed: u32) -> f32 {\nlet i = vec3i(floor(p));\nlet f = fract(p);\nlet u = f * f * f * (f * (f * 6.0 - 15.0) + 10.0);\nvar n: array<f32, 8>;\nfor (var k = 0; k < 8; k++) {\nlet o = vec3i(k & 1, (k >> 1) & 1, (k >> 2) & 1);\nlet g = normalize(hash3(wrap3(i + o, period), seed) * 2.0 - 1.0);\nn[k] = dot(g, f - vec3f(o));\n}\nlet x0 = mix(mix(n[0], n[1], u.x), mix(n[2], n[3], u.x), u.y);\nlet x1 = mix(mix(n[4], n[5], u.x), mix(n[6], n[7], u.x), u.y);\nreturn mix(x0, x1, u.z) * 1.4;\n}\nfn worley(p: vec3f, period: i32, seed: u32) -> f32 {\nlet i = vec3i(floor(p));\nlet f = fract(p);\nvar d = 8.0;\nfor (var k = 0; k < 27; k++) {\nlet o = vec3i(k % 3 - 1, (k / 3) % 3 - 1, k / 9 - 1);\nlet q = vec3f(o) + hash3(wrap3(i + o, period), seed) - f;\nd = min(d, dot(q, q));\n}\nreturn 1.0 - saturate(sqrt(d));\n}\nfn worley_fbm(p: vec3f, period: i32, seed: u32) -> f32 {\nreturn worley(p, period, seed) * 0.625 + worley(p * 2.0, period * 2, seed + 1u) * 0.25 + worley(p * 4.0, period * 4, seed + 2u) * 0.125;\n}\nfn remap(v: f32, a: f32, b: f32, c: f32, d: f32) -> f32 {\nreturn c + (v - a) / max(b - a, 1e-5) * (d - c);\n}\n@compute @workgroup_size(4, 4, 4) fn gen_shape(@builtin(global_invocation_id) id: vec3u) {\nlet n = textureDimensions(shape_out);\nif (any(id >= n)) {\nreturn;\n}\nlet uvw = (vec3f(id) + 0.5) / vec3f(n);\nvar pf = 0.0;\nvar amp = 0.5;\nvar per = 4;\nfor (var o = 0; o < 4; o++) {\npf += amp * perlin(uvw * f32(per), per, 11u + u32(o));\namp *= 0.5;\nper *= 2;\n}\npf = saturate(pf * 0.5 + 0.5);\nlet w4 = worley_fbm(uvw * 4.0, 4, 101u);\nlet w8 = worley_fbm(uvw * 8.0, 8, 211u);\nlet w16 = worley_fbm(uvw * 16.0, 16, 307u);\nlet pw = saturate(remap(pf, w4 - 1.0, 1.0, 0.0, 1.0));\ntextureStore(shape_out, vec3i(id), vec4f(pw, w4, w8, w16));\n}\n@compute @workgroup_size(4, 4, 4) fn gen_detail(@builtin(global_invocation_id) id: vec3u) {\nlet n = textureDimensions(detail_out);\nif (any(id >= n)) {\nreturn;\n}\nlet uvw = (vec3f(id) + 0.5) / vec3f(n);\ntextureStore(detail_out, vec3i(id), vec4f(worley_fbm(uvw * 2.0, 2, 401u), worley_fbm(uvw * 4.0, 4, 503u), worley_fbm(uvw * 8.0, 8, 601u), 1.0));\n}\nfn hash2(p: vec2f) -> f32 {\nlet q = vec2<i32>(floor(p));\nreturn f32(pcg(bitcast<u32>(q.x) ^ pcg(bitcast<u32>(q.y) + 0x9e3779b9u))) / 4294967296.0;\n}\nfn vnoise(p: vec2f) -> f32 {\nlet i = floor(p);\nlet f = fract(p);\nlet u = f * f * (3.0 - 2.0 * f);\nreturn mix(mix(hash2(i), hash2(i + vec2f(1.0, 0.0)), u.x), mix(hash2(i + vec2f(0.0, 1.0)), hash2(i + vec2f(1.0, 1.0)), u.x), u.y);\n}\nfn fbm2(p0: vec2f) -> f32 {\nvar p = p0;\nvar a = 0.5;\nvar s = 0.0;\nfor (var i = 0; i < 4; i++) {\ns += a * vnoise(p);\np = mat2x2f(1.6, 1.2, -1.2, 1.6) * p + vec2f(3.1, 1.7);\na *= 0.5;\n}\nreturn s / 0.9375;\n}\nfn weather(xz: vec2f) -> vec2f {\nlet q = xz / cp.look.x;\nlet w = fbm2(q);\nlet cov = saturate(remap(w, 1.0 - cp.layer.z * 1.15, 1.0, 0.0, 1.0));\nlet kind = saturate(0.5 + (fbm2(q * 0.37 + vec2f(13.0, 7.0)) - 0.5) * 2.0 * cp.look.y);\nreturn vec2f(cov, kind);\n}\nfn profile(h: f32, kind: f32) -> f32 {\nlet base = saturate(remap(h, 0.0, 0.08, 0.0, 1.0));\nlet top = saturate(remap(h, 0.25 + 0.6 * kind, 0.35 + 0.65 * kind, 1.0, 0.0));\nreturn base * top;\n}\n@compute @workgroup_size(8, 8) fn gen_weather(@builtin(global_invocation_id) id: vec3u) {\nlet n = u32(cp.wmap.w);\nif (id.x >= n || id.y >= n) {\nreturn;\n}\nlet xz = cp.wmap.xy + ((vec2f(id.xy) + 0.5) / f32(n) - 0.5) * cp.wmap.z;\ntextureStore(weather_out, vec2i(id.xy), vec4f(weather(xz), 0.0, 1.0));\n}\nfn base_cloud(p: vec3f, far: f32) -> vec4f {\nlet r = length(p);\nlet h = (r - PLANET - cp.layer.x) / (cp.layer.y - cp.layer.x);\nif (h <= 0.0 || h >= 1.0) {\nreturn vec4f(0.0);\n}\nlet xz = p.xz + cp.eye.xy + cp.shape.zw;\nlet wx = textureSampleLevel(weather_tex, clamp_smp, (xz - cp.wmap.xy) / cp.wmap.z + 0.5, 0.0).xy;\nif (wx.x <= 0.004) {\nreturn vec4f(0.0, h, xz);\n}\nlet prof = profile(h, wx.y);\nif (prof <= 0.0) {\nreturn vec4f(0.0, h, xz);\n}\nlet q = vec3f(xz.x, r - PLANET, xz.y) / (cp.shape.x * far);\nlet s = textureSampleLevel(shape_tex, wrap_smp, q, 0.0);\nlet fb = s.g * 0.625 + s.b * 0.25 + s.a * 0.125;\nlet base = saturate(remap(s.r, fb - 1.0, 1.0, 0.0, 1.0));\nreturn vec4f(saturate(remap(base * prof, 1.0 - wx.x, 1.0, 0.0, 1.0)) * wx.x, h, xz);\n}\nfn eroded(b: vec4f, alt: f32) -> f32 {\nlet d = textureSampleLevel(detail_tex, wrap_smp, vec3f(b.z, alt, b.w) / cp.shape.y, 0.0);\nlet df = d.r * 0.625 + d.g * 0.25 + d.b * 0.125;\nlet e = mix(df, 1.0 - df, saturate(b.y * 5.0));\nreturn saturate(remap(b.x, e * 0.35 * cp.look.w, 1.0, 0.0, 1.0)) * cp.layer.w;\n}\nfn density(p: vec3f, full: bool, far: f32) -> f32 {\nlet b = base_cloud(p, far);\nif (b.x <= 0.0) {\nreturn 0.0;\n}\nif (full) {\nreturn eroded(b, length(p) - PLANET);\n}\nreturn b.x * cp.layer.w;\n}\nfn hg(c: f32, g: f32) -> f32 {\nreturn (1.0 - g * g) / (4.0 * PI * pow(max(1.0 + g * g - 2.0 * g * c, 1e-4), 1.5));\n}\nfn phase(c: f32, k: f32) -> f32 {\nreturn mix(hg(c, -0.2 * k), hg(c, 0.75 * k), 0.6);\n}\nfn sun_depth(p: vec3f, steps: u32) -> f32 {\nlet s = cp.sun.xyz;\nvar tau = 0.0;\nvar t = 0.0;\nvar dt = 0.06;\nfor (var i = 0u; i < steps; i++) {\nlet m = t + dt * 0.5;\ntau += density(p + s * m, i < 2u, 1.0) * dt;\nt += dt;\ndt *= 2.1;\n}\nreturn tau;\n}\nfn ambient(h: f32) -> vec3f {\nlet up = lighting.sh[0].rgb * 0.282095 + lighting.sh[1].rgb * 0.488603;\nreturn max(up, vec3f(0.0)) * mix(0.45, 1.0, h);\n}\nfn march(d: vec3f, jitter: f32, steps_max: f32, steps_min: f32, sun_steps: u32, octaves: u32) -> vec4f {\nlet o = vec3f(0.0, cp.eye.z, 0.0);\nlet b = dot(o, d);\nlet rb = PLANET + cp.layer.x;\nlet rt = PLANET + cp.layer.y;\nlet cb = dot(o, o) - rb * rb;\nlet ct = dot(o, o) - rt * rt;\nif (d.y < -0.05 || cb > 0.0) {\nreturn vec4f(0.0, 0.0, 0.0, 1.0);\n}\nlet t0 = -b + sqrt(max(b * b - cb, 0.0));\nvar t1 = -b + sqrt(max(b * b - ct, 0.0));\nt1 = min(t1, t0 + 40.0);\nif (t0 > 220.0) {\nreturn vec4f(0.0, 0.0, 0.0, 1.0);\n}\nlet n = mix(steps_max, steps_min, saturate(d.y));\nlet dt = (t1 - t0) / n;\nlet s = cp.sun.xyz;\nlet cosv = dot(d, s);\nlet sun = lighting.sun_color.rgb;\nvar light = vec3f(0.0);\nvar trans = 1.0;\nvar dist_sum = 0.0;\nvar weight = 0.0;\nvar t = t0 + dt * jitter;\nvar empty = 0u;\nvar last = dt;\nlet rays = u32(n) * 2u;\nfor (var i = 0u; i < rays; i++) {\nif (t >= t1 || trans < 0.01) {\nbreak;\n}\nvar p = o + d * t;\nlet far = 1.0 + smoothstep(25.0, 75.0, t);\nvar cb = base_cloud(p, far);\nif (cb.x <= 0.0) {\nempty++;\nlast = dt * select(1.0, 2.0, empty > 2u);\nt += last;\ncontinue;\n}\nif (empty > 0u || i == 0u) {\nvar a = t - last;\nvar bb = t;\nfor (var k = 0u; k < 3u; k++) {\nlet m = 0.5 * (a + bb);\nif (base_cloud(o + d * m, far).x > 0.0) {\nbb = m;\n} else {\na = m;\n}\n}\nt = bb;\np = o + d * t;\ncb = base_cloud(p, far);\n}\nempty = 0u;\nlet sigma = select(cb.x * cp.layer.w, eroded(cb, length(p) - PLANET), t < 30.0);\nif (sigma > 0.0) {\nlet h = (length(p) - rb) / (rt - rb);\nlet tau = sun_depth(p, sun_steps);\nvar ms = 0.0;\nvar a = 1.0;\nvar bb = 1.0;\nvar c = 1.0;\nfor (var k = 0u; k < octaves; k++) {\nms += a * exp(-tau * bb) * phase(cosv, c);\na *= 0.5;\nbb *= 0.5;\nc *= 0.5;\n}\nlet powder = 1.0 - 0.6 * exp(-sigma * 0.3);\nlet scatter = sun * (ms * powder * 2.5) + ambient(h) * 1.3;\nlet e = exp(-sigma * dt);\nlight += trans * scatter * (1.0 - e);\ndist_sum += trans * (1.0 - e) * t;\nweight += trans * (1.0 - e);\ntrans *= e;\n}\nlast = dt;\nt += dt;\n}\nif (weight > 0.0) {\nlet mean = dist_sum / weight;\nlet haze = 1.0 - exp(-mean / cp.look.z);\nlet behind = sky_view_at(sky_view, clamp_smp, d, s, cp.eye.z) * lighting.view.rgb;\nlight = mix(light, behind * (1.0 - trans), haze * 0.5) * (1.0 - haze * 0.8);\ntrans = mix(trans, 1.0, haze * 0.8);\n}\nreturn vec4f(light, trans);\n}\nfn view_dir(uv: vec2f) -> vec3f {\nlet ndc = vec2f(uv.x * 2.0 - 1.0, 1.0 - uv.y * 2.0);\nlet near = cp.inv_view_proj * vec4f(ndc, 1.0, 1.0);\nreturn normalize(near.xyz / near.w);\n}\nfn ign(px: vec2f, frame: f32) -> f32 {\nlet q = px + 5.588238 * (frame % 64.0);\nreturn fract(52.9829189 * fract(dot(q, vec2f(0.06711056, 0.00583715))));\n}\n@compute @workgroup_size(8, 8) fn march_view(@builtin(global_invocation_id) id: vec3u) {\nlet n = textureDimensions(current_out);\nif (any(id.xy >= n)) {\nreturn;\n}\nlet texel = vec2f(id.xy) * 2.0 + cp.size.zw;\nlet uv = (texel + 0.5) / cp.size.xy;\nlet r = march(view_dir(uv), ign(vec2f(id.xy), cp.sun.w), cp.quality.x, cp.quality.y, u32(cp.quality.z), u32(cp.quality.w));\ntextureStore(current_out, vec2i(id.xy), r);\n}\n@compute @workgroup_size(8, 8) fn reconstruct(@builtin(global_invocation_id) id: vec3u) {\nlet size = vec2u(cp.size.xy);\nif (any(id.xy >= size)) {\nreturn;\n}\nlet cn = vec2i(textureDimensions(current));\nlet px = vec2f(id.xy);\nlet uv = (px + 0.5) / cp.size.xy;\nlet phase_px = cp.size.zw;\nlet mine = all(vec2u(id.xy % 2u) == vec2u(phase_px));\nlet f = (px - phase_px) * 0.5;\nlet i0 = vec2i(floor(f));\nlet w = fract(f);\nlet s00 = textureLoad(current, clamp(i0, vec2i(0), cn - 1), 0);\nlet s10 = textureLoad(current, clamp(i0 + vec2i(1, 0), vec2i(0), cn - 1), 0);\nlet s01 = textureLoad(current, clamp(i0 + vec2i(0, 1), vec2i(0), cn - 1), 0);\nlet s11 = textureLoad(current, clamp(i0 + vec2i(1, 1), vec2i(0), cn - 1), 0);\nvar m1 = vec4f(0.0);\nvar m2 = vec4f(0.0);\nfor (var k = 0; k < 9; k++) {\nlet q = textureLoad(current, clamp(i0 + vec2i(round(w)) + vec2i(k % 3 - 1, k / 3 - 1), vec2i(0), cn - 1), 0);\nm1 += q;\nm2 += q * q;\n}\nm1 /= 9.0;\nlet sd = sqrt(max(m2 / 9.0 - m1 * m1, vec4f(0.0)));\nlet mn = m1 - sd * 1.5;\nlet mx = m1 + sd * 1.5;\nlet spatial = mix(mix(s00, s10, w.x), mix(s01, s11, w.x), w.y);\nlet dir = view_dir(uv);\nlet c = cp.prev_view_proj * vec4f(dir * 1.0e4, 1.0);\nvar out = spatial;\nif (c.w > 0.0) {\nlet prev = vec2f(c.x / c.w * 0.5 + 0.5, 0.5 - c.y / c.w * 0.5);\nif (all(prev >= vec2f(0.0)) && all(prev <= vec2f(1.0)) && cp.sun.w > 0.5) {\nlet hist = textureSampleLevel(history, clamp_smp, prev, 0.0);\nlet held = clamp(hist, mn - vec4f(0.002), mx + vec4f(0.002));\nout = select(held, mix(held, s00, 0.2), mine);\n}\n}\ntextureStore(history_out, vec2i(id.xy), out);\n}\n@compute @workgroup_size(8, 8) fn panorama(@builtin(global_invocation_id) id: vec3u) {\nlet n = vec2u(cp.pano.zw);\nif (id.x >= n.x || id.y >= n.y) {\nreturn;\n}\nlet prev = textureLoad(pano_prev, vec2i(id.xy), 0);\nif (id.y % 8u != u32(cp.pano.x)) {\ntextureStore(pano_out, vec2i(id.xy), prev);\nreturn;\n}\nlet frame = cp.sun.w;\nlet j = vec2f(fract(frame * 0.754877666), fract(frame * 0.569840291));\nlet u = (f32(id.x) + j.x) / f32(n.x);\nlet v = (f32(id.y) + j.y) / f32(n.y);\nlet se = v * v;\nlet ce = sqrt(max(1.0 - se * se, 0.0));\nlet az = 2.0 * PI * u;\nlet d = vec3f(ce * cos(az), se, ce * sin(az));\nlet r = march(d, fract(frame * 0.618034), 64.0, 24.0, 4u, 2u);\nlet w = select(0.3, 1.0, frame < 8.5);\ntextureStore(pano_out, vec2i(id.xy), mix(prev, r, w));\n}\n@compute @workgroup_size(8, 8) fn shadow_map(@builtin(global_invocation_id) id: vec3u) {\nlet n = textureDimensions(shadow_out);\nif (any(id.xy >= n)) {\nreturn;\n}\nif (cp.smap.w < 3.5 && id.y % 4u != u32(cp.smap.w)) {\nreturn;\n}\nlet rel = cp.smap.xy - cp.eye.xy + ((vec2f(id.xy) + 0.5) / vec2f(n) - 0.5) * cp.smap.z;\nlet o = vec3f(rel.x, PLANET, rel.y);\nlet s = cp.sun.xyz;\nlet sy = max(s.y, 0.05);\nlet t0 = cp.layer.x / sy;\nlet t1 = min(cp.layer.y / sy, t0 + 40.0);\nlet steps = 16u;\nlet dt = (t1 - t0) / f32(steps);\nvar tau = 0.0;\nfor (var i = 0u; i < steps; i++) {\ntau += density(o + s * (t0 + dt * (f32(i) + 0.5)), true, 1.0) * dt;\n}\nlet light = max(exp(-tau), 0.7 * exp(-0.25 * tau));\ntextureStore(shadow_out, vec2i(id.xy), vec4f(select(1.0, light, s.y > 0.0), 0.0, 0.0, 1.0));\n}\nstruct CompositeOut {\n@builtin(position) clip: vec4f,\n@location(0) uv: vec2f,\n}\n@vertex fn vs_composite(@builtin(vertex_index) i: u32) -> CompositeOut {\nlet p = vec2f(f32((i << 1u) & 2u), f32(i & 2u)) * 2.0 - 1.0;\nvar o: CompositeOut;\no.clip = vec4f(p, 0.0, 1.0);\no.uv = vec2f(p.x * 0.5 + 0.5, 0.5 - p.y * 0.5);\nreturn o;\n}\n@fragment fn fs_composite(in: CompositeOut) -> @location(0) vec4f {\nif (textureLoad(scene_depth, vec2i(in.clip.xy), 0) > 0.0) {\ndiscard;\n}\nlet c = textureSampleLevel(history, clamp_smp, in.uv, 0.0);\nreturn vec4f(c.rgb * lighting.env.z, c.a);\n}\nstruct Lighting {\nsun_color: vec4f,\nenv: vec4f,\nsh: array<vec4f, 9>,\nscreen: vec4f,\nview: vec4f,\nao_reproject: mat4x4f,\nao: vec4f,\nfog: vec4f,\nfog2: vec4f,\nfog_air: vec4f,\ngi_grid: vec4f,\ngi_counts: vec4f,\nssr: vec4f,\ngi_cascades: array<vec4f, 3>,\nclouds: vec4f,\n}\nfn sky_view_at(lut: texture_2d<f32>, smp: sampler, d: vec3f, s: vec3f, r_cam: f32) -> vec3f {\nlet theta = acos(clamp(d.y, -1.0, 1.0));\nlet hd = vec2f(d.x, d.z);\nlet hs = vec2f(s.x, s.z);\nlet ld = length(hd);\nlet ls = length(hs);\nlet cos_az = select(1.0, dot(hd, hs) / (ld * ls), ld > 1e-5 && ls > 1e-5);\nlet uv = sky_view_uv(theta, clamp(cos_az, -1.0, 1.0), r_cam);\nlet st = (uv * (SKY_VIEW_SIZE - 1.0) + 0.5) / SKY_VIEW_SIZE;\nreturn textureSampleLevel(lut, smp, st, 0.0).rgb;\n}\nfn sky_view_uv(theta: f32, cos_az: f32, r_cam: f32) -> vec2f {\nlet zh = horizon_angle(r_cam);\nlet beta = PI0 - zh;\nvar v: f32;\nif (theta < zh) {\nv = (1.0 - sqrt(max(1.0 - theta / zh, 0.0))) * 0.5;\n} else {\nv = sqrt(saturate((theta - zh) / beta)) * 0.5 + 0.5;\n}\nreturn vec2f(sqrt(saturate(0.5 - 0.5 * cos_az)), v);\n}\nconst SKY_VIEW_SIZE = vec2f(192.0, 108.0);\nfn horizon_angle(r_cam: f32) -> f32 {\nreturn PI0 - acos(clamp(sqrt(max(r_cam * r_cam - BOTTOM * BOTTOM, 0.0)) / r_cam, 0.0, 1.0));\n}\nconst PI0 = 3.14159265;\nconst BOTTOM = 6360.0;",
7
7
  };
8
8
  //# sourceMappingURL=clouds-shaders.gen.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"clouds-shaders.gen.js","sourceRoot":"","sources":["../src/clouds-shaders.gen.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,yEAAyE;AAEzE,8CAA8C;AAC9C,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE,kBAAkB;IACxB,IAAI,EAAE,q2cAAq2c;CACn2c,CAAC"}
1
+ {"version":3,"file":"clouds-shaders.gen.js","sourceRoot":"","sources":["../src/clouds-shaders.gen.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,yEAAyE;AAEzE,8CAA8C;AAC9C,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE,kBAAkB;IACxB,IAAI,EAAE,sveAAsve;CACpve,CAAC"}
package/dist/clouds.d.ts CHANGED
@@ -26,6 +26,8 @@ export interface CloudOptions {
26
26
  readonly erosion?: number;
27
27
  /** The march's budget (default 'high'). */
28
28
  readonly quality?: CloudQuality;
29
+ /** Where the cloud field sits, world x and z in metres (default [0, 0]; see `Clouds.offset`). */
30
+ readonly offset?: readonly [number, number];
29
31
  }
30
32
  /**
31
33
  * Volumetric clouds (ADR-0219): a layer of cumulus ray-marched through procedural noise, lit by the sun and the sky,
@@ -58,20 +60,37 @@ export declare class Clouds implements RenderFeature {
58
60
  enabled: boolean;
59
61
  /** The reflections' panorama (rgb light, a transmittance; u = azimuth / 2π, v = √(sin elevation)). */
60
62
  readonly panorama: GPUTexture;
63
+ /**
64
+ * The cloud shadow map (ADR-0227): r = the sun's light through the layer at sea level, over `SHADOW_KM` about the camera.
65
+ * Published on the environment as `cloudShadow` for the scene and the water.
66
+ */
67
+ readonly shadow: GPUTexture;
68
+ /** Cast shadows on the ground and the water (ADR-0227; live). */
69
+ shadows: boolean;
70
+ /**
71
+ * Where the cloud field sits, world x and z in metres (ADR-0231; live): the whole weather moves by it, so an app can
72
+ * place its clouds (a showcase starting in sunshine) without changing their shapes.
73
+ */
74
+ offset: [number, number];
61
75
  constructor(device: GPUDevice, o: CloudOptions);
62
76
  init(cache: PipelineCache, format: GPUTextureFormat): Promise<void>;
63
77
  prepare(f: RenderFeatureFrame): void;
64
78
  addPasses(graph: FrameGraph, color: string, depth: string, scene: SceneRenderer): void;
65
79
  /**
66
- * The march's GPU cost, ms a frame (wall time of `frames` frames' march, rebuild and panorama in one submission to
67
- * `onSubmittedWorkDone`, after one warm submission): a frame-graph pass timer cannot tell it, as the first pass after
80
+ * The march's GPU cost, ms a frame (wall time of `frames` + 1 frames' march, rebuild and panorama in one submission
81
+ * less that of 1, over `frames`, each to `onSubmittedWorkDone`): a frame-graph pass timer cannot tell it, as the first pass after
68
82
  * the scene's absorbs the scene's drain (trap 237). Null before the first frame.
69
83
  *
70
84
  * @example
71
85
  * const ms = await render.features.find((f) => f.name === 'clouds').measure();
72
86
  */
73
87
  measure(frames?: number): Promise<number | null>;
74
- /** What the clouds hold on the GPU: the noise volumes, the panorama and the history. */
88
+ /**
89
+ * Its agent tools (ADR-0227): `clouds.state` reads the layer and its knobs, `clouds.set` turns them. Errors carry the
90
+ * argument's `path`.
91
+ */
92
+ tools(): ReturnType<NonNullable<RenderFeature['tools']>>;
93
+ /** What the clouds hold on the GPU: the noise volumes, the panorama, the history and the shadow map. */
75
94
  get gpuBytes(): number;
76
95
  destroy(): void;
77
96
  }
package/dist/clouds.js CHANGED
@@ -6,8 +6,8 @@ const QUALITY = {
6
6
  medium: [64, 32, 4, 2],
7
7
  low: [40, 20, 3, 2],
8
8
  };
9
- /** Bytes of `CloudParams` (clouds.wesl): two matrices and eight vectors. */
10
- const PARAMS_BYTES = (16 * 2 + 4 * 9) * 4;
9
+ /** Bytes of `CloudParams` (clouds.wesl): two matrices and ten vectors. */
10
+ const PARAMS_BYTES = (16 * 2 + 4 * 10) * 4;
11
11
  const SHAPE_SIZE = 128;
12
12
  const DETAIL_SIZE = 32;
13
13
  const PANO = [1024, 256];
@@ -15,6 +15,9 @@ const PANO = [1024, 256];
15
15
  const WEATHER = 1024;
16
16
  const WEATHER_KM = 320;
17
17
  const PLANET_KM = 6360;
18
+ /** The cloud shadow map (ADR-0227): texels a side and its width (km), moved when the camera has gone an eighth of it. */
19
+ const SHADOW = 512;
20
+ const SHADOW_KM = 12.8;
18
21
  /** STORAGE_BINDING | TEXTURE_BINDING. */
19
22
  const STORE = 0x08 | 0x04;
20
23
  /** The order the 2 × 2 phases are marched in (a Bayer pattern). */
@@ -60,6 +63,21 @@ export class Clouds {
60
63
  #panoWork;
61
64
  #shape;
62
65
  #weather;
66
+ /**
67
+ * The cloud shadow map (ADR-0227): r = the sun's light through the layer at sea level, over `SHADOW_KM` about the camera.
68
+ * Published on the environment as `cloudShadow` for the scene and the water.
69
+ */
70
+ shadow;
71
+ /** The shadow map's centre (world km), or null before it is made; true while every row must be marched. */
72
+ #shadowAt = null;
73
+ #shadowAll = true;
74
+ /** Cast shadows on the ground and the water (ADR-0227; live). */
75
+ shadows = true;
76
+ /**
77
+ * Where the cloud field sits, world x and z in metres (ADR-0231; live): the whole weather moves by it, so an app can
78
+ * place its clouds (a showcase starting in sunshine) without changing their shapes.
79
+ */
80
+ offset = [0, 0];
63
81
  /** The weather map's centre (world km), or null before it is made. */
64
82
  #weatherAt = null;
65
83
  #detail;
@@ -99,10 +117,14 @@ export class Clouds {
99
117
  this.haze = o.haze ?? 12;
100
118
  this.erosion = o.erosion ?? 1;
101
119
  this.quality = o.quality ?? 'high';
120
+ if (o.offset)
121
+ this.offset = [o.offset[0], o.offset[1]];
102
122
  if (!(this.top > this.bottom && this.bottom >= 0))
103
123
  throw Object.assign(new Error(`CLOUDS_LAYER: a layer from ${this.bottom} m to ${this.top} m; the top must be above the bottom, both above 0.`), { code: 'CLOUDS_LAYER', path: 'top' });
104
124
  this.#shape = device.createTexture({ label: 'yali:clouds:shape', size: [SHAPE_SIZE, SHAPE_SIZE, SHAPE_SIZE], dimension: '3d', format: 'rgba8unorm', usage: STORE });
105
125
  this.#weather = device.createTexture({ label: 'yali:clouds:weather', size: [WEATHER, WEATHER], format: 'rgba8unorm', usage: STORE });
126
+ // COPY_SRC: tools and probes read it back.
127
+ this.shadow = device.createTexture({ label: 'yali:clouds:shadow', size: [SHADOW, SHADOW], format: 'rgba16float', usage: STORE | 0x01 });
106
128
  this.#detail = device.createTexture({ label: 'yali:clouds:detail', size: [DETAIL_SIZE, DETAIL_SIZE, DETAIL_SIZE], dimension: '3d', format: 'rgba8unorm', usage: STORE });
107
129
  // Rows accumulate over frames: marched into the work texture from the panorama, then copied back (COPY_SRC |
108
130
  // COPY_DST; tools and probes read the panorama back too).
@@ -115,13 +137,14 @@ export class Clouds {
115
137
  }
116
138
  async init(cache, format) {
117
139
  const c = (entryPoint) => cache.compute({ label: `yali:clouds:${entryPoint}`, compute: { shader: cloudsShader, entryPoint } });
118
- const [shape, detail, weather, march, rebuild, pano, draw] = await Promise.all([
140
+ const [shape, detail, weather, march, rebuild, pano, shadow, draw] = await Promise.all([
119
141
  c('gen_shape'),
120
142
  c('gen_detail'),
121
143
  c('gen_weather'),
122
144
  c('march_view'),
123
145
  c('reconstruct'),
124
146
  c('panorama'),
147
+ c('shadow_map'),
125
148
  cache.render({
126
149
  label: 'yali:clouds:draw',
127
150
  vertex: { shader: cloudsShader, entryPoint: 'vs_composite' },
@@ -130,7 +153,7 @@ export class Clouds {
130
153
  primitive: { topology: 'triangle-list' },
131
154
  }),
132
155
  ]);
133
- this.#p = { shape, detail, weather, march, rebuild, pano, draw };
156
+ this.#p = { shape, detail, weather, march, rebuild, pano, shadow, draw };
134
157
  }
135
158
  /** The textures that follow the render size: this frame's samples (a quarter) and the half-size history (two). */
136
159
  #resize(w, h) {
@@ -175,7 +198,7 @@ export class Clouds {
175
198
  d.set([eye[0] / 1000, eye[2] / 1000, PLANET_KM + Math.max(eye[1], 1) / 1000, f.seconds], 36);
176
199
  d.set([this.bottom / 1000, this.top / 1000, Math.max(0, Math.min(1, this.coverage)), this.density], 40);
177
200
  const drift = (this.wind * f.seconds) / 1000;
178
- d.set([this.shapeSize, this.detailSize, Math.cos(this.windDirection) * drift, Math.sin(this.windDirection) * drift], 44);
201
+ d.set([this.shapeSize, this.detailSize, Math.cos(this.windDirection) * drift + this.offset[0] / 1000, Math.sin(this.windDirection) * drift + this.offset[1] / 1000], 44);
179
202
  const ph = PHASES[this.#frame & 3];
180
203
  d.set([this.#size[0], this.#size[1], ph[0], ph[1]], 48);
181
204
  d.set(QUALITY[this.quality], 52);
@@ -195,6 +218,15 @@ export class Clouds {
195
218
  if (regen)
196
219
  this.#weatherAt = [ex, ez];
197
220
  d.set([this.#weatherAt[0], this.#weatherAt[1], WEATHER_KM, WEATHER], 64);
221
+ // The shadow map follows the camera in steps of an eighth of its width, every row marched after a move, a quarter of
222
+ // them a frame otherwise (ADR-0227).
223
+ const sa = this.#shadowAt;
224
+ if (!sa || Math.abs(ex - sa[0]) > SHADOW_KM / 8 || Math.abs(ez - sa[1]) > SHADOW_KM / 8) {
225
+ this.#shadowAt = [Math.round(ex / (SHADOW_KM / SHADOW)) * (SHADOW_KM / SHADOW), Math.round(ez / (SHADOW_KM / SHADOW)) * (SHADOW_KM / SHADOW)];
226
+ this.#shadowAll = true;
227
+ }
228
+ d.set([this.#shadowAt[0], this.#shadowAt[1], SHADOW_KM, this.#shadowAll ? 4 : this.#frame & 3], 68);
229
+ f.environment.cloudShadow = this.enabled && this.shadows ? { texture: this.shadow, centre: [this.#shadowAt[0] * 1000, this.#shadowAt[1] * 1000], size: SHADOW_KM * 1000 } : null;
198
230
  this.device.queue.writeBuffer(this.#params, 0, d);
199
231
  if ((regen || this.#weatherStale) && this.#p) {
200
232
  const enc = this.device.createCommandEncoder({ label: 'yali:clouds:weather' });
@@ -232,6 +264,19 @@ export class Clouds {
232
264
  march: d.createBindGroup({ label: 'yali:clouds:march', layout: p.march.getBindGroupLayout(0), entries: [...shared, { binding: 9, resource: this.#current.createView() }] }),
233
265
  rebuild: [rebuild(h0, h1), rebuild(h1, h0)],
234
266
  pano: d.createBindGroup({ label: 'yali:clouds:panorama', layout: p.pano.getBindGroupLayout(0), entries: [...shared, { binding: 13, resource: this.#panoWork.createView() }, { binding: 15, resource: this.panorama.createView() }] }),
267
+ shadow: d.createBindGroup({
268
+ label: 'yali:clouds:shadow',
269
+ layout: p.shadow.getBindGroupLayout(0),
270
+ entries: [
271
+ { binding: 0, resource: { buffer: this.#params } },
272
+ { binding: 3, resource: this.#clamp },
273
+ { binding: 4, resource: this.#shape.createView({ dimension: '3d' }) },
274
+ { binding: 5, resource: this.#detail.createView({ dimension: '3d' }) },
275
+ { binding: 6, resource: this.#wrap },
276
+ { binding: 16, resource: this.#weather.createView() },
277
+ { binding: 18, resource: this.shadow.createView() },
278
+ ],
279
+ }),
235
280
  };
236
281
  this.#drawGroups = null;
237
282
  return true;
@@ -271,6 +316,12 @@ export class Clouds {
271
316
  pass.setPipeline(p.pano);
272
317
  pass.setBindGroup(0, g.pano);
273
318
  pass.dispatchWorkgroups(PANO[0] / 8, PANO[1] / 8);
319
+ if (this.shadows) {
320
+ pass.setPipeline(p.shadow);
321
+ pass.setBindGroup(0, g.shadow);
322
+ pass.dispatchWorkgroups(SHADOW / 8, SHADOW / 8);
323
+ this.#shadowAll = false;
324
+ }
274
325
  },
275
326
  });
276
327
  // The panorama's marched rows back into the one reflections read.
@@ -308,8 +359,8 @@ export class Clouds {
308
359
  });
309
360
  }
310
361
  /**
311
- * The march's GPU cost, ms a frame (wall time of `frames` frames' march, rebuild and panorama in one submission to
312
- * `onSubmittedWorkDone`, after one warm submission): a frame-graph pass timer cannot tell it, as the first pass after
362
+ * The march's GPU cost, ms a frame (wall time of `frames` + 1 frames' march, rebuild and panorama in one submission
363
+ * less that of 1, over `frames`, each to `onSubmittedWorkDone`): a frame-graph pass timer cannot tell it, as the first pass after
313
364
  * the scene's absorbs the scene's drain (trap 237). Null before the first frame.
314
365
  *
315
366
  * @example
@@ -334,6 +385,11 @@ export class Clouds {
334
385
  pass.setPipeline(p.pano);
335
386
  pass.setBindGroup(0, g.pano);
336
387
  pass.dispatchWorkgroups(PANO[0] / 8, PANO[1] / 8);
388
+ if (this.shadows) {
389
+ pass.setPipeline(p.shadow);
390
+ pass.setBindGroup(0, g.shadow);
391
+ pass.dispatchWorkgroups(SHADOW / 8, SHADOW / 8);
392
+ }
337
393
  }
338
394
  pass.end();
339
395
  await this.device.queue.onSubmittedWorkDone();
@@ -343,16 +399,89 @@ export class Clouds {
343
399
  return performance.now() - t0;
344
400
  };
345
401
  await run(2);
346
- return (await run(frames)) / frames;
402
+ // The render loop's own frames land in either window: the difference of two batch sizes cancels them.
403
+ const small = await run(1);
404
+ return Math.max(0, (await run(frames + 1)) - small) / frames;
405
+ }
406
+ /**
407
+ * Its agent tools (ADR-0227): `clouds.state` reads the layer and its knobs, `clouds.set` turns them. Errors carry the
408
+ * argument's `path`.
409
+ */
410
+ tools() {
411
+ const bad = (path, message) => Object.assign(new Error(`CLOUDS_INVALID: ${path} ${message}`), { code: 'CLOUDS_INVALID', path, message: `${path} ${message}` });
412
+ const num = (args, k, min, max = Number.POSITIVE_INFINITY) => {
413
+ const v = args[k];
414
+ if (v === undefined)
415
+ return undefined;
416
+ if (typeof v !== 'number' || !Number.isFinite(v) || v < min || v > max)
417
+ throw bad(k, `must be a number from ${min}${Number.isFinite(max) ? ` to ${max}` : ''}`);
418
+ return v;
419
+ };
420
+ const state = () => ({
421
+ enabled: this.enabled,
422
+ shadows: this.shadows,
423
+ quality: this.quality,
424
+ coverage: this.coverage,
425
+ bottom: this.bottom,
426
+ top: this.top,
427
+ density: this.density,
428
+ wind: this.wind,
429
+ windDirection: this.windDirection,
430
+ gpuBytes: this.gpuBytes,
431
+ });
432
+ return [
433
+ { name: 'clouds.state', description: 'The volumetric clouds: on or off, whether they shadow the ground and water, quality, coverage, layer, density, wind and GPU bytes.', input: { type: 'object', properties: {} }, run: state },
434
+ {
435
+ name: 'clouds.set',
436
+ description: "Turns the clouds' live knobs; only the arguments given change. Returns the new state.",
437
+ input: {
438
+ type: 'object',
439
+ properties: {
440
+ enabled: { type: 'boolean', description: 'March and draw the clouds at all.' },
441
+ shadows: { type: 'boolean', description: 'Cast the clouds’ shadows on the ground and the water.' },
442
+ quality: { type: 'string', description: 'The march budget: high, medium or low.' },
443
+ coverage: { type: 'number', description: 'How much of the sky is cloud, 0 to 1.' },
444
+ density: { type: 'number', description: 'Extinction inside a full cloud, per km, 1 to 500.' },
445
+ wind: { type: 'number', description: 'The wind at the clouds, m/s, 0 to 60.' },
446
+ windDirection: { type: 'number', description: 'The direction the wind blows towards, radians from +x.' },
447
+ },
448
+ },
449
+ run: (args) => {
450
+ if (args.enabled !== undefined)
451
+ this.enabled = !!args.enabled;
452
+ if (args.shadows !== undefined)
453
+ this.shadows = !!args.shadows;
454
+ if (args.quality !== undefined) {
455
+ if (args.quality !== 'high' && args.quality !== 'medium' && args.quality !== 'low')
456
+ throw bad('quality', 'must be high, medium or low');
457
+ this.quality = args.quality;
458
+ }
459
+ const c = num(args, 'coverage', 0, 1);
460
+ if (c !== undefined)
461
+ this.coverage = c;
462
+ const d = num(args, 'density', 1, 500);
463
+ if (d !== undefined)
464
+ this.density = d;
465
+ const w = num(args, 'wind', 0, 60);
466
+ if (w !== undefined)
467
+ this.wind = w;
468
+ const wd = num(args, 'windDirection', -Math.PI * 4, Math.PI * 4);
469
+ if (wd !== undefined)
470
+ this.windDirection = wd;
471
+ return state();
472
+ },
473
+ },
474
+ ];
347
475
  }
348
- /** What the clouds hold on the GPU: the noise volumes, the panorama and the history. */
476
+ /** What the clouds hold on the GPU: the noise volumes, the panorama, the history and the shadow map. */
349
477
  get gpuBytes() {
350
478
  const [w, h] = this.#size;
351
- return SHAPE_SIZE ** 3 * 4 + DETAIL_SIZE ** 3 * 4 + WEATHER * WEATHER * 4 + PANO[0] * PANO[1] * 8 * 2 + w * h * 8 * 2 + Math.ceil(w / 2) * Math.ceil(h / 2) * 8;
479
+ return SHAPE_SIZE ** 3 * 4 + DETAIL_SIZE ** 3 * 4 + WEATHER * WEATHER * 4 + SHADOW * SHADOW * 8 + PANO[0] * PANO[1] * 8 * 2 + w * h * 8 * 2 + Math.ceil(w / 2) * Math.ceil(h / 2) * 8;
352
480
  }
353
481
  destroy() {
354
482
  this.#shape.destroy();
355
483
  this.#weather.destroy();
484
+ this.shadow.destroy();
356
485
  this.#detail.destroy();
357
486
  this.panorama.destroy();
358
487
  this.#panoWork.destroy();
@@ -1 +1 @@
1
- {"version":3,"file":"clouds.js","sourceRoot":"","sources":["../src/clouds.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"clouds.js","sourceRoot":"","sources":["../src/clouds.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yali-engine/clouds",
3
- "version": "0.12.0",
3
+ "version": "0.14.0",
4
4
  "description": "Yali clouds: volumetric cumulus ray-marched through procedural noise, lit by the sun and the sky, a render feature (ADR-0219).",
5
5
  "license": "MIT OR Apache-2.0",
6
6
  "type": "module",
@@ -18,8 +18,8 @@
18
18
  "dist"
19
19
  ],
20
20
  "dependencies": {
21
- "@yali-engine/math": "0.12.0",
22
- "@yali-engine/render": "0.12.0"
21
+ "@yali-engine/math": "0.14.0",
22
+ "@yali-engine/render": "0.14.0"
23
23
  },
24
24
  "scripts": {
25
25
  "typecheck": "tsc -p tsconfig.json",