diff --git a/changes/one-wind.md b/changes/one-wind.md new file mode 100644 index 00000000..2c718318 --- /dev/null +++ b/changes/one-wind.md @@ -0,0 +1,25 @@ +bump: minor +type: feat +One wind, and everything in the valley is moved by it. + +The grass had a gust built from two sines and the trees had NO gust term at all - just a +per-instance wobble - so the meadow rippled and the canopy above it swayed to an unrelated +rhythm and nothing ever crossed the valley. A real gust is a WAVE: you watch it come over +the grass, it reaches you, and it goes on into the trees behind you. + +wind.glsl is prepended to EVERY stage, so the grass's vertex shader, the crown's vertex +shader and the water's fragment shader read the same field at the same world position and +cannot drift apart. No uniforms are declared in it on purpose - u_time and u_wind already +exist in several of those files and redeclaring them is a compile error in whichever stage +includes both - so the caller passes what it already has. + +Two numbers mattered. The gust's WAVELENGTH has to fit inside a view or nothing is ever +seen to travel: the first cut was 209 m crest to crest, longer than the meadow you can see, +so the whole frame sat in one phase and read as everything breathing together. It is 74 m +now and a front crosses a normal view in a couple of seconds. And `stiff` lets one field +move a blade a long way and a bole hardly at all. + +R3D_DEBUG_WIND=1 paints the field on the ground, which is the only way to SEE a gust in a +still: two shots a moment apart show the fronts and show them moving. + +Measured: no cost. 400 frames, GL 6.9 s, VK 7.2 s. diff --git a/packages/ludic.render3d/programs.ludic b/packages/ludic.render3d/programs.ludic index d3ffe198..665c7104 100644 --- a/packages/ludic.render3d/programs.ludic +++ b/packages/ludic.render3d/programs.ludic @@ -17,6 +17,7 @@ var r3d_root_found: bool = false var r3d_global_defs: string = "" var r3d_noise_src: string = null var r3d_lighting_src: string = null +var r3d_wind_src: string = null function r3d_set_paths(root: string, assets: string) -> void { r3d_root = root; r3d_assets = assets } @@ -51,7 +52,11 @@ function r3d_shader_file(name: string) -> string { function r3d_shader_src(name: string, defines: string, is_frag: bool) -> string { if r3d_noise_src == null { r3d_noise_src = r3d_shader_file("noise.glsl") } if r3d_lighting_src == null { r3d_lighting_src = r3d_shader_file("lighting.glsl") } - var s = "#version 410 core\n" + r3d_global_defs + defines + # the wind goes to BOTH stages: the grass and the crowns move in the vertex shader, the water + # ripples in the fragment one, and they have to be reading the same field or the meadow and + # the lake disagree about the weather + if r3d_wind_src == null { r3d_wind_src = r3d_shader_file("wind.glsl") } + var s = "#version 410 core\n" + r3d_global_defs + defines + r3d_wind_src if is_frag { s = s + r3d_noise_src + r3d_lighting_src } return s + r3d_shader_file(name) } diff --git a/packages/ludic.render3d/shaders/grass.vert b/packages/ludic.render3d/shaders/grass.vert index d9ac3c1a..3a7132ff 100644 --- a/packages/ludic.render3d/shaders/grass.vert +++ b/packages/ludic.render3d/shaders/grass.vert @@ -148,9 +148,11 @@ void main() { if (far) { bw = max(bw, spacing * 0.35); tall = min(tall, spacing * 0.3); } vec3 p = vec3(a_pos.x * bw, a_pos.y * tall, a_pos.z * tall * (0.6 + 0.8 * h4)); vec3 n = vec3(0.0, 0.3, 1.0); - float gust = sin(xz.x * 0.09 + u_time * 1.1) * 0.5 + sin(xz.y * 0.13 - u_time * 0.8 + xz.x * 0.05) * 0.5; + // The shared field (wind.glsl), so the gust that crosses this meadow is the same gust that + // reaches the trees behind it a moment later. The two sines that used to live here were a + // standing wobble: the grass moved, but nothing ever travelled. float ph = u_time * 1.7 + seed * 6.2831 + xz.x * 0.05 + xz.y * 0.07; - float sway = (sin(ph) * 0.6 + sin(ph * 2.3 + 1.0) * 0.4 + gust) * u_wind; + float sway = windSway(xz, u_time, ph, 0.0) * u_wind; float hgt = max(p.y, 0.0); p.x += sway * hgt * hgt * 0.35; p.z += sway * hgt * hgt * 0.15 * cos(ph * 0.7); diff --git a/packages/ludic.render3d/shaders/model.vert b/packages/ludic.render3d/shaders/model.vert index e0bf27b8..8f121ca6 100644 --- a/packages/ludic.render3d/shaders/model.vert +++ b/packages/ludic.render3d/shaders/model.vert @@ -76,7 +76,11 @@ void main() { // sway grows with height above the base; gust phase from the instance seed float hgt = max(p.y, 0.0); float ph = u_time * 1.7 + i_rot.z * 6.2831 + i_pos.x * 0.05 + i_pos.z * 0.07; - float sway = (sin(ph) * 0.6 + sin(ph * 2.3 + 1.0) * 0.4) * u_wind * i_rot.w; + // A crown had NO gust at all - only this per-instance wobble - so the canopy swayed to a + // rhythm of its own while the meadow under it rippled to another. It is the same field now, + // read at the tree's own place in the world, so a gust crosses the grass and goes on into + // the trees. `stiff` is 0.35 because a bole resists what a blade cannot. + float sway = windSway(i_pos.xz, u_time, ph, 0.35) * u_wind * i_rot.w; p.x += sway * hgt * hgt * 0.35; p.z += sway * hgt * hgt * 0.15 * cos(ph * 0.7); #endif diff --git a/packages/ludic.render3d/shaders/spv/01089da8.frag.spv b/packages/ludic.render3d/shaders/spv/01089da8.frag.spv index f3afbb86..57af6fcd 100644 Binary files a/packages/ludic.render3d/shaders/spv/01089da8.frag.spv and b/packages/ludic.render3d/shaders/spv/01089da8.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/01089da8.vert.spv b/packages/ludic.render3d/shaders/spv/01089da8.vert.spv index ec6859ea..96c91598 100644 Binary files a/packages/ludic.render3d/shaders/spv/01089da8.vert.spv and b/packages/ludic.render3d/shaders/spv/01089da8.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/1b654972.frag.spv b/packages/ludic.render3d/shaders/spv/1b654972.frag.spv index ce47f9ca..70b6b282 100644 Binary files a/packages/ludic.render3d/shaders/spv/1b654972.frag.spv and b/packages/ludic.render3d/shaders/spv/1b654972.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/1b654972.vert.spv b/packages/ludic.render3d/shaders/spv/1b654972.vert.spv index 2259b608..ba388ee7 100644 Binary files a/packages/ludic.render3d/shaders/spv/1b654972.vert.spv and b/packages/ludic.render3d/shaders/spv/1b654972.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/1ce5c5d1.frag.spv b/packages/ludic.render3d/shaders/spv/1ce5c5d1.frag.spv index ab980106..24306b42 100644 Binary files a/packages/ludic.render3d/shaders/spv/1ce5c5d1.frag.spv and b/packages/ludic.render3d/shaders/spv/1ce5c5d1.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/1ce5c5d1.vert.spv b/packages/ludic.render3d/shaders/spv/1ce5c5d1.vert.spv index 9b3f16fa..289c8479 100644 Binary files a/packages/ludic.render3d/shaders/spv/1ce5c5d1.vert.spv and b/packages/ludic.render3d/shaders/spv/1ce5c5d1.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/1f95f31b.frag.spv b/packages/ludic.render3d/shaders/spv/1f95f31b.frag.spv index b4253d5d..5fa89fee 100644 Binary files a/packages/ludic.render3d/shaders/spv/1f95f31b.frag.spv and b/packages/ludic.render3d/shaders/spv/1f95f31b.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/1f95f31b.vert.spv b/packages/ludic.render3d/shaders/spv/1f95f31b.vert.spv index 7051758f..c19cd525 100644 Binary files a/packages/ludic.render3d/shaders/spv/1f95f31b.vert.spv and b/packages/ludic.render3d/shaders/spv/1f95f31b.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/1fde9cd2.frag.spv b/packages/ludic.render3d/shaders/spv/1fde9cd2.frag.spv index f3afbb86..57af6fcd 100644 Binary files a/packages/ludic.render3d/shaders/spv/1fde9cd2.frag.spv and b/packages/ludic.render3d/shaders/spv/1fde9cd2.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/1fde9cd2.vert.spv b/packages/ludic.render3d/shaders/spv/1fde9cd2.vert.spv index fb69f940..66c22c3a 100644 Binary files a/packages/ludic.render3d/shaders/spv/1fde9cd2.vert.spv and b/packages/ludic.render3d/shaders/spv/1fde9cd2.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/254e7887.frag.spv b/packages/ludic.render3d/shaders/spv/254e7887.frag.spv index b3face5a..c8e5fd2d 100644 Binary files a/packages/ludic.render3d/shaders/spv/254e7887.frag.spv and b/packages/ludic.render3d/shaders/spv/254e7887.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/254e7887.vert.spv b/packages/ludic.render3d/shaders/spv/254e7887.vert.spv index 6ff8f473..13a33a0f 100644 Binary files a/packages/ludic.render3d/shaders/spv/254e7887.vert.spv and b/packages/ludic.render3d/shaders/spv/254e7887.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/2e2908c8.frag.spv b/packages/ludic.render3d/shaders/spv/2e2908c8.frag.spv index d08281d2..5b723d75 100644 Binary files a/packages/ludic.render3d/shaders/spv/2e2908c8.frag.spv and b/packages/ludic.render3d/shaders/spv/2e2908c8.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/2e2908c8.vert.spv b/packages/ludic.render3d/shaders/spv/2e2908c8.vert.spv index 7051758f..c19cd525 100644 Binary files a/packages/ludic.render3d/shaders/spv/2e2908c8.vert.spv and b/packages/ludic.render3d/shaders/spv/2e2908c8.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/2ee6d2e3.frag.spv b/packages/ludic.render3d/shaders/spv/2ee6d2e3.frag.spv index 0240782c..93fab397 100644 Binary files a/packages/ludic.render3d/shaders/spv/2ee6d2e3.frag.spv and b/packages/ludic.render3d/shaders/spv/2ee6d2e3.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/2ee6d2e3.vert.spv b/packages/ludic.render3d/shaders/spv/2ee6d2e3.vert.spv index 55a54733..45e56abe 100644 Binary files a/packages/ludic.render3d/shaders/spv/2ee6d2e3.vert.spv and b/packages/ludic.render3d/shaders/spv/2ee6d2e3.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/3733fc38.frag.spv b/packages/ludic.render3d/shaders/spv/3733fc38.frag.spv index d15664f0..457bfd2f 100644 Binary files a/packages/ludic.render3d/shaders/spv/3733fc38.frag.spv and b/packages/ludic.render3d/shaders/spv/3733fc38.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/3733fc38.vert.spv b/packages/ludic.render3d/shaders/spv/3733fc38.vert.spv index 04572eba..81fee826 100644 Binary files a/packages/ludic.render3d/shaders/spv/3733fc38.vert.spv and b/packages/ludic.render3d/shaders/spv/3733fc38.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/3b183d8f.frag.spv b/packages/ludic.render3d/shaders/spv/3b183d8f.frag.spv index 7862a9ac..ce385608 100644 Binary files a/packages/ludic.render3d/shaders/spv/3b183d8f.frag.spv and b/packages/ludic.render3d/shaders/spv/3b183d8f.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/3b183d8f.vert.spv b/packages/ludic.render3d/shaders/spv/3b183d8f.vert.spv index 9b3f16fa..289c8479 100644 Binary files a/packages/ludic.render3d/shaders/spv/3b183d8f.vert.spv and b/packages/ludic.render3d/shaders/spv/3b183d8f.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/3e4b62f9.frag.spv b/packages/ludic.render3d/shaders/spv/3e4b62f9.frag.spv index b1dbabd2..3fa1ff79 100644 Binary files a/packages/ludic.render3d/shaders/spv/3e4b62f9.frag.spv and b/packages/ludic.render3d/shaders/spv/3e4b62f9.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/3e4b62f9.vert.spv b/packages/ludic.render3d/shaders/spv/3e4b62f9.vert.spv index 55a54733..45e56abe 100644 Binary files a/packages/ludic.render3d/shaders/spv/3e4b62f9.vert.spv and b/packages/ludic.render3d/shaders/spv/3e4b62f9.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/428caa3a.frag.spv b/packages/ludic.render3d/shaders/spv/428caa3a.frag.spv index a5811c46..7c9bb163 100644 Binary files a/packages/ludic.render3d/shaders/spv/428caa3a.frag.spv and b/packages/ludic.render3d/shaders/spv/428caa3a.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/428caa3a.vert.spv b/packages/ludic.render3d/shaders/spv/428caa3a.vert.spv index 55a54733..45e56abe 100644 Binary files a/packages/ludic.render3d/shaders/spv/428caa3a.vert.spv and b/packages/ludic.render3d/shaders/spv/428caa3a.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/439a2253.frag.spv b/packages/ludic.render3d/shaders/spv/439a2253.frag.spv index 8b34e39f..ef916f97 100644 Binary files a/packages/ludic.render3d/shaders/spv/439a2253.frag.spv and b/packages/ludic.render3d/shaders/spv/439a2253.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/439a2253.vert.spv b/packages/ludic.render3d/shaders/spv/439a2253.vert.spv index 65edd896..7f6b91c1 100644 Binary files a/packages/ludic.render3d/shaders/spv/439a2253.vert.spv and b/packages/ludic.render3d/shaders/spv/439a2253.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/46e2325c.frag.spv b/packages/ludic.render3d/shaders/spv/46e2325c.frag.spv index 218eff0a..77f7a592 100644 Binary files a/packages/ludic.render3d/shaders/spv/46e2325c.frag.spv and b/packages/ludic.render3d/shaders/spv/46e2325c.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/46e2325c.vert.spv b/packages/ludic.render3d/shaders/spv/46e2325c.vert.spv index fc73f668..0a4d4a01 100644 Binary files a/packages/ludic.render3d/shaders/spv/46e2325c.vert.spv and b/packages/ludic.render3d/shaders/spv/46e2325c.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/4a8e9f28.frag.spv b/packages/ludic.render3d/shaders/spv/4a8e9f28.frag.spv index d48b6a52..f133b21f 100644 Binary files a/packages/ludic.render3d/shaders/spv/4a8e9f28.frag.spv and b/packages/ludic.render3d/shaders/spv/4a8e9f28.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/4a8e9f28.vert.spv b/packages/ludic.render3d/shaders/spv/4a8e9f28.vert.spv index 55a54733..45e56abe 100644 Binary files a/packages/ludic.render3d/shaders/spv/4a8e9f28.vert.spv and b/packages/ludic.render3d/shaders/spv/4a8e9f28.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/4be7acd9.frag.spv b/packages/ludic.render3d/shaders/spv/4be7acd9.frag.spv index 752040f5..697bdac8 100644 Binary files a/packages/ludic.render3d/shaders/spv/4be7acd9.frag.spv and b/packages/ludic.render3d/shaders/spv/4be7acd9.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/4be7acd9.vert.spv b/packages/ludic.render3d/shaders/spv/4be7acd9.vert.spv index 55a54733..45e56abe 100644 Binary files a/packages/ludic.render3d/shaders/spv/4be7acd9.vert.spv and b/packages/ludic.render3d/shaders/spv/4be7acd9.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/4cf96468.frag.spv b/packages/ludic.render3d/shaders/spv/4cf96468.frag.spv index 92342924..75d1484c 100644 Binary files a/packages/ludic.render3d/shaders/spv/4cf96468.frag.spv and b/packages/ludic.render3d/shaders/spv/4cf96468.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/4cf96468.vert.spv b/packages/ludic.render3d/shaders/spv/4cf96468.vert.spv index 55a54733..45e56abe 100644 Binary files a/packages/ludic.render3d/shaders/spv/4cf96468.vert.spv and b/packages/ludic.render3d/shaders/spv/4cf96468.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/4d4fa91b.frag.spv b/packages/ludic.render3d/shaders/spv/4d4fa91b.frag.spv index e5b68ac3..0448c0c9 100644 Binary files a/packages/ludic.render3d/shaders/spv/4d4fa91b.frag.spv and b/packages/ludic.render3d/shaders/spv/4d4fa91b.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/4d4fa91b.vert.spv b/packages/ludic.render3d/shaders/spv/4d4fa91b.vert.spv index aaff3b9e..6727ab28 100644 Binary files a/packages/ludic.render3d/shaders/spv/4d4fa91b.vert.spv and b/packages/ludic.render3d/shaders/spv/4d4fa91b.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/4dda406a.frag.spv b/packages/ludic.render3d/shaders/spv/4dda406a.frag.spv index 0f785732..28bfd927 100644 Binary files a/packages/ludic.render3d/shaders/spv/4dda406a.frag.spv and b/packages/ludic.render3d/shaders/spv/4dda406a.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/4dda406a.vert.spv b/packages/ludic.render3d/shaders/spv/4dda406a.vert.spv index 9b3f16fa..289c8479 100644 Binary files a/packages/ludic.render3d/shaders/spv/4dda406a.vert.spv and b/packages/ludic.render3d/shaders/spv/4dda406a.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/512004a1.frag.spv b/packages/ludic.render3d/shaders/spv/512004a1.frag.spv index 3114c34f..11860be7 100644 Binary files a/packages/ludic.render3d/shaders/spv/512004a1.frag.spv and b/packages/ludic.render3d/shaders/spv/512004a1.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/512004a1.vert.spv b/packages/ludic.render3d/shaders/spv/512004a1.vert.spv index 009d9a14..8d24cfc7 100644 Binary files a/packages/ludic.render3d/shaders/spv/512004a1.vert.spv and b/packages/ludic.render3d/shaders/spv/512004a1.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/5161e6ba.frag.spv b/packages/ludic.render3d/shaders/spv/5161e6ba.frag.spv index 1156a6de..635d97a0 100644 Binary files a/packages/ludic.render3d/shaders/spv/5161e6ba.frag.spv and b/packages/ludic.render3d/shaders/spv/5161e6ba.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/5161e6ba.vert.spv b/packages/ludic.render3d/shaders/spv/5161e6ba.vert.spv index 55a54733..45e56abe 100644 Binary files a/packages/ludic.render3d/shaders/spv/5161e6ba.vert.spv and b/packages/ludic.render3d/shaders/spv/5161e6ba.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/5e4589a1.frag.spv b/packages/ludic.render3d/shaders/spv/5e4589a1.frag.spv index dc0540fc..6e67a36a 100644 Binary files a/packages/ludic.render3d/shaders/spv/5e4589a1.frag.spv and b/packages/ludic.render3d/shaders/spv/5e4589a1.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/5e4589a1.vert.spv b/packages/ludic.render3d/shaders/spv/5e4589a1.vert.spv index 7051758f..c19cd525 100644 Binary files a/packages/ludic.render3d/shaders/spv/5e4589a1.vert.spv and b/packages/ludic.render3d/shaders/spv/5e4589a1.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/638623c2.frag.spv b/packages/ludic.render3d/shaders/spv/638623c2.frag.spv index 4ca9383e..a308b8ab 100644 Binary files a/packages/ludic.render3d/shaders/spv/638623c2.frag.spv and b/packages/ludic.render3d/shaders/spv/638623c2.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/638623c2.vert.spv b/packages/ludic.render3d/shaders/spv/638623c2.vert.spv index 55a54733..45e56abe 100644 Binary files a/packages/ludic.render3d/shaders/spv/638623c2.vert.spv and b/packages/ludic.render3d/shaders/spv/638623c2.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/676965ab.frag.spv b/packages/ludic.render3d/shaders/spv/676965ab.frag.spv index 5936b584..3a424152 100644 Binary files a/packages/ludic.render3d/shaders/spv/676965ab.frag.spv and b/packages/ludic.render3d/shaders/spv/676965ab.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/676965ab.vert.spv b/packages/ludic.render3d/shaders/spv/676965ab.vert.spv index 55a54733..45e56abe 100644 Binary files a/packages/ludic.render3d/shaders/spv/676965ab.vert.spv and b/packages/ludic.render3d/shaders/spv/676965ab.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/725523d9.frag.spv b/packages/ludic.render3d/shaders/spv/725523d9.frag.spv index 8ffa63fc..4e9782ed 100644 Binary files a/packages/ludic.render3d/shaders/spv/725523d9.frag.spv and b/packages/ludic.render3d/shaders/spv/725523d9.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/725523d9.vert.spv b/packages/ludic.render3d/shaders/spv/725523d9.vert.spv index 55a54733..45e56abe 100644 Binary files a/packages/ludic.render3d/shaders/spv/725523d9.vert.spv and b/packages/ludic.render3d/shaders/spv/725523d9.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/74258189.frag.spv b/packages/ludic.render3d/shaders/spv/74258189.frag.spv index 08ccc2ae..4bd42092 100644 Binary files a/packages/ludic.render3d/shaders/spv/74258189.frag.spv and b/packages/ludic.render3d/shaders/spv/74258189.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/74258189.vert.spv b/packages/ludic.render3d/shaders/spv/74258189.vert.spv index 55a54733..45e56abe 100644 Binary files a/packages/ludic.render3d/shaders/spv/74258189.vert.spv and b/packages/ludic.render3d/shaders/spv/74258189.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/79b77ed9.frag.spv b/packages/ludic.render3d/shaders/spv/79b77ed9.frag.spv index 97a30f42..9f1c0908 100644 Binary files a/packages/ludic.render3d/shaders/spv/79b77ed9.frag.spv and b/packages/ludic.render3d/shaders/spv/79b77ed9.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/79b77ed9.vert.spv b/packages/ludic.render3d/shaders/spv/79b77ed9.vert.spv index abc5d6d5..b1f4f90e 100644 Binary files a/packages/ludic.render3d/shaders/spv/79b77ed9.vert.spv and b/packages/ludic.render3d/shaders/spv/79b77ed9.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/7ed7de52.frag.spv b/packages/ludic.render3d/shaders/spv/7ed7de52.frag.spv index 7fe5d81d..ae5781f7 100644 Binary files a/packages/ludic.render3d/shaders/spv/7ed7de52.frag.spv and b/packages/ludic.render3d/shaders/spv/7ed7de52.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/7ed7de52.vert.spv b/packages/ludic.render3d/shaders/spv/7ed7de52.vert.spv index 7481d30e..35b48072 100644 Binary files a/packages/ludic.render3d/shaders/spv/7ed7de52.vert.spv and b/packages/ludic.render3d/shaders/spv/7ed7de52.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/7f096322.frag.spv b/packages/ludic.render3d/shaders/spv/7f096322.frag.spv index 7fe5d81d..ae5781f7 100644 Binary files a/packages/ludic.render3d/shaders/spv/7f096322.frag.spv and b/packages/ludic.render3d/shaders/spv/7f096322.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/7f096322.vert.spv b/packages/ludic.render3d/shaders/spv/7f096322.vert.spv index 417ebd22..046c02dd 100644 Binary files a/packages/ludic.render3d/shaders/spv/7f096322.vert.spv and b/packages/ludic.render3d/shaders/spv/7f096322.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/858f5089.frag.spv b/packages/ludic.render3d/shaders/spv/858f5089.frag.spv index 64ea2da1..d62b4a52 100644 Binary files a/packages/ludic.render3d/shaders/spv/858f5089.frag.spv and b/packages/ludic.render3d/shaders/spv/858f5089.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/858f5089.vert.spv b/packages/ludic.render3d/shaders/spv/858f5089.vert.spv index 55a54733..45e56abe 100644 Binary files a/packages/ludic.render3d/shaders/spv/858f5089.vert.spv and b/packages/ludic.render3d/shaders/spv/858f5089.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/86f427b0.frag.spv b/packages/ludic.render3d/shaders/spv/86f427b0.frag.spv index 79a4a92f..d8d614b0 100644 Binary files a/packages/ludic.render3d/shaders/spv/86f427b0.frag.spv and b/packages/ludic.render3d/shaders/spv/86f427b0.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/86f427b0.vert.spv b/packages/ludic.render3d/shaders/spv/86f427b0.vert.spv index 18a3599b..20a844a6 100644 Binary files a/packages/ludic.render3d/shaders/spv/86f427b0.vert.spv and b/packages/ludic.render3d/shaders/spv/86f427b0.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/9068df1c.frag.spv b/packages/ludic.render3d/shaders/spv/9068df1c.frag.spv index c1379ab0..0a0c0155 100644 Binary files a/packages/ludic.render3d/shaders/spv/9068df1c.frag.spv and b/packages/ludic.render3d/shaders/spv/9068df1c.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/9068df1c.vert.spv b/packages/ludic.render3d/shaders/spv/9068df1c.vert.spv index 17d7ba64..aff7eb39 100644 Binary files a/packages/ludic.render3d/shaders/spv/9068df1c.vert.spv and b/packages/ludic.render3d/shaders/spv/9068df1c.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/9d3e2ddd.frag.spv b/packages/ludic.render3d/shaders/spv/9d3e2ddd.frag.spv index 05727ed1..db22287a 100644 Binary files a/packages/ludic.render3d/shaders/spv/9d3e2ddd.frag.spv and b/packages/ludic.render3d/shaders/spv/9d3e2ddd.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/9d3e2ddd.vert.spv b/packages/ludic.render3d/shaders/spv/9d3e2ddd.vert.spv index 55a54733..45e56abe 100644 Binary files a/packages/ludic.render3d/shaders/spv/9d3e2ddd.vert.spv and b/packages/ludic.render3d/shaders/spv/9d3e2ddd.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/9dce3246.frag.spv b/packages/ludic.render3d/shaders/spv/9dce3246.frag.spv index 8b34e39f..ef916f97 100644 Binary files a/packages/ludic.render3d/shaders/spv/9dce3246.frag.spv and b/packages/ludic.render3d/shaders/spv/9dce3246.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/9dce3246.vert.spv b/packages/ludic.render3d/shaders/spv/9dce3246.vert.spv index 18a3599b..20a844a6 100644 Binary files a/packages/ludic.render3d/shaders/spv/9dce3246.vert.spv and b/packages/ludic.render3d/shaders/spv/9dce3246.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/a0f2dbac.frag.spv b/packages/ludic.render3d/shaders/spv/a0f2dbac.frag.spv index 23a4175c..951bd89b 100644 Binary files a/packages/ludic.render3d/shaders/spv/a0f2dbac.frag.spv and b/packages/ludic.render3d/shaders/spv/a0f2dbac.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/a0f2dbac.vert.spv b/packages/ludic.render3d/shaders/spv/a0f2dbac.vert.spv index 7051758f..c19cd525 100644 Binary files a/packages/ludic.render3d/shaders/spv/a0f2dbac.vert.spv and b/packages/ludic.render3d/shaders/spv/a0f2dbac.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/a45356c7.frag.spv b/packages/ludic.render3d/shaders/spv/a45356c7.frag.spv index 82f4c92c..cf743437 100644 Binary files a/packages/ludic.render3d/shaders/spv/a45356c7.frag.spv and b/packages/ludic.render3d/shaders/spv/a45356c7.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/a45356c7.vert.spv b/packages/ludic.render3d/shaders/spv/a45356c7.vert.spv index 55a54733..45e56abe 100644 Binary files a/packages/ludic.render3d/shaders/spv/a45356c7.vert.spv and b/packages/ludic.render3d/shaders/spv/a45356c7.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/a4683767.frag.spv b/packages/ludic.render3d/shaders/spv/a4683767.frag.spv index e614ba6e..11b1203e 100644 Binary files a/packages/ludic.render3d/shaders/spv/a4683767.frag.spv and b/packages/ludic.render3d/shaders/spv/a4683767.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/a4683767.vert.spv b/packages/ludic.render3d/shaders/spv/a4683767.vert.spv index 55a54733..45e56abe 100644 Binary files a/packages/ludic.render3d/shaders/spv/a4683767.vert.spv and b/packages/ludic.render3d/shaders/spv/a4683767.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/a5ad521e.frag.spv b/packages/ludic.render3d/shaders/spv/a5ad521e.frag.spv index a9ed44bf..ef4bf125 100644 Binary files a/packages/ludic.render3d/shaders/spv/a5ad521e.frag.spv and b/packages/ludic.render3d/shaders/spv/a5ad521e.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/a5ad521e.vert.spv b/packages/ludic.render3d/shaders/spv/a5ad521e.vert.spv index fb69f940..66c22c3a 100644 Binary files a/packages/ludic.render3d/shaders/spv/a5ad521e.vert.spv and b/packages/ludic.render3d/shaders/spv/a5ad521e.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/a64015f2.frag.spv b/packages/ludic.render3d/shaders/spv/a64015f2.frag.spv index 1e9677a1..e726965e 100644 Binary files a/packages/ludic.render3d/shaders/spv/a64015f2.frag.spv and b/packages/ludic.render3d/shaders/spv/a64015f2.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/a64015f2.vert.spv b/packages/ludic.render3d/shaders/spv/a64015f2.vert.spv index fce8b982..917e392d 100644 Binary files a/packages/ludic.render3d/shaders/spv/a64015f2.vert.spv and b/packages/ludic.render3d/shaders/spv/a64015f2.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/b4587cd4.frag.spv b/packages/ludic.render3d/shaders/spv/b4587cd4.frag.spv index cb196a62..ece2244d 100644 Binary files a/packages/ludic.render3d/shaders/spv/b4587cd4.frag.spv and b/packages/ludic.render3d/shaders/spv/b4587cd4.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/b4587cd4.vert.spv b/packages/ludic.render3d/shaders/spv/b4587cd4.vert.spv index 82264a13..963932d2 100644 Binary files a/packages/ludic.render3d/shaders/spv/b4587cd4.vert.spv and b/packages/ludic.render3d/shaders/spv/b4587cd4.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/b79a1f4e.frag.spv b/packages/ludic.render3d/shaders/spv/b79a1f4e.frag.spv index 3114c34f..11860be7 100644 Binary files a/packages/ludic.render3d/shaders/spv/b79a1f4e.frag.spv and b/packages/ludic.render3d/shaders/spv/b79a1f4e.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/b79a1f4e.vert.spv b/packages/ludic.render3d/shaders/spv/b79a1f4e.vert.spv index fce8b982..917e392d 100644 Binary files a/packages/ludic.render3d/shaders/spv/b79a1f4e.vert.spv and b/packages/ludic.render3d/shaders/spv/b79a1f4e.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/b964507f.frag.spv b/packages/ludic.render3d/shaders/spv/b964507f.frag.spv index 1e9677a1..e726965e 100644 Binary files a/packages/ludic.render3d/shaders/spv/b964507f.frag.spv and b/packages/ludic.render3d/shaders/spv/b964507f.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/b964507f.vert.spv b/packages/ludic.render3d/shaders/spv/b964507f.vert.spv index 009d9a14..8d24cfc7 100644 Binary files a/packages/ludic.render3d/shaders/spv/b964507f.vert.spv and b/packages/ludic.render3d/shaders/spv/b964507f.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/b9fc2041.frag.spv b/packages/ludic.render3d/shaders/spv/b9fc2041.frag.spv index f3afbb86..57af6fcd 100644 Binary files a/packages/ludic.render3d/shaders/spv/b9fc2041.frag.spv and b/packages/ludic.render3d/shaders/spv/b9fc2041.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/b9fc2041.vert.spv b/packages/ludic.render3d/shaders/spv/b9fc2041.vert.spv index 9b3f16fa..289c8479 100644 Binary files a/packages/ludic.render3d/shaders/spv/b9fc2041.vert.spv and b/packages/ludic.render3d/shaders/spv/b9fc2041.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/bf3151c8.frag.spv b/packages/ludic.render3d/shaders/spv/bf3151c8.frag.spv index ced69cf0..e278bae2 100644 Binary files a/packages/ludic.render3d/shaders/spv/bf3151c8.frag.spv and b/packages/ludic.render3d/shaders/spv/bf3151c8.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/bf3151c8.vert.spv b/packages/ludic.render3d/shaders/spv/bf3151c8.vert.spv index 4f89b741..1c2a8d8c 100644 Binary files a/packages/ludic.render3d/shaders/spv/bf3151c8.vert.spv and b/packages/ludic.render3d/shaders/spv/bf3151c8.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/bfa15301.frag.spv b/packages/ludic.render3d/shaders/spv/bfa15301.frag.spv index cba1f6cf..89263571 100644 Binary files a/packages/ludic.render3d/shaders/spv/bfa15301.frag.spv and b/packages/ludic.render3d/shaders/spv/bfa15301.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/bfa15301.vert.spv b/packages/ludic.render3d/shaders/spv/bfa15301.vert.spv index 00e477cb..a8db43dc 100644 Binary files a/packages/ludic.render3d/shaders/spv/bfa15301.vert.spv and b/packages/ludic.render3d/shaders/spv/bfa15301.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/c57b4f14.frag.spv b/packages/ludic.render3d/shaders/spv/c57b4f14.frag.spv index 7c834b99..b85661ea 100644 Binary files a/packages/ludic.render3d/shaders/spv/c57b4f14.frag.spv and b/packages/ludic.render3d/shaders/spv/c57b4f14.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/c57b4f14.vert.spv b/packages/ludic.render3d/shaders/spv/c57b4f14.vert.spv index 55a54733..45e56abe 100644 Binary files a/packages/ludic.render3d/shaders/spv/c57b4f14.vert.spv and b/packages/ludic.render3d/shaders/spv/c57b4f14.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/d48d6a48.frag.spv b/packages/ludic.render3d/shaders/spv/d48d6a48.frag.spv index 7fe5d81d..ae5781f7 100644 Binary files a/packages/ludic.render3d/shaders/spv/d48d6a48.frag.spv and b/packages/ludic.render3d/shaders/spv/d48d6a48.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/d48d6a48.vert.spv b/packages/ludic.render3d/shaders/spv/d48d6a48.vert.spv index 5d50274f..b49148cc 100644 Binary files a/packages/ludic.render3d/shaders/spv/d48d6a48.vert.spv and b/packages/ludic.render3d/shaders/spv/d48d6a48.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/e18e40c9.frag.spv b/packages/ludic.render3d/shaders/spv/e18e40c9.frag.spv index 572b031a..de4cb3bc 100644 Binary files a/packages/ludic.render3d/shaders/spv/e18e40c9.frag.spv and b/packages/ludic.render3d/shaders/spv/e18e40c9.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/e18e40c9.vert.spv b/packages/ludic.render3d/shaders/spv/e18e40c9.vert.spv index 55a54733..45e56abe 100644 Binary files a/packages/ludic.render3d/shaders/spv/e18e40c9.vert.spv and b/packages/ludic.render3d/shaders/spv/e18e40c9.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/e86f78e8.frag.spv b/packages/ludic.render3d/shaders/spv/e86f78e8.frag.spv index ef3a98ae..e1788b28 100644 Binary files a/packages/ludic.render3d/shaders/spv/e86f78e8.frag.spv and b/packages/ludic.render3d/shaders/spv/e86f78e8.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/e86f78e8.vert.spv b/packages/ludic.render3d/shaders/spv/e86f78e8.vert.spv index 2259b608..ba388ee7 100644 Binary files a/packages/ludic.render3d/shaders/spv/e86f78e8.vert.spv and b/packages/ludic.render3d/shaders/spv/e86f78e8.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/e9b6300c.frag.spv b/packages/ludic.render3d/shaders/spv/e9b6300c.frag.spv index d8d60239..d5d2f273 100644 Binary files a/packages/ludic.render3d/shaders/spv/e9b6300c.frag.spv and b/packages/ludic.render3d/shaders/spv/e9b6300c.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/e9b6300c.vert.spv b/packages/ludic.render3d/shaders/spv/e9b6300c.vert.spv index 17d7ba64..aff7eb39 100644 Binary files a/packages/ludic.render3d/shaders/spv/e9b6300c.vert.spv and b/packages/ludic.render3d/shaders/spv/e9b6300c.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/f2952361.frag.spv b/packages/ludic.render3d/shaders/spv/f2952361.frag.spv index 24ff0857..7b3fa2c5 100644 Binary files a/packages/ludic.render3d/shaders/spv/f2952361.frag.spv and b/packages/ludic.render3d/shaders/spv/f2952361.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/f2952361.vert.spv b/packages/ludic.render3d/shaders/spv/f2952361.vert.spv index 7051758f..c19cd525 100644 Binary files a/packages/ludic.render3d/shaders/spv/f2952361.vert.spv and b/packages/ludic.render3d/shaders/spv/f2952361.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/f34dce08.frag.spv b/packages/ludic.render3d/shaders/spv/f34dce08.frag.spv index 3114c34f..11860be7 100644 Binary files a/packages/ludic.render3d/shaders/spv/f34dce08.frag.spv and b/packages/ludic.render3d/shaders/spv/f34dce08.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/f34dce08.vert.spv b/packages/ludic.render3d/shaders/spv/f34dce08.vert.spv index e41a7cd5..20c125af 100644 Binary files a/packages/ludic.render3d/shaders/spv/f34dce08.vert.spv and b/packages/ludic.render3d/shaders/spv/f34dce08.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/f4382918.frag.spv b/packages/ludic.render3d/shaders/spv/f4382918.frag.spv index 30d954a7..c226f79f 100644 Binary files a/packages/ludic.render3d/shaders/spv/f4382918.frag.spv and b/packages/ludic.render3d/shaders/spv/f4382918.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/f4382918.vert.spv b/packages/ludic.render3d/shaders/spv/f4382918.vert.spv index 7051758f..c19cd525 100644 Binary files a/packages/ludic.render3d/shaders/spv/f4382918.vert.spv and b/packages/ludic.render3d/shaders/spv/f4382918.vert.spv differ diff --git a/packages/ludic.render3d/shaders/spv/f4a2b586.frag.spv b/packages/ludic.render3d/shaders/spv/f4a2b586.frag.spv index b5246909..d51f1c25 100644 Binary files a/packages/ludic.render3d/shaders/spv/f4a2b586.frag.spv and b/packages/ludic.render3d/shaders/spv/f4a2b586.frag.spv differ diff --git a/packages/ludic.render3d/shaders/spv/f4a2b586.vert.spv b/packages/ludic.render3d/shaders/spv/f4a2b586.vert.spv index 1d28416e..db1380f8 100644 Binary files a/packages/ludic.render3d/shaders/spv/f4a2b586.vert.spv and b/packages/ludic.render3d/shaders/spv/f4a2b586.vert.spv differ diff --git a/packages/ludic.render3d/shaders/terrain.frag b/packages/ludic.render3d/shaders/terrain.frag index a347dd30..b2081fde 100644 --- a/packages/ludic.render3d/shaders/terrain.frag +++ b/packages/ludic.render3d/shaders/terrain.frag @@ -536,6 +536,11 @@ void main() { #ifdef DEBUG_MAT col = dbg_mat; #endif +#ifdef DEBUG_WIND + // The wind field itself, painted on the ground: R3D_DEBUG_WIND=1 with two shots a moment + // apart shows the gust fronts and shows them MOVING, which no still of grass ever will. + col = vec3(windGust(p.xz, u_time)) * vec3(1.0, 0.95, 0.75); +#endif #ifdef DEBUG_ALB col = dbg_alb * 3.0; #endif diff --git a/packages/ludic.render3d/shaders/wind.glsl b/packages/ludic.render3d/shaders/wind.glsl new file mode 100644 index 00000000..c17054f7 --- /dev/null +++ b/packages/ludic.render3d/shaders/wind.glsl @@ -0,0 +1,44 @@ +// ---- ONE WIND, and everything in the valley is moved by it ---------------------------------- +// +// Before this the grass had a gust term built from two sines and the trees had NO gust at all - +// just a per-instance wobble - so the meadow rippled and the canopy over it swayed to an +// unrelated rhythm. Nothing ever crossed the valley. A real gust is a WAVE: you watch it come +// over the grass, it reaches you, and it goes on into the trees behind you, and that single +// fact does more for "this place is alive" than any amount of extra detail. +// +// It is prepended to EVERY stage (programs.ludic), so the grass's vertex shader, the crown's +// vertex shader and the water's fragment shader all read the same field at the same world +// position and cannot drift apart. No uniforms are declared here on purpose: u_time and u_wind +// already exist in several of those files, and redeclaring them would be a compile error in +// whichever stage happened to include both. The caller passes what it already has. + +// The prevailing wind down the valley. Maroon Creek runs roughly north-east, and a mountain +// valley funnels its wind along itself rather than across. +const vec2 WIND_DIR = vec2(0.86, 0.51); + +// 0 = still, 1 = the middle of a gust. Mostly low with fronts travelling through it, because +// real wind is gusts separated by calm and not a constant shaking. +float windGust(vec2 xz, float t) { + float d = dot(xz, WIND_DIR); + float across = dot(xz, vec2(-WIND_DIR.y, WIND_DIR.x)); + // three scrolling bands: a fast narrow front, a slow broad swell, and a slight variation + // along the front so it does not arrive as one straight wall + // The wavelength has to fit INSIDE a view or nothing is ever seen to travel: at 0.030 the + // front was 209 m from crest to crest, longer than the meadow you can see, so the whole + // frame sat in one phase and the gust read as everything breathing together. At 0.085 it is + // about 74 m and a front crosses a normal view in a couple of seconds. + float g = sin(d * 0.085 - t * 2.6) + + 0.65 * sin(d * 0.022 - t * 0.85 + 1.7) + + 0.40 * sin(across * 0.040 - t * 0.55); + // tighter than a plain smoothstep either side: gusts with calm between them, not a wobble + return smoothstep(-0.10, 1.35, g); +} + +// What a plant actually does: a small constant tremble it always has, plus the gust, which is +// most of the motion. `stiff` is how much the plant resists - grass near 0, a spruce trunk near +// 1 - so the same field moves a blade a long way and a bole hardly at all. +float windSway(vec2 xz, float t, float phase, float stiff) { + float tremble = sin(phase) * 0.6 + sin(phase * 2.3 + 1.0) * 0.4; + float gust = windGust(xz, t); + return (tremble * 0.30 + gust * 1.35) * (1.0 - 0.85 * stiff); +} diff --git a/packages/ludic.render3d/terrain.ludic b/packages/ludic.render3d/terrain.ludic index 4e065ddb..cac569ee 100644 --- a/packages/ludic.render3d/terrain.ludic +++ b/packages/ludic.render3d/terrain.ludic @@ -421,6 +421,7 @@ function terrain_init_finish() -> void { var defs = "" if r3d_debug_shadow { defs = "#define DEBUG_SHADOW\n" } if r3d_env_has("R3D_DEBUG_MAT") { defs = "#define DEBUG_MAT\n" } + if r3d_env_has("R3D_DEBUG_WIND") { defs = "#define DEBUG_WIND\n" } if r3d_env_has("R3D_DEBUG_NRM") { defs = "#define DEBUG_NRM\n" } if r3d_env_has("R3D_DEBUG_ALB") { defs = "#define DEBUG_ALB\n" } # Elimination profiling. Measure these by FRAME TIME (prof_ft_report), not by the diff --git a/tools/ludic-cli/shaders.ludic b/tools/ludic-cli/shaders.ludic index ede3319c..3254e32c 100644 --- a/tools/ludic-cli/shaders.ludic +++ b/tools/ludic-cli/shaders.ludic @@ -152,6 +152,7 @@ function shd_bind_varyings(src: pointer, word: pointer, collect: bool) -> pointe var shd_noise: pointer = null var shd_lighting: pointer = null +var shd_wind: pointer = null function shd_file(name: pointer) -> pointer { let s = read_file(`packages/ludic.render3d/shaders/{name}`) if s == null { err(`shaders: missing packages/ludic.render3d/shaders/{name}\n`); return "" } @@ -204,6 +205,7 @@ function cmd_shaders() -> int { if list == null { err("shaders: no packages/ludic.render3d/shaders/variants.list\n"); return 1 } shd_noise = shd_file("noise.glsl") shd_lighting = shd_file("lighting.glsl") + shd_wind = shd_file("wind.glsl") var outdir = "packages/ludic.render3d/shaders/spv" let tmp = tmp_path("shaders") if check { outdir = tmp_path("shaders-check") } @@ -232,13 +234,13 @@ function cmd_shaders() -> int { let depth_remap = "\n#undef main\nvoid main() {\n ludic_gl_main();\n gl_Position.z = (gl_Position.z + gl_Position.w) * 0.5;\n}\n" # invariant: the foliage's depth prepass and its lit pass (depth EQUAL) are different variants, # and without it the compiler may compute their positions a hair apart and fail the test - var vsrc = "#version 460\n" + defines + "invariant gl_Position;\n#define main ludic_gl_main\n" + shd_file(parts[0]) + depth_remap + var vsrc = "#version 460\n" + defines + shd_wind + "invariant gl_Position;\n#define main ludic_gl_main\n" + shd_file(parts[0]) + depth_remap # A mesh shader stands in for the vertex stage (a variant whose first file is *.mesh): it writes an # array of positions, so it cannot be wrapped for the depth remap or take invariant gl_Position - # it remaps depth itself. Its SPIR-V keeps the .vert name, so the manifest and loader are unchanged. let is_mesh = Text.ends_with(parts[0], ".mesh") - if is_mesh { vsrc = "#version 460\n#extension GL_EXT_mesh_shader : require\n" + defines + shd_file(parts[0]) } - let fsrc = "#version 460\n" + defines + shd_noise + shd_lighting + shd_file(parts[1]) + if is_mesh { vsrc = "#version 460\n#extension GL_EXT_mesh_shader : require\n" + defines + shd_wind + shd_file(parts[0]) } + let fsrc = "#version 460\n" + defines + shd_wind + shd_noise + shd_lighting + shd_file(parts[1]) # one binding table for both stages, and one location table for the varyings between them shd_names = new []pointer shd_vary = new []pointer