Files
Ransom-s-wake/game/world/sites/sunlit_shallows_caustic_floor.gdshader
OlivierandClaude Fable 5.1 f0072a3e11
Quality Gate / Quality Gate (pull_request) Successful in 6m55s
Add sunlit shallows site with localized sun shafts
New visual test site under game/world/sites: flat sandy floor at
-40 m, calm surface at 0 m, fixed daytime sun ahead of and above
the submarine. Light shafts come from a shadow-only surface
occluder whose alpha-scissor ripples open only inside a pool a few
tens of metres ahead; a subtractive FogVolume cancels the global
volumetric fog above the water, and an unshaded ceiling mesh shows
the lit underside of the surface inside that pool. A composed
world (sunlit_shallows_world.tscn) mounts the submarine, cockpit
and camera rig in it, with the projectors kept out of the fog.

Cockpit: the porthole glass moves to its own render layer with a
rougher material and the porthole fill light excludes that layer,
so interior lamps no longer mirror as hard specular points.

Quality gate: new integration suite for the site (42 checks), three
glass assertions in the foundation suite, and the Input-access
architecture rule now matches both path separators so the gate runs
on Windows. project.godot raises the volumetric fog froxel grid to
128 so the shafts stay readable.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 23:18:56 +02:00

29 lines
1.1 KiB
Plaintext

// Flat sandy floor with slowly drifting caustic lines. The pattern is purely
// presentational and time-driven by the shader clock; no gameplay reads it.
shader_type spatial;
uniform vec3 sand_color : source_color = vec3(0.34, 0.32, 0.25);
uniform vec3 caustic_tint : source_color = vec3(0.55, 0.82, 0.92);
uniform sampler2D caustic_noise : repeat_enable, filter_linear_mipmap;
uniform float caustic_scale = 0.055;
uniform float caustic_speed = 0.018;
uniform float caustic_strength : hint_range(0.0, 2.0) = 0.25;
varying vec2 world_xz;
void vertex() {
world_xz = (MODEL_MATRIX * vec4(VERTEX, 1.0)).xz;
}
void fragment() {
vec2 drift_a = TIME * caustic_speed * vec2(1.0, 0.6);
vec2 drift_b = TIME * caustic_speed * vec2(-0.7, 1.0);
float layer_a = texture(caustic_noise, world_xz * caustic_scale + drift_a).r;
float layer_b = texture(caustic_noise, world_xz * caustic_scale * 1.35 + drift_b).r;
float caustic = pow(clamp(min(layer_a, layer_b) * 1.9, 0.0, 1.0), 4.0);
ALBEDO = sand_color;
ROUGHNESS = 0.95;
METALLIC = 0.0;
EMISSION = caustic_tint * caustic * caustic_strength;
}