@yali-engine/clouds 0.13.0 → 0.15.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,10 @@
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: "23dcb67d558117a2";
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,\namb: vec4f,\nevolve: 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;\nvar wx = textureSampleLevel(weather_tex, clamp_smp, (xz - cp.wmap.xy) / cp.wmap.z + 0.5, 0.0).xy;\nif (cp.evolve.x > 0.0 && wx.x > 0.004) {\nlet w2 = textureSampleLevel(weather_tex, clamp_smp, (xz + cp.evolve.zw - cp.wmap.xy) / cp.wmap.z + 0.5, 0.0).x;\nwx.x = saturate(wx.x * (1.0 + (w2 - 0.5) * 2.0 * cp.evolve.x));\n}\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 - cp.evolve.y, 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 - cp.amb.rgb;\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 diffuse = max(s.y, 0.0) / (1.0 + 0.1125 * tau) / PI;\nlet scatter = sun * (ms + diffuse * powder) + 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}\n@group(0) @binding(19) var<storage, read_write> sh_rows: array<vec4f>;\nvar<workgroup> sh_wg: array<array<vec3f, 9>, 64>;\nfn sh_basis(d: vec3f) -> array<f32, 9> {\nreturn array<f32, 9>(0.282095, 0.488603 * d.y, 0.488603 * d.z, 0.488603 * d.x, 1.092548 * d.x * d.y, 1.092548 * d.y * d.z, 0.315392 * (3.0 * d.z * d.z - 1.0), 1.092548 * d.x * d.z, 0.546274 * (d.x * d.x - d.y * d.y));\n}\nfn sh_reduce(li: u32, acc: array<vec3f, 9>) {\nsh_wg[li] = acc;\nworkgroupBarrier();\nfor (var s = 32u; s > 0u; s >>= 1u) {\nif (li < s) {\nfor (var k = 0u; k < 9u; k++) {\nsh_wg[li][k] += sh_wg[li + s][k];\n}\n}\nworkgroupBarrier();\n}\n}\n@compute @workgroup_size(64) fn pano_sh(@builtin(workgroup_id) wg: vec3u, @builtin(local_invocation_index) li: u32) {\nlet n = vec2u(cp.pano.zw);\nlet row = wg.x;\nvar acc: array<vec3f, 9>;\nlet v = (f32(row) + 0.5) / f32(n.y);\nlet se = v * v;\nlet ce = sqrt(max(1.0 - se * se, 0.0));\nlet d_omega = (2.0 * PI / f32(n.x)) * (2.0 * v / f32(n.y));\nfor (var x = li; x < n.x; x += 64u) {\nlet az = 2.0 * PI * (f32(x) + 0.5) / f32(n.x);\nlet d = vec3f(ce * cos(az), se, ce * sin(az));\nlet c = textureLoad(pano_prev, vec2i(i32(x), i32(row)), 0);\nlet sky = sky_view_at(sky_view, clamp_smp, d, cp.sun.xyz, cp.eye.z) * lighting.view.rgb;\nlet delta = c.rgb - sky * (1.0 - c.a);\nlet y = sh_basis(d);\nfor (var k = 0u; k < 9u; k++) {\nacc[k] += delta * (y[k] * d_omega);\n}\n}\nsh_reduce(li, acc);\nif (li < 9u) {\nsh_rows[row * 9u + li] = vec4f(sh_wg[0][li], 0.0);\n}\n}\n@compute @workgroup_size(64) fn pano_sh_sum(@builtin(local_invocation_index) li: u32) {\nlet rows = u32(cp.pano.w);\nvar acc: array<vec3f, 9>;\nfor (var r = li; r < rows; r += 64u) {\nfor (var k = 0u; k < 9u; k++) {\nacc[k] += sh_rows[r * 9u + k].rgb;\n}\n}\nsh_reduce(li, acc);\nif (li < 9u) {\nlet band = select(select(1.0 / 4.0, 2.0 / 3.0, li >= 1u && li <= 3u), 1.0, li == 0u);\nsh_rows[rows * 9u + li] = vec4f(sh_wg[0][li] * band, 0.0);\n}\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
+ };
6
+ /** Linked from shaders/clouds/shafts.wesl. */
7
+ export declare const shaftsShader: {
8
+ readonly hash: "c067ed30af3fab0a";
9
+ readonly wgsl: "const FOUR_PI = 12.5663706;\nconst SAMPLES = 8u;\nstruct ShaftParams {\ninv_view_proj: mat4x4f,\nsun: vec4f,\nsmap: vec4f,\nrange: vec4f,\n}\n@group(0) @binding(0) var<uniform> sh: ShaftParams;\n@group(0) @binding(1) var<uniform> lighting: Lighting;\n@group(0) @binding(2) var scene_depth: texture_depth_2d;\n@group(0) @binding(3) var shadow_map: texture_2d<f32>;\n@group(0) @binding(4) var smp: sampler;\nstruct ShaftOut { @builtin(position) clip: vec4f }\n@vertex fn vs(@builtin(vertex_index) i: u32) -> ShaftOut {\nlet p = vec2f(f32((i << 1u) & 2u), f32(i & 2u)) * 2.0 - 1.0;\nvar o: ShaftOut;\no.clip = vec4f(p, 0.0, 1.0);\nreturn o;\n}\nfn sunlit(x: vec3f, l: vec3f) -> f32 {\nlet at = x - l * ((x.y - sh.range.x) / max(l.y, 0.05));\nlet uv = (at.xz - sh.smap.xy) * sh.smap.z + 0.5;\nlet edge = min(min(uv.x, 1.0 - uv.x), min(uv.y, 1.0 - uv.y));\nreturn mix(1.0, textureSampleLevel(shadow_map, smp, uv, 0.0).r, saturate(edge * 16.0));\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@fragment fn fs(in: ShaftOut) -> @location(0) vec4f {\nlet fog = lighting.fog;\nlet fog2 = lighting.fog2;\nlet l = sh.sun.xyz;\nif (sh.smap.w < 0.5 || (fog.x <= 0.0 && fog2.x <= 0.0) || fog2.y <= 0.0 || l.y <= 0.0) {\ndiscard;\n}\nlet px = vec2i(in.clip.xy);\nlet size = vec2f(textureDimensions(scene_depth));\nlet ndc = vec2f(in.clip.x / size.x * 2.0 - 1.0, 1.0 - in.clip.y / size.y * 2.0);\nlet d = textureLoad(scene_depth, px, 0);\nlet w4 = sh.inv_view_proj * vec4f(ndc, select(d, 1.0, d <= 0.0), 1.0);\nlet q = w4.xyz / w4.w;\nlet dir = normalize(q);\nvar dist = select(length(q), fog2.w, d <= 0.0);\nif (dir.y > 1e-4) {\ndist = min(dist, sh.range.y / dir.y);\n}\ndist = min(dist, sh.range.z);\nif (dist <= 1.0) {\ndiscard;\n}\nlet t_end = exp(-(lighting.fog_air.rgb * (fog2.x * dist) + vec3f(height_fog_depth(fog, dir, dist))));\nlet g = fog2.z;\nlet c = dot(dir, l);\nlet phase = (1.0 - g * g) / (FOUR_PI * pow(max(1.0 + g * g - 2.0 * g * c, 1e-4), 1.5));\nlet sun_in = lighting.sun_color.rgb * (phase * fog2.y) * (vec3f(1.0) - t_end);\nif (dot(sun_in, vec3f(0.2126, 0.7152, 0.0722)) * lighting.env.z < 4e-4) {\ndiscard;\n}\nlet sigma = max(-log(max(dot(t_end, vec3f(0.3333)), 1e-4)) / dist, 1e-6);\nlet j = ign(in.clip.xy, sh.sun.w);\nvar lit = 0.0;\nvar wsum = 0.0;\nfor (var i = 0u; i < SAMPLES; i++) {\nlet t = (f32(i) + j) / f32(SAMPLES) * dist;\nlet w = exp(-sigma * t);\nlit += w * sunlit(dir * t, l);\nwsum += w;\n}\nlet shade = 1.0 - lit / wsum;\nreturn vec4f(-sun_in * shade * sh.range.w * lighting.env.z, 0.0);\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 height_fog_depth(fog: vec4f, dir: vec3f, dist: f32) -> f32 {\nif (fog.x <= 0.0) {\nreturn 0.0;\n}\nlet falloff = max(fog.y, 1e-5);\nlet len = max(dist - fog.w, 0.0);\nlet h0 = fog.z + dir.y * min(dist, fog.w);\nlet k = falloff * dir.y * len;\nlet shape = select((1.0 - exp(-k)) / k, 1.0 - 0.5 * k, abs(k) < 1e-3);\nreturn fog.x * exp(-falloff * h0) * len * shape;\n}";
5
10
  };
@@ -2,7 +2,12 @@
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: '23dcb67d558117a2',
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,\namb: vec4f,\nevolve: 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;\nvar wx = textureSampleLevel(weather_tex, clamp_smp, (xz - cp.wmap.xy) / cp.wmap.z + 0.5, 0.0).xy;\nif (cp.evolve.x > 0.0 && wx.x > 0.004) {\nlet w2 = textureSampleLevel(weather_tex, clamp_smp, (xz + cp.evolve.zw - cp.wmap.xy) / cp.wmap.z + 0.5, 0.0).x;\nwx.x = saturate(wx.x * (1.0 + (w2 - 0.5) * 2.0 * cp.evolve.x));\n}\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 - cp.evolve.y, 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 - cp.amb.rgb;\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 diffuse = max(s.y, 0.0) / (1.0 + 0.1125 * tau) / PI;\nlet scatter = sun * (ms + diffuse * powder) + 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}\n@group(0) @binding(19) var<storage, read_write> sh_rows: array<vec4f>;\nvar<workgroup> sh_wg: array<array<vec3f, 9>, 64>;\nfn sh_basis(d: vec3f) -> array<f32, 9> {\nreturn array<f32, 9>(0.282095, 0.488603 * d.y, 0.488603 * d.z, 0.488603 * d.x, 1.092548 * d.x * d.y, 1.092548 * d.y * d.z, 0.315392 * (3.0 * d.z * d.z - 1.0), 1.092548 * d.x * d.z, 0.546274 * (d.x * d.x - d.y * d.y));\n}\nfn sh_reduce(li: u32, acc: array<vec3f, 9>) {\nsh_wg[li] = acc;\nworkgroupBarrier();\nfor (var s = 32u; s > 0u; s >>= 1u) {\nif (li < s) {\nfor (var k = 0u; k < 9u; k++) {\nsh_wg[li][k] += sh_wg[li + s][k];\n}\n}\nworkgroupBarrier();\n}\n}\n@compute @workgroup_size(64) fn pano_sh(@builtin(workgroup_id) wg: vec3u, @builtin(local_invocation_index) li: u32) {\nlet n = vec2u(cp.pano.zw);\nlet row = wg.x;\nvar acc: array<vec3f, 9>;\nlet v = (f32(row) + 0.5) / f32(n.y);\nlet se = v * v;\nlet ce = sqrt(max(1.0 - se * se, 0.0));\nlet d_omega = (2.0 * PI / f32(n.x)) * (2.0 * v / f32(n.y));\nfor (var x = li; x < n.x; x += 64u) {\nlet az = 2.0 * PI * (f32(x) + 0.5) / f32(n.x);\nlet d = vec3f(ce * cos(az), se, ce * sin(az));\nlet c = textureLoad(pano_prev, vec2i(i32(x), i32(row)), 0);\nlet sky = sky_view_at(sky_view, clamp_smp, d, cp.sun.xyz, cp.eye.z) * lighting.view.rgb;\nlet delta = c.rgb - sky * (1.0 - c.a);\nlet y = sh_basis(d);\nfor (var k = 0u; k < 9u; k++) {\nacc[k] += delta * (y[k] * d_omega);\n}\n}\nsh_reduce(li, acc);\nif (li < 9u) {\nsh_rows[row * 9u + li] = vec4f(sh_wg[0][li], 0.0);\n}\n}\n@compute @workgroup_size(64) fn pano_sh_sum(@builtin(local_invocation_index) li: u32) {\nlet rows = u32(cp.pano.w);\nvar acc: array<vec3f, 9>;\nfor (var r = li; r < rows; r += 64u) {\nfor (var k = 0u; k < 9u; k++) {\nacc[k] += sh_rows[r * 9u + k].rgb;\n}\n}\nsh_reduce(li, acc);\nif (li < 9u) {\nlet band = select(select(1.0 / 4.0, 2.0 / 3.0, li >= 1u && li <= 3u), 1.0, li == 0u);\nsh_rows[rows * 9u + li] = vec4f(sh_wg[0][li] * band, 0.0);\n}\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
+ };
8
+ /** Linked from shaders/clouds/shafts.wesl. */
9
+ export const shaftsShader = {
10
+ hash: 'c067ed30af3fab0a',
11
+ wgsl: "const FOUR_PI = 12.5663706;\nconst SAMPLES = 8u;\nstruct ShaftParams {\ninv_view_proj: mat4x4f,\nsun: vec4f,\nsmap: vec4f,\nrange: vec4f,\n}\n@group(0) @binding(0) var<uniform> sh: ShaftParams;\n@group(0) @binding(1) var<uniform> lighting: Lighting;\n@group(0) @binding(2) var scene_depth: texture_depth_2d;\n@group(0) @binding(3) var shadow_map: texture_2d<f32>;\n@group(0) @binding(4) var smp: sampler;\nstruct ShaftOut { @builtin(position) clip: vec4f }\n@vertex fn vs(@builtin(vertex_index) i: u32) -> ShaftOut {\nlet p = vec2f(f32((i << 1u) & 2u), f32(i & 2u)) * 2.0 - 1.0;\nvar o: ShaftOut;\no.clip = vec4f(p, 0.0, 1.0);\nreturn o;\n}\nfn sunlit(x: vec3f, l: vec3f) -> f32 {\nlet at = x - l * ((x.y - sh.range.x) / max(l.y, 0.05));\nlet uv = (at.xz - sh.smap.xy) * sh.smap.z + 0.5;\nlet edge = min(min(uv.x, 1.0 - uv.x), min(uv.y, 1.0 - uv.y));\nreturn mix(1.0, textureSampleLevel(shadow_map, smp, uv, 0.0).r, saturate(edge * 16.0));\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@fragment fn fs(in: ShaftOut) -> @location(0) vec4f {\nlet fog = lighting.fog;\nlet fog2 = lighting.fog2;\nlet l = sh.sun.xyz;\nif (sh.smap.w < 0.5 || (fog.x <= 0.0 && fog2.x <= 0.0) || fog2.y <= 0.0 || l.y <= 0.0) {\ndiscard;\n}\nlet px = vec2i(in.clip.xy);\nlet size = vec2f(textureDimensions(scene_depth));\nlet ndc = vec2f(in.clip.x / size.x * 2.0 - 1.0, 1.0 - in.clip.y / size.y * 2.0);\nlet d = textureLoad(scene_depth, px, 0);\nlet w4 = sh.inv_view_proj * vec4f(ndc, select(d, 1.0, d <= 0.0), 1.0);\nlet q = w4.xyz / w4.w;\nlet dir = normalize(q);\nvar dist = select(length(q), fog2.w, d <= 0.0);\nif (dir.y > 1e-4) {\ndist = min(dist, sh.range.y / dir.y);\n}\ndist = min(dist, sh.range.z);\nif (dist <= 1.0) {\ndiscard;\n}\nlet t_end = exp(-(lighting.fog_air.rgb * (fog2.x * dist) + vec3f(height_fog_depth(fog, dir, dist))));\nlet g = fog2.z;\nlet c = dot(dir, l);\nlet phase = (1.0 - g * g) / (FOUR_PI * pow(max(1.0 + g * g - 2.0 * g * c, 1e-4), 1.5));\nlet sun_in = lighting.sun_color.rgb * (phase * fog2.y) * (vec3f(1.0) - t_end);\nif (dot(sun_in, vec3f(0.2126, 0.7152, 0.0722)) * lighting.env.z < 4e-4) {\ndiscard;\n}\nlet sigma = max(-log(max(dot(t_end, vec3f(0.3333)), 1e-4)) / dist, 1e-6);\nlet j = ign(in.clip.xy, sh.sun.w);\nvar lit = 0.0;\nvar wsum = 0.0;\nfor (var i = 0u; i < SAMPLES; i++) {\nlet t = (f32(i) + j) / f32(SAMPLES) * dist;\nlet w = exp(-sigma * t);\nlit += w * sunlit(dir * t, l);\nwsum += w;\n}\nlet shade = 1.0 - lit / wsum;\nreturn vec4f(-sun_in * shade * sh.range.w * lighting.env.z, 0.0);\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 height_fog_depth(fog: vec4f, dir: vec3f, dist: f32) -> f32 {\nif (fog.x <= 0.0) {\nreturn 0.0;\n}\nlet falloff = max(fog.y, 1e-5);\nlet len = max(dist - fog.w, 0.0);\nlet h0 = fog.z + dir.y * min(dist, fog.w);\nlet k = falloff * dir.y * len;\nlet shape = select((1.0 - exp(-k)) / k, 1.0 - 0.5 * k, abs(k) < 1e-3);\nreturn fog.x * exp(-falloff * h0) * len * shape;\n}",
7
12
  };
8
13
  //# 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,m+iBAAm+iB;CACj+iB,CAAC;AAEX,8CAA8C;AAC9C,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE,kBAAkB;IACxB,IAAI,EAAE,utGAAutG;CACrtG,CAAC"}
package/dist/clouds.d.ts CHANGED
@@ -26,6 +26,13 @@ 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];
31
+ /**
32
+ * How much the clouds change as they drift, 0–1 (ADR-0240; default 0.5): cells grow and fade over minutes and the
33
+ * billows build upwards. 0: fixed shapes carried by the wind.
34
+ */
35
+ readonly evolve?: number;
29
36
  }
30
37
  /**
31
38
  * Volumetric clouds (ADR-0219): a layer of cumulus ray-marched through procedural noise, lit by the sun and the sky,
@@ -56,8 +63,27 @@ export declare class Clouds implements RenderFeature {
56
63
  quality: CloudQuality;
57
64
  /** Off: nothing is marched or drawn (live). */
58
65
  enabled: boolean;
66
+ /** How much the clouds change as they drift, 0–1 (ADR-0240; live). */
67
+ evolve: number;
59
68
  /** The reflections' panorama (rgb light, a transmittance; u = azimuth / 2π, v = √(sin elevation)). */
60
69
  readonly panorama: GPUTexture;
70
+ /**
71
+ * The cloud shadow map (ADR-0227): r = the sun's light through the layer at sea level, over `SHADOW_KM` about the camera.
72
+ * Published on the environment as `cloudShadow` for the scene and the water.
73
+ */
74
+ readonly shadow: GPUTexture;
75
+ /** Cast shadows on the ground and the water (ADR-0227; live). */
76
+ shadows: boolean;
77
+ /**
78
+ * The clouds change the sky's ambient light (ADR-0235; live): what they hide of the blue sky and the light they scatter
79
+ * themselves reach the scene's SH, so ground in a cloud's shadow is lit by a cloudy sky, not a clear one.
80
+ */
81
+ ambient: boolean;
82
+ /**
83
+ * Where the cloud field sits, world x and z in metres (ADR-0231; live): the whole weather moves by it, so an app can
84
+ * place its clouds (a showcase starting in sunshine) without changing their shapes.
85
+ */
86
+ offset: [number, number];
61
87
  constructor(device: GPUDevice, o: CloudOptions);
62
88
  init(cache: PipelineCache, format: GPUTextureFormat): Promise<void>;
63
89
  prepare(f: RenderFeatureFrame): void;
@@ -71,7 +97,17 @@ export declare class Clouds implements RenderFeature {
71
97
  * const ms = await render.features.find((f) => f.name === 'clouds').measure();
72
98
  */
73
99
  measure(frames?: number): Promise<number | null>;
74
- /** What the clouds hold on the GPU: the noise volumes, the panorama and the history. */
100
+ /**
101
+ * Its agent tools (ADR-0227): `clouds.state` reads the layer and its knobs, `clouds.set` turns them. Errors carry the
102
+ * argument's `path`.
103
+ */
104
+ tools(): ReturnType<NonNullable<RenderFeature['tools']>>;
105
+ /**
106
+ * The ambient SH's GPU cost, ms (differential, like `measure`: `frames` + 1 projections in one submission less one).
107
+ * Null before the first frame.
108
+ */
109
+ measureAmbient(frames?: number): Promise<number | null>;
110
+ /** What the clouds hold on the GPU: the noise volumes, the panorama, the history and the shadow map. */
75
111
  get gpuBytes(): number;
76
112
  destroy(): void;
77
113
  }
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 twelve vectors. */
10
+ const PARAMS_BYTES = (16 * 2 + 4 * 12) * 4;
11
11
  const SHAPE_SIZE = 128;
12
12
  const DETAIL_SIZE = 32;
13
13
  const PANO = [1024, 256];
@@ -15,8 +15,15 @@ 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;
23
+ /** The ambient's SH (ADR-0235): nine vectors a panorama row, then their sum. */
24
+ const SH_BYTES = (PANO[1] + 1) * 9 * 16;
25
+ /** The first frame whose panorama is whole (every row marched once after the first fill). */
26
+ const SH_FIRST = 16;
20
27
  /** The order the 2 × 2 phases are marched in (a Bayer pattern). */
21
28
  const PHASES = [
22
29
  [0, 0],
@@ -54,12 +61,42 @@ export class Clouds {
54
61
  quality;
55
62
  /** Off: nothing is marched or drawn (live). */
56
63
  enabled = true;
64
+ /** How much the clouds change as they drift, 0–1 (ADR-0240; live). */
65
+ evolve;
57
66
  /** The reflections' panorama (rgb light, a transmittance; u = azimuth / 2π, v = √(sin elevation)). */
58
67
  panorama;
59
68
  /** Where the panorama's rows are marched, from `panorama`; copied into it after. */
60
69
  #panoWork;
61
70
  #shape;
62
71
  #weather;
72
+ /**
73
+ * The cloud shadow map (ADR-0227): r = the sun's light through the layer at sea level, over `SHADOW_KM` about the camera.
74
+ * Published on the environment as `cloudShadow` for the scene and the water.
75
+ */
76
+ shadow;
77
+ /** The shadow map's centre (world km), or null before it is made; true while every row must be marched. */
78
+ #shadowAt = null;
79
+ #shadowAll = true;
80
+ /** Cast shadows on the ground and the water (ADR-0227; live). */
81
+ shadows = true;
82
+ /**
83
+ * The clouds change the sky's ambient light (ADR-0235; live): what they hide of the blue sky and the light they scatter
84
+ * themselves reach the scene's SH, so ground in a cloud's shadow is lit by a cloudy sky, not a clear one.
85
+ */
86
+ ambient = true;
87
+ /** The ambient's change (SH9, 9 × vec4, scene-linear), published as `Environment.cloudSh`. */
88
+ #sh = new Float32Array(36);
89
+ #shBuf;
90
+ #shRead;
91
+ /** idle: may dispatch; copied: the read-back is recorded (map it next frame); mapping: waiting on it. */
92
+ #shState = 'idle';
93
+ #shPublished = false;
94
+ #env = null;
95
+ /**
96
+ * Where the cloud field sits, world x and z in metres (ADR-0231; live): the whole weather moves by it, so an app can
97
+ * place its clouds (a showcase starting in sunshine) without changing their shapes.
98
+ */
99
+ offset = [0, 0];
63
100
  /** The weather map's centre (world km), or null before it is made. */
64
101
  #weatherAt = null;
65
102
  #detail;
@@ -99,10 +136,15 @@ export class Clouds {
99
136
  this.haze = o.haze ?? 12;
100
137
  this.erosion = o.erosion ?? 1;
101
138
  this.quality = o.quality ?? 'high';
139
+ this.evolve = Math.max(0, Math.min(1, o.evolve ?? 0.5));
140
+ if (o.offset)
141
+ this.offset = [o.offset[0], o.offset[1]];
102
142
  if (!(this.top > this.bottom && this.bottom >= 0))
103
143
  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
144
  this.#shape = device.createTexture({ label: 'yali:clouds:shape', size: [SHAPE_SIZE, SHAPE_SIZE, SHAPE_SIZE], dimension: '3d', format: 'rgba8unorm', usage: STORE });
105
145
  this.#weather = device.createTexture({ label: 'yali:clouds:weather', size: [WEATHER, WEATHER], format: 'rgba8unorm', usage: STORE });
146
+ // COPY_SRC: tools and probes read it back.
147
+ this.shadow = device.createTexture({ label: 'yali:clouds:shadow', size: [SHADOW, SHADOW], format: 'rgba16float', usage: STORE | 0x01 });
106
148
  this.#detail = device.createTexture({ label: 'yali:clouds:detail', size: [DETAIL_SIZE, DETAIL_SIZE, DETAIL_SIZE], dimension: '3d', format: 'rgba8unorm', usage: STORE });
107
149
  // Rows accumulate over frames: marched into the work texture from the panorama, then copied back (COPY_SRC |
108
150
  // COPY_DST; tools and probes read the panorama back too).
@@ -110,18 +152,24 @@ export class Clouds {
110
152
  this.panorama = pano('yali:clouds:panorama');
111
153
  this.#panoWork = pano('yali:clouds:panorama-work');
112
154
  this.#params = device.createBuffer({ label: 'yali:clouds:params', size: PARAMS_BYTES, usage: 0x40 | 0x08 });
155
+ // STORAGE | COPY_SRC; the read-back MAP_READ | COPY_DST.
156
+ this.#shBuf = device.createBuffer({ label: 'yali:clouds:sh', size: SH_BYTES, usage: 0x80 | 0x04 });
157
+ this.#shRead = device.createBuffer({ label: 'yali:clouds:sh:read', size: 9 * 16, usage: 0x01 | 0x08 });
113
158
  this.#clamp = device.createSampler({ label: 'yali:clouds:clamp', magFilter: 'linear', minFilter: 'linear' });
114
159
  this.#wrap = device.createSampler({ label: 'yali:clouds:wrap', addressModeU: 'repeat', addressModeV: 'repeat', addressModeW: 'repeat', magFilter: 'linear', minFilter: 'linear' });
115
160
  }
116
161
  async init(cache, format) {
117
162
  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([
163
+ const [shape, detail, weather, march, rebuild, pano, shadow, shRows, shSum, draw] = await Promise.all([
119
164
  c('gen_shape'),
120
165
  c('gen_detail'),
121
166
  c('gen_weather'),
122
167
  c('march_view'),
123
168
  c('reconstruct'),
124
169
  c('panorama'),
170
+ c('shadow_map'),
171
+ c('pano_sh'),
172
+ c('pano_sh_sum'),
125
173
  cache.render({
126
174
  label: 'yali:clouds:draw',
127
175
  vertex: { shader: cloudsShader, entryPoint: 'vs_composite' },
@@ -130,7 +178,7 @@ export class Clouds {
130
178
  primitive: { topology: 'triangle-list' },
131
179
  }),
132
180
  ]);
133
- this.#p = { shape, detail, weather, march, rebuild, pano, draw };
181
+ this.#p = { shape, detail, weather, march, rebuild, pano, shadow, shRows, shSum, draw };
134
182
  }
135
183
  /** The textures that follow the render size: this frame's samples (a quarter) and the half-size history (two). */
136
184
  #resize(w, h) {
@@ -175,7 +223,7 @@ export class Clouds {
175
223
  d.set([eye[0] / 1000, eye[2] / 1000, PLANET_KM + Math.max(eye[1], 1) / 1000, f.seconds], 36);
176
224
  d.set([this.bottom / 1000, this.top / 1000, Math.max(0, Math.min(1, this.coverage)), this.density], 40);
177
225
  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);
226
+ 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
227
  const ph = PHASES[this.#frame & 3];
180
228
  d.set([this.#size[0], this.#size[1], ph[0], ph[1]], 48);
181
229
  d.set(QUALITY[this.quality], 52);
@@ -195,6 +243,22 @@ export class Clouds {
195
243
  if (regen)
196
244
  this.#weatherAt = [ex, ez];
197
245
  d.set([this.#weatherAt[0], this.#weatherAt[1], WEATHER_KM, WEATHER], 64);
246
+ // The shadow map follows the camera in steps of an eighth of its width, every row marched after a move, a quarter of
247
+ // them a frame otherwise (ADR-0227).
248
+ const sa = this.#shadowAt;
249
+ if (!sa || Math.abs(ex - sa[0]) > SHADOW_KM / 8 || Math.abs(ez - sa[1]) > SHADOW_KM / 8) {
250
+ this.#shadowAt = [Math.round(ex / (SHADOW_KM / SHADOW)) * (SHADOW_KM / SHADOW), Math.round(ez / (SHADOW_KM / SHADOW)) * (SHADOW_KM / SHADOW)];
251
+ this.#shadowAll = true;
252
+ }
253
+ d.set([this.#shadowAt[0], this.#shadowAt[1], SHADOW_KM, this.#shadowAll ? 4 : this.#frame & 3], 68);
254
+ f.environment.cloudShadow = this.enabled && this.shadows ? { texture: this.shadow, centre: [this.#shadowAt[0] * 1000, this.#shadowAt[1] * 1000], size: SHADOW_KM * 1000, bottom: this.bottom } : null;
255
+ this.#ambient(f.environment);
256
+ // Evolution (ADR-0240): the shape rising up to 6 m/s at full (wrapped to two tiles: the noise is tileable), the second
257
+ // weather read's offset circling 8 km about the first once in 40 minutes.
258
+ const ev = Math.max(0, Math.min(1, this.evolve));
259
+ const tile = this.shapeSize * 2;
260
+ const turn = (f.seconds / 2400) * Math.PI * 2;
261
+ d.set([ev, ev > 0 ? ((f.seconds * 0.006 * ev) % tile) : 0, Math.cos(turn) * 8, Math.sin(turn) * 8], 76);
198
262
  this.device.queue.writeBuffer(this.#params, 0, d);
199
263
  if ((regen || this.#weatherStale) && this.#p) {
200
264
  const enc = this.device.createCommandEncoder({ label: 'yali:clouds:weather' });
@@ -207,6 +271,39 @@ export class Clouds {
207
271
  this.#weatherStale = false;
208
272
  }
209
273
  }
274
+ /**
275
+ * The ambient's change (ADR-0235): last frame's recorded read-back mapped, the result published on the environment; off,
276
+ * nothing published. `amb` (what the SH gains from above) goes to the clouds' own ambient, which takes it off again.
277
+ */
278
+ #ambient(env) {
279
+ this.#env = env;
280
+ const on = this.enabled && this.ambient;
281
+ if (this.#shState === 'copied') {
282
+ this.#shState = 'mapping';
283
+ const buf = this.#shRead;
284
+ buf.mapAsync(GPUMapMode.READ).then(() => {
285
+ this.#sh.set(new Float32Array(buf.getMappedRange(), 0, 36));
286
+ buf.unmap();
287
+ this.#shState = 'idle';
288
+ const e = this.#env;
289
+ if (e && this.enabled && this.ambient) {
290
+ e.cloudSh = this.#sh;
291
+ e.cloudShVersion++;
292
+ this.#shPublished = true;
293
+ }
294
+ }, () => {
295
+ this.#shState = 'idle';
296
+ });
297
+ }
298
+ if (!on && this.#shPublished) {
299
+ env.cloudSh = null;
300
+ env.cloudShVersion++;
301
+ this.#shPublished = false;
302
+ }
303
+ const k = this.#sh;
304
+ const a = this.#shPublished ? [0, 1, 2].map((i) => k[i] * 0.282095 + k[4 + i] * 0.488603) : [0, 0, 0];
305
+ this.#data.set([a[0], a[1], a[2], 0], 72);
306
+ }
210
307
  #ensureGroups(scene) {
211
308
  const p = this.#p;
212
309
  if (!p || !this.#current || !this.#history || !this.#skyView)
@@ -232,6 +329,39 @@ export class Clouds {
232
329
  march: d.createBindGroup({ label: 'yali:clouds:march', layout: p.march.getBindGroupLayout(0), entries: [...shared, { binding: 9, resource: this.#current.createView() }] }),
233
330
  rebuild: [rebuild(h0, h1), rebuild(h1, h0)],
234
331
  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() }] }),
332
+ shadow: d.createBindGroup({
333
+ label: 'yali:clouds:shadow',
334
+ layout: p.shadow.getBindGroupLayout(0),
335
+ entries: [
336
+ { binding: 0, resource: { buffer: this.#params } },
337
+ { binding: 3, resource: this.#clamp },
338
+ { binding: 4, resource: this.#shape.createView({ dimension: '3d' }) },
339
+ { binding: 5, resource: this.#detail.createView({ dimension: '3d' }) },
340
+ { binding: 6, resource: this.#wrap },
341
+ { binding: 16, resource: this.#weather.createView() },
342
+ { binding: 18, resource: this.shadow.createView() },
343
+ ],
344
+ }),
345
+ shRows: d.createBindGroup({
346
+ label: 'yali:clouds:sh',
347
+ layout: p.shRows.getBindGroupLayout(0),
348
+ entries: [
349
+ { binding: 0, resource: { buffer: this.#params } },
350
+ { binding: 1, resource: { buffer: scene.lightingBuffer } },
351
+ { binding: 2, resource: this.#skyView.createView() },
352
+ { binding: 3, resource: this.#clamp },
353
+ { binding: 15, resource: this.panorama.createView() },
354
+ { binding: 19, resource: { buffer: this.#shBuf } },
355
+ ],
356
+ }),
357
+ shSum: d.createBindGroup({
358
+ label: 'yali:clouds:sh-sum',
359
+ layout: p.shSum.getBindGroupLayout(0),
360
+ entries: [
361
+ { binding: 0, resource: { buffer: this.#params } },
362
+ { binding: 19, resource: { buffer: this.#shBuf } },
363
+ ],
364
+ }),
235
365
  };
236
366
  this.#drawGroups = null;
237
367
  return true;
@@ -271,6 +401,12 @@ export class Clouds {
271
401
  pass.setPipeline(p.pano);
272
402
  pass.setBindGroup(0, g.pano);
273
403
  pass.dispatchWorkgroups(PANO[0] / 8, PANO[1] / 8);
404
+ if (this.shadows) {
405
+ pass.setPipeline(p.shadow);
406
+ pass.setBindGroup(0, g.shadow);
407
+ pass.dispatchWorkgroups(SHADOW / 8, SHADOW / 8);
408
+ this.#shadowAll = false;
409
+ }
274
410
  },
275
411
  });
276
412
  // The panorama's marched rows back into the one reflections read.
@@ -283,6 +419,9 @@ export class Clouds {
283
419
  if (!this.enabled || !this.#generated || !this.#groups)
284
420
  return;
285
421
  encoder.copyTextureToTexture({ texture: this.#panoWork }, { texture: this.panorama }, [PANO[0], PANO[1]]);
422
+ // Once the panorama is whole, every 8 frames (each row marched again): its change to the sky's light on SH9.
423
+ if (this.ambient && this.#shState === 'idle' && this.#frame >= SH_FIRST && (this.#frame & 7) === 7)
424
+ this.#encodeSh(encoder);
286
425
  },
287
426
  });
288
427
  graph.addPass({
@@ -334,6 +473,11 @@ export class Clouds {
334
473
  pass.setPipeline(p.pano);
335
474
  pass.setBindGroup(0, g.pano);
336
475
  pass.dispatchWorkgroups(PANO[0] / 8, PANO[1] / 8);
476
+ if (this.shadows) {
477
+ pass.setPipeline(p.shadow);
478
+ pass.setBindGroup(0, g.shadow);
479
+ pass.dispatchWorkgroups(SHADOW / 8, SHADOW / 8);
480
+ }
337
481
  }
338
482
  pass.end();
339
483
  await this.device.queue.onSubmittedWorkDone();
@@ -347,20 +491,147 @@ export class Clouds {
347
491
  const small = await run(1);
348
492
  return Math.max(0, (await run(frames + 1)) - small) / frames;
349
493
  }
350
- /** What the clouds hold on the GPU: the noise volumes, the panorama and the history. */
494
+ /**
495
+ * Its agent tools (ADR-0227): `clouds.state` reads the layer and its knobs, `clouds.set` turns them. Errors carry the
496
+ * argument's `path`.
497
+ */
498
+ tools() {
499
+ const bad = (path, message) => Object.assign(new Error(`CLOUDS_INVALID: ${path} ${message}`), { code: 'CLOUDS_INVALID', path, message: `${path} ${message}` });
500
+ const num = (args, k, min, max = Number.POSITIVE_INFINITY) => {
501
+ const v = args[k];
502
+ if (v === undefined)
503
+ return undefined;
504
+ if (typeof v !== 'number' || !Number.isFinite(v) || v < min || v > max)
505
+ throw bad(k, `must be a number from ${min}${Number.isFinite(max) ? ` to ${max}` : ''}`);
506
+ return v;
507
+ };
508
+ const state = () => ({
509
+ enabled: this.enabled,
510
+ shadows: this.shadows,
511
+ ambient: this.ambient,
512
+ evolve: this.evolve,
513
+ quality: this.quality,
514
+ coverage: this.coverage,
515
+ bottom: this.bottom,
516
+ top: this.top,
517
+ density: this.density,
518
+ wind: this.wind,
519
+ windDirection: this.windDirection,
520
+ gpuBytes: this.gpuBytes,
521
+ });
522
+ return [
523
+ { name: 'clouds.state', description: 'The volumetric clouds: on or off, whether they shadow the ground and water and change the ambient light, quality, coverage, layer, density, wind and GPU bytes.', input: { type: 'object', properties: {} }, run: state },
524
+ {
525
+ name: 'clouds.set',
526
+ description: "Turns the clouds' live knobs; only the arguments given change. Returns the new state.",
527
+ input: {
528
+ type: 'object',
529
+ properties: {
530
+ enabled: { type: 'boolean', description: 'March and draw the clouds at all.' },
531
+ shadows: { type: 'boolean', description: 'Cast the clouds’ shadows on the ground and the water.' },
532
+ ambient: { type: 'boolean', description: 'Let the clouds change the sky’s ambient light on the scene (what they hide of the sky, the light they scatter).' },
533
+ evolve: { type: 'number', description: 'How much the clouds change as they drift, 0 to 1 (cells grow and fade, billows build; 0: fixed shapes).' },
534
+ quality: { type: 'string', description: 'The march budget: high, medium or low.' },
535
+ coverage: { type: 'number', description: 'How much of the sky is cloud, 0 to 1.' },
536
+ density: { type: 'number', description: 'Extinction inside a full cloud, per km, 1 to 500.' },
537
+ wind: { type: 'number', description: 'The wind at the clouds, m/s, 0 to 60.' },
538
+ windDirection: { type: 'number', description: 'The direction the wind blows towards, radians from +x.' },
539
+ },
540
+ },
541
+ run: (args) => {
542
+ if (args.enabled !== undefined)
543
+ this.enabled = !!args.enabled;
544
+ if (args.shadows !== undefined)
545
+ this.shadows = !!args.shadows;
546
+ if (args.ambient !== undefined)
547
+ this.ambient = !!args.ambient;
548
+ const ev = num(args, 'evolve', 0, 1);
549
+ if (ev !== undefined)
550
+ this.evolve = ev;
551
+ if (args.quality !== undefined) {
552
+ if (args.quality !== 'high' && args.quality !== 'medium' && args.quality !== 'low')
553
+ throw bad('quality', 'must be high, medium or low');
554
+ this.quality = args.quality;
555
+ }
556
+ const c = num(args, 'coverage', 0, 1);
557
+ if (c !== undefined)
558
+ this.coverage = c;
559
+ const d = num(args, 'density', 1, 500);
560
+ if (d !== undefined)
561
+ this.density = d;
562
+ const w = num(args, 'wind', 0, 60);
563
+ if (w !== undefined)
564
+ this.wind = w;
565
+ const wd = num(args, 'windDirection', -Math.PI * 4, Math.PI * 4);
566
+ if (wd !== undefined)
567
+ this.windDirection = wd;
568
+ return state();
569
+ },
570
+ },
571
+ ];
572
+ }
573
+ /** The ambient's SH from the panorama, and its read-back's copy (ADR-0235). */
574
+ #encodeSh(encoder) {
575
+ const p = this.#p;
576
+ const g = this.#groups;
577
+ const pass = encoder.beginComputePass({ label: 'clouds.sh' });
578
+ pass.setPipeline(p.shRows);
579
+ pass.setBindGroup(0, g.shRows);
580
+ pass.dispatchWorkgroups(PANO[1]);
581
+ pass.setPipeline(p.shSum);
582
+ pass.setBindGroup(0, g.shSum);
583
+ pass.dispatchWorkgroups(1);
584
+ pass.end();
585
+ encoder.copyBufferToBuffer(this.#shBuf, PANO[1] * 9 * 16, this.#shRead, 0, 9 * 16);
586
+ this.#shState = 'copied';
587
+ }
588
+ /**
589
+ * The ambient SH's GPU cost, ms (differential, like `measure`: `frames` + 1 projections in one submission less one).
590
+ * Null before the first frame.
591
+ */
592
+ async measureAmbient(frames = 20) {
593
+ const p = this.#p;
594
+ const g = this.#groups;
595
+ if (!p || !g)
596
+ return null;
597
+ const run = async (n) => {
598
+ const enc = this.device.createCommandEncoder({ label: 'yali:clouds:measure-sh' });
599
+ const pass = enc.beginComputePass();
600
+ for (let i = 0; i < n; i++) {
601
+ pass.setPipeline(p.shRows);
602
+ pass.setBindGroup(0, g.shRows);
603
+ pass.dispatchWorkgroups(PANO[1]);
604
+ pass.setPipeline(p.shSum);
605
+ pass.setBindGroup(0, g.shSum);
606
+ pass.dispatchWorkgroups(1);
607
+ }
608
+ pass.end();
609
+ const t = performance.now();
610
+ this.device.queue.submit([enc.finish()]);
611
+ await this.device.queue.onSubmittedWorkDone();
612
+ return performance.now() - t;
613
+ };
614
+ await run(2);
615
+ const small = await run(1);
616
+ return Math.max(0, (await run(frames + 1)) - small) / frames;
617
+ }
618
+ /** What the clouds hold on the GPU: the noise volumes, the panorama, the history and the shadow map. */
351
619
  get gpuBytes() {
352
620
  const [w, h] = this.#size;
353
- 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;
621
+ 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 + SH_BYTES + 9 * 16;
354
622
  }
355
623
  destroy() {
356
624
  this.#shape.destroy();
357
625
  this.#weather.destroy();
626
+ this.shadow.destroy();
358
627
  this.#detail.destroy();
359
628
  this.panorama.destroy();
360
629
  this.#panoWork.destroy();
361
630
  this.#current?.destroy();
362
631
  this.#history?.forEach((t) => t.destroy());
363
632
  this.#params.destroy();
633
+ this.#shBuf.destroy();
634
+ this.#shRead.destroy();
364
635
  }
365
636
  }
366
637
  //# sourceMappingURL=clouds.js.map
@@ -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/dist/index.d.ts CHANGED
@@ -1 +1,2 @@
1
1
  export { clouds, Clouds, type CloudOptions, type CloudQuality } from './clouds.ts';
2
+ export { type ShaftOptions, Shafts, shafts } from './shafts.ts';
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
1
  // `@yali-engine/clouds` (ADR-0219, docs/research/volumetric-clouds.md): volumetric clouds as a render feature.
2
2
  export { clouds, Clouds } from "./clouds.js";
3
+ export { Shafts, shafts } from "./shafts.js";
3
4
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+GAA+G;AAC/G,OAAO,EAAE,MAAM,EAAE,MAAM,EAAwC,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+GAA+G;AAC/G,OAAO,EAAE,MAAM,EAAE,MAAM,EAAwC,MAAM,aAAa,CAAC;AACnF,OAAO,EAAqB,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,33 @@
1
+ import type { FrameGraph, PipelineCache, RenderFeature, RenderFeatureFactory, RenderFeatureFrame, SceneRenderer } from '@yali-engine/render';
2
+ /** The shafts' knobs. */
3
+ export interface ShaftOptions {
4
+ /** How strongly the shadows break the haze's sunlight, 0–1 (default 1: as the fog scatters it). */
5
+ readonly strength?: number;
6
+ /** The longest stretch of a view ray marched, metres (default 6000: the shadow map reaches 6.4 km about the camera). */
7
+ readonly range?: number;
8
+ }
9
+ /**
10
+ * Light shafts (ADR-0240): the clouds' shadows in the haze. Needs `clouds()` before it (their shadow map) and haze or
11
+ * height fog with a sun in-scatter; WebGPU with HDR only.
12
+ *
13
+ * @example
14
+ * renderPlugin({ canvas, fog: { haze: 1 }, features: [clouds(), water(), shafts()] });
15
+ */
16
+ export declare function shafts(o?: ShaftOptions): RenderFeatureFactory;
17
+ export declare class Shafts implements RenderFeature {
18
+ #private;
19
+ readonly name = "shafts";
20
+ readonly device: GPUDevice;
21
+ /** Live knobs. */
22
+ strength: number;
23
+ range: number;
24
+ /** Off: nothing drawn (live). */
25
+ enabled: boolean;
26
+ constructor(device: GPUDevice, o: ShaftOptions);
27
+ init(cache: PipelineCache, format: GPUTextureFormat): Promise<void>;
28
+ prepare(f: RenderFeatureFrame): void;
29
+ addPasses(graph: FrameGraph, color: string, depth: string, scene: SceneRenderer): void;
30
+ /** Its agent tools: `shafts.state`, `shafts.set` (strength, range, enabled). */
31
+ tools(): ReturnType<NonNullable<RenderFeature['tools']>>;
32
+ destroy(): void;
33
+ }
package/dist/shafts.js ADDED
@@ -0,0 +1,123 @@
1
+ import { mat4 } from '@yali-engine/math';
2
+ import { shaftsShader } from "./clouds-shaders.gen.js";
3
+ /**
4
+ * Light shafts (ADR-0240): the clouds' shadows in the haze. Needs `clouds()` before it (their shadow map) and haze or
5
+ * height fog with a sun in-scatter; WebGPU with HDR only.
6
+ *
7
+ * @example
8
+ * renderPlugin({ canvas, fog: { haze: 1 }, features: [clouds(), water(), shafts()] });
9
+ */
10
+ export function shafts(o = {}) {
11
+ return (device) => new Shafts(device, o);
12
+ }
13
+ export class Shafts {
14
+ name = 'shafts';
15
+ device;
16
+ /** Live knobs. */
17
+ strength;
18
+ range;
19
+ /** Off: nothing drawn (live). */
20
+ enabled = true;
21
+ #params;
22
+ #data = new Float32Array(16 + 12);
23
+ #sampler;
24
+ #pipeline = null;
25
+ #shadow = null;
26
+ #frame = 0;
27
+ #group = null;
28
+ #key = '';
29
+ constructor(device, o) {
30
+ this.device = device;
31
+ this.strength = o.strength ?? 1;
32
+ this.range = o.range ?? 6000;
33
+ this.#params = device.createBuffer({ label: 'yali:shafts:params', size: this.#data.byteLength, usage: 0x40 | 0x08 });
34
+ this.#sampler = device.createSampler({ label: 'yali:shafts', magFilter: 'linear', minFilter: 'linear' });
35
+ }
36
+ async init(cache, format) {
37
+ this.#pipeline = await cache.render({
38
+ label: 'yali:shafts',
39
+ vertex: { shader: shaftsShader, entryPoint: 'vs' },
40
+ // Added: the fragment is negative (the sunlight the shadows take away).
41
+ fragment: { shader: shaftsShader, entryPoint: 'fs', targets: [{ format, blend: { color: { srcFactor: 'one', dstFactor: 'one' }, alpha: { srcFactor: 'zero', dstFactor: 'one' } } }] },
42
+ primitive: { topology: 'triangle-list' },
43
+ });
44
+ }
45
+ prepare(f) {
46
+ const d = this.#data;
47
+ if (!mat4.invert(d.subarray(0, 16), f.camera.uniform))
48
+ return;
49
+ const ld = f.camera.lightDir;
50
+ const ll = Math.hypot(ld[0], ld[1], ld[2]) || 1;
51
+ d.set([ld[0] / ll, ld[1] / ll, ld[2] / ll, this.#frame++], 16);
52
+ const s = f.environment.cloudShadow;
53
+ const eye = f.camera.eye;
54
+ this.#shadow = s && this.enabled ? s.texture : null;
55
+ // Camera-relative in f64 here: the map's centre is world metres.
56
+ d.set(s ? [s.centre[0] - eye[0], s.centre[1] - eye[2], 1 / s.size, this.#shadow ? 1 : 0] : [0, 0, 0, 0], 20);
57
+ d.set([-eye[1], (s?.bottom ?? 1500) - eye[1], this.range, this.strength], 24);
58
+ this.device.queue.writeBuffer(this.#params, 0, d);
59
+ }
60
+ addPasses(graph, color, depth, scene) {
61
+ graph.addPass({
62
+ name: 'shafts',
63
+ kind: 'render',
64
+ reads: [depth],
65
+ color: { target: color, clear: { r: 0, g: 0, b: 0, a: 0 }, load: true },
66
+ execute: (pass, ctx) => {
67
+ const shadow = this.#shadow;
68
+ if (!this.enabled || !this.#pipeline || !shadow)
69
+ return;
70
+ const key = `${ctx.generation}:${shadow.label}`;
71
+ if (!this.#group || key !== this.#key) {
72
+ this.#key = key;
73
+ this.#group = this.device.createBindGroup({
74
+ label: 'yali:shafts',
75
+ layout: this.#pipeline.getBindGroupLayout(0),
76
+ entries: [
77
+ { binding: 0, resource: { buffer: this.#params } },
78
+ { binding: 1, resource: { buffer: scene.lightingBuffer } },
79
+ { binding: 2, resource: ctx.view(depth) },
80
+ { binding: 3, resource: shadow.createView() },
81
+ { binding: 4, resource: this.#sampler },
82
+ ],
83
+ });
84
+ }
85
+ pass.setPipeline(this.#pipeline);
86
+ pass.setBindGroup(0, this.#group);
87
+ pass.draw(3);
88
+ },
89
+ });
90
+ }
91
+ /** Its agent tools: `shafts.state`, `shafts.set` (strength, range, enabled). */
92
+ tools() {
93
+ const state = () => ({ enabled: this.enabled, strength: this.strength, range: this.range });
94
+ const bad = (path, message) => Object.assign(new Error(`SHAFTS_INVALID: ${path} ${message}`), { code: 'SHAFTS_INVALID', path, message: `${path} ${message}` });
95
+ return [
96
+ { name: 'shafts.state', description: 'The light shafts: on or off, how strongly the clouds’ shadows break the haze’s sunlight, and how far along a view ray.', input: { type: 'object', properties: {} }, run: state },
97
+ {
98
+ name: 'shafts.set',
99
+ description: 'Turns the light shafts’ knobs; only the arguments given change. Returns the new state.',
100
+ input: { type: 'object', properties: { enabled: { type: 'boolean', description: 'Draw them at all.' }, strength: { type: 'number', description: '0 to 1 (1: as the fog scatters the sun).' }, range: { type: 'number', description: 'Metres of view ray marched, 100 to 20000.' } } },
101
+ run: (args) => {
102
+ if (args.enabled !== undefined)
103
+ this.enabled = !!args.enabled;
104
+ if (args.strength !== undefined) {
105
+ if (typeof args.strength !== 'number' || !(args.strength >= 0 && args.strength <= 1))
106
+ throw bad('strength', 'must be a number from 0 to 1');
107
+ this.strength = args.strength;
108
+ }
109
+ if (args.range !== undefined) {
110
+ if (typeof args.range !== 'number' || !(args.range >= 100 && args.range <= 20000))
111
+ throw bad('range', 'must be a number from 100 to 20000');
112
+ this.range = args.range;
113
+ }
114
+ return state();
115
+ },
116
+ },
117
+ ];
118
+ }
119
+ destroy() {
120
+ this.#params.destroy();
121
+ }
122
+ }
123
+ //# sourceMappingURL=shafts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shafts.js","sourceRoot":"","sources":["../src/shafts.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.13.0",
3
+ "version": "0.15.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.13.0",
22
- "@yali-engine/render": "0.13.0"
21
+ "@yali-engine/math": "0.15.0",
22
+ "@yali-engine/render": "0.15.0"
23
23
  },
24
24
  "scripts": {
25
25
  "typecheck": "tsc -p tsconfig.json",