From 554d3a5eb905a7475faae6bc83acf0935b7a88cd Mon Sep 17 00:00:00 2001
From: pkuzic
Date: Fri, 25 Sep 2026 23:37:11 +0100
Subject: [PATCH] MONKEY (reviewfix): shade water in its source wave domain
Co-Authored-By: GPT-5.6 Sol (Codex)
---
crates/benilla-assets/src/shaders/enhanced_water.wgsl | 4 +++-
crates/benilla-assets/src/shaders/liquid.wgsl | 8 ++++++--
2 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/crates/benilla-assets/src/shaders/enhanced_water.wgsl b/crates/benilla-assets/src/shaders/enhanced_water.wgsl
index 5cd1bd25..a8906e63 100644
--- a/crates/benilla-assets/src/shaders/enhanced_water.wgsl
+++ b/crates/benilla-assets/src/shaders/enhanced_water.wgsl
@@ -91,6 +91,8 @@ fn water_rain_open(world_pos: vec3) -> f32 {
struct WaterFragment {
clip_position: vec4,
world_position: vec4,
+ // MONKEY (reviewfix): world XZ before `water_swell`, so fragment waves share its source domain.
+ source_xz: vec2,
// The authored per-vertex swatch depth (UV1.x): ocean byte/255, about 148 yd at 1.0.
depth: f32,
// MONKEY (water): an interior WMO pool's authored MOMT diffuse colour; white on other lanes.
@@ -555,7 +557,7 @@ fn enhanced_water(in: WaterFragment, shallow: vec4, deep: vec4) -> vec
}
let t = water_time(); // WOW_CAPTURE_WATER_T pins the frozen water phase.
let fog = water_fog(in.world_position.xyz, in.room_fog);
- let p = in.world_position.xz;
+ let p = in.source_xz;
let energy = clamp(water.mode.y, 0.0, 1.0);
let ocean_mesh = water.lane.y > 0.5 && water.lane.x < 0.5;
diff --git a/crates/benilla-assets/src/shaders/liquid.wgsl b/crates/benilla-assets/src/shaders/liquid.wgsl
index 53027ebd..93f32ba6 100644
--- a/crates/benilla-assets/src/shaders/liquid.wgsl
+++ b/crates/benilla-assets/src/shaders/liquid.wgsl
@@ -85,6 +85,8 @@ struct LiquidVsOut {
@location(5) vcolor: vec4,
// `MeshTag` bit 30: the room's per-frame interior-fog gate, the reference's `[0xca7f00]`.
@location(6) @interpolate(flat) room_fog: u32,
+ // MONKEY (reviewfix): the analytic water domain before the ocean's vertex displacement.
+ @location(7) source_xz: vec2,
}
// Sun sheen (`secondary`): the Blinn highlight `light_spec.rgb · (N·H)^shininess`.
@@ -147,8 +149,9 @@ fn vertex(in: Vertex) -> LiquidVsOut {
let world_from_local = mesh_functions::get_world_from_local(in.instance_index);
out.world_position =
mesh_functions::mesh_position_local_to_world(world_from_local, vec4(in.position, 1.0));
+ out.source_xz = out.world_position.xz;
// MONKEY (enhanced water): ocean Gerstner displacement; zero on Classic/other surfaces.
- out.world_position += vec4(water_swell(out.world_position.xz, in.uv_b.x, in.uv_b.y), 0.0);
+ out.world_position += vec4(water_swell(out.source_xz, in.uv_b.x, in.uv_b.y), 0.0);
out.clip_position = position_world_to_clip(out.world_position.xyz);
out.world_normal = mesh_functions::mesh_normal_local_to_world(in.normal, in.instance_index);
out.uv = in.uv;
@@ -221,7 +224,8 @@ fn fragment(in: LiquidVsOut) -> @location(0) vec4 {
return enhanced_water(
// MONKEY (water): the enhanced interior arm consumes the MOMT colour already carried
// by the reference fragment interface; exterior/ADT vertices supply white.
- WaterFragment(in.clip_position, in.world_position, in.depth, in.vcolor, in.room_fog),
+ WaterFragment(in.clip_position, in.world_position, in.source_xz, in.depth, in.vcolor,
+ in.room_fog),
shallow_enhanced, deep_enhanced);
}