From 05d6b1adf33b78d783edf25ef32deb295f2079de Mon Sep 17 00:00:00 2001
From: pkuzic
Date: Fri, 25 Sep 2026 08:37:39 +0100
Subject: [PATCH] MONKEY (p0): WGSL fixes found by the world-scene run
naga_oil refuses a composable-module identifier that naga's namer would
rewrite (a trailing digit gets a '_'), which failed every pipeline that
imports monkey_frame / enhanced_water (models, WMOs, liquid invisible).
MonkeyFrame rows are renamed fog_a..fog_d, wind_a/b, wet_a (same order and
layout), and enhanced_water's padding member _sh_c16 becomes _sh_quad.
Co-Authored-By: Claude Opus 5.5
---
LIGHTING.md | 14 +++++++-------
.../src/shaders/enhanced_water.wgsl | 2 +-
crates/benilla-assets/src/shaders/fog_hook.wgsl | 6 +++---
.../benilla-assets/src/shaders/monkey_frame.wgsl | 16 +++++++++-------
.../benilla-world/src/lighting/monkey_frame.rs | 16 ++++++++--------
5 files changed, 28 insertions(+), 26 deletions(-)
diff --git a/LIGHTING.md b/LIGHTING.md
index bb879614..6a3a2d69 100644
--- a/LIGHTING.md
+++ b/LIGHTING.md
@@ -65,13 +65,13 @@ is its own module, documented in `WATER.md`.
| row | x | y | z | w |
|---|---|---|---|---|
- | `fog0` | height_fog_density | height_fog_height | height_fog_falloff | curve_blend |
- | `fog1` | sun_fog r | g | b | sun_fog_strength |
- | `fog2` | end_fog r | g | b | end_fog_distance |
- | `fog3` | fog_model (0 classic, 1 modern) | sun_fog_angle | 0 | 0 |
- | `wind0` | dir_x | dir_y | speed | gust |
- | `wind1` | time_s | sway_strength | grass_strength | tree_strength |
- | `wet0` | rain_rate | wetness | ripple_time_s | snow |
+ | `fog_a` | height_fog_density | height_fog_height | height_fog_falloff | curve_blend |
+ | `fog_b` | sun_fog r | g | b | sun_fog_strength |
+ | `fog_c` | end_fog r | g | b | end_fog_distance |
+ | `fog_d` | fog_model (0 classic, 1 modern) | sun_fog_angle | 0 | 0 |
+ | `wind_a` | dir_x | dir_y | speed | gust |
+ | `wind_b` | time_s | sway_strength | grass_strength | tree_strength |
+ | `wet_a` | rain_rate | wetness | ripple_time_s | snow |
| `misc` | bender_count | time_of_day 0..1 | night 0..1 | 0 |
| `benders[8]` | world x | world y | world z | radius |
diff --git a/crates/benilla-assets/src/shaders/enhanced_water.wgsl b/crates/benilla-assets/src/shaders/enhanced_water.wgsl
index 80d54670..4d7d2789 100644
--- a/crates/benilla-assets/src/shaders/enhanced_water.wgsl
+++ b/crates/benilla-assets/src/shaders/enhanced_water.wgsl
@@ -53,7 +53,7 @@ struct WaterLight {
fog_color: vec4, // 4
fog_params: vec4, // 5
_sh: array, 6>, // 6-11
- _sh_c16: vec4, // 12
+ _sh_quad: vec4, // 12 (MONKEY p0: was `_sh_c16`; a composable module member may not end in a digit once the struct embeds an imported type)
water_river: array, 2>, // 13-14
water_ocean: array, 2>, // 15-16
_grade: vec4, // 17
diff --git a/crates/benilla-assets/src/shaders/fog_hook.wgsl b/crates/benilla-assets/src/shaders/fog_hook.wgsl
index e931ccf9..6730fbd8 100644
--- a/crates/benilla-assets/src/shaders/fog_hook.wgsl
+++ b/crates/benilla-assets/src/shaders/fog_hook.wgsl
@@ -13,7 +13,7 @@
// `mix(fog_rgb, rgb, factor)`. The expressions below are the ones the receivers carried, in the
// same order, so the classic result is bit-identical.
//
-// Extension point for the FOG lane: `fog_sample` branches on `mf.fog3.x` (`MonkeyFrame.fog_model`,
+// Extension point for the FOG lane: `fog_sample` branches on `mf.fog_d.x` (`MonkeyFrame.fog_model`,
// 0 classic / 1 modern). The modern arm currently returns the classic result.
#import benilla::monkey_frame::MonkeyFrame
@@ -39,9 +39,9 @@ fn fog_sample(
mf: MonkeyFrame,
) -> vec4 {
let classic = vec4(fog_rgb, fog_linear(eye_z, span));
- if (mf.fog3.x > 0.5) {
+ if (mf.fog_d.x > 0.5) {
// FOG lane: the modern model (height / sun / end-colour / curve fog) goes here, reading
- // mf.fog0..fog3. Until it lands, the modern arm is the classic law.
+ // mf.fog_a..fog_d. Until it lands, the modern arm is the classic law.
return classic;
}
return classic;
diff --git a/crates/benilla-assets/src/shaders/monkey_frame.wgsl b/crates/benilla-assets/src/shaders/monkey_frame.wgsl
index ea1780b3..97cbeba8 100644
--- a/crates/benilla-assets/src/shaders/monkey_frame.wgsl
+++ b/crates/benilla-assets/src/shaders/monkey_frame.wgsl
@@ -8,14 +8,16 @@
//
// Coordinates are Bevy world space (Y up, 1 unit = 1 yd), the space of the receivers'
// `world_position`: WoW `(x, y, z)` is Bevy `(-y, z, -x)` (`benilla_assets::coords::wow_to_bevy`).
+// Member names carry no trailing digit: naga_oil refuses a composable-module identifier that
+// naga's namer would rewrite (`fog0` -> `fog0_`), so the rows are `fog_a..fog_d`, `wind_a/b`, `wet_a`.
struct MonkeyFrame {
- fog0: vec4, // height_fog_density, height_fog_height (world Y, yd), height_fog_falloff, curve_blend
- fog1: vec4, // sun_fog_rgb (gamma 0..1), sun_fog_strength
- fog2: vec4, // end_fog_rgb (gamma 0..1), end_fog_distance (yd)
- fog3: vec4, // fog_model (0 classic, 1 modern), sun_fog_angle (cos), 0, 0
- wind0: vec4, // dir_x, dir_y (unit, world XZ: .x = world x, .y = world z), speed (yd/s), gust 0..1
- wind1: vec4, // time_s, sway_strength, grass_strength, tree_strength
- wet0: vec4, // rain_rate 0..1, wetness 0..1, ripple_time_s, snow 0..1
+ fog_a: vec4, // height_fog_density, height_fog_height (world Y, yd), height_fog_falloff, curve_blend
+ fog_b: vec4, // sun_fog_rgb (gamma 0..1), sun_fog_strength
+ fog_c: vec4, // end_fog_rgb (gamma 0..1), end_fog_distance (yd)
+ fog_d: vec4, // fog_model (0 classic, 1 modern), sun_fog_angle (cos), 0, 0
+ wind_a: vec4, // dir_x, dir_y (unit, world XZ: .x = world x, .y = world z), speed (yd/s), gust 0..1
+ wind_b: vec4, // time_s, sway_strength, grass_strength, tree_strength
+ wet_a: vec4, // rain_rate 0..1, wetness 0..1, ripple_time_s, snow 0..1
misc: vec4, // bender_count, time_of_day 0..1 (packer), night 0..1 (packer), 0
benders: array, 8>, // world xyz (Bevy space) + radius (yd); the first bender_count are live
}
diff --git a/crates/benilla-world/src/lighting/monkey_frame.rs b/crates/benilla-world/src/lighting/monkey_frame.rs
index 3ca56f7d..c583ec98 100644
--- a/crates/benilla-world/src/lighting/monkey_frame.rs
+++ b/crates/benilla-world/src/lighting/monkey_frame.rs
@@ -14,13 +14,13 @@
//!
//! | row | xyz / x,y,z | w |
//! |---|---|---|
-//! | 0 `fog0` | height_fog_density, height_fog_height, height_fog_falloff | curve_blend |
-//! | 1 `fog1` | sun_fog_rgb | sun_fog_strength |
-//! | 2 `fog2` | end_fog_rgb | end_fog_distance |
-//! | 3 `fog3` | fog_model (0 classic, 1 modern), sun_fog_angle, 0 | 0 |
-//! | 4 `wind0` | dir_x, dir_y, speed | gust |
-//! | 5 `wind1` | time_s, sway_strength, grass_strength | tree_strength |
-//! | 6 `wet0` | rain_rate, wetness, ripple_time_s | snow |
+//! | 0 `fog_a` | height_fog_density, height_fog_height, height_fog_falloff | curve_blend |
+//! | 1 `fog_b` | sun_fog_rgb | sun_fog_strength |
+//! | 2 `fog_c` | end_fog_rgb | end_fog_distance |
+//! | 3 `fog_d` | fog_model (0 classic, 1 modern), sun_fog_angle, 0 | 0 |
+//! | 4 `wind_a` | dir_x, dir_y, speed | gust |
+//! | 5 `wind_b` | time_s, sway_strength, grass_strength | tree_strength |
+//! | 6 `wet_a` | rain_rate, wetness, ripple_time_s | snow |
//! | 7 `misc` | bender_count, time_of_day 0..1, night 0..1 | 0 |
//! | 8-15 `benders` | world x, y, z | radius |
//!
@@ -38,7 +38,7 @@ pub const MONKEY_FRAME_ROWS: usize = 16;
/// How many benders (grass/foliage pushers: the player and nearby units) the block carries.
pub const MAX_BENDERS: usize = 8;
-/// The fog model selector, `fog3.x`.
+/// The fog model selector, `fog_d.x`.
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum FogModel {
/// Today's linear 1.12 fog, byte-identical.