diff --git a/src/bin/bevy.rs b/src/bin/bevy.rs --- a/src/bin/bevy.rs +++ b/src/bin/bevy.rs @@ -83,6 +83,11 @@ /// mesh is inspectable and albedo reads with no mood. Dev affordance only, /// never a player surface (material-dark-frame.md, the dev work light). const WORKLIGHT_AMBIENT: f32 = 900.0; +/// The material camera's blindness is a soft physical falloff, not a hard +/// tile edge. Known geometry falls into the same near-black as the unrendered +/// unknown before the camera reaches the map boundary. +const MATERIAL_FOG_START: f32 = 1.5; +const MATERIAL_FOG_END: f32 = 7.0; // ─── Palette ───────────────────────────────────────────────────────────────── @@ -2335,6 +2340,17 @@ fov: 35.0_f32.to_radians(), ..default() }), + // Unknown tiles remain absent. This only blends *earned* material + // geometry into sensor-darkness before it reaches that absence, so + // fog reads as camera/light falloff rather than a square cutoff. + DistanceFog { + color: Color::srgb(0.006, 0.008, 0.014), + falloff: FogFalloff::Linear { + start: MATERIAL_FOG_START, + end: MATERIAL_FOG_END, + }, + ..default() + }, Transform::from_translation(target + Vec3::new(0.0, tilt.sin(), tilt.cos()) * CLOSE_DIST) .looking_at(target, Vec3::Y), layer.clone(), diff --git a/wiki/interface/material-dark-frame.md b/wiki/interface/material-dark-frame.md --- a/wiki/interface/material-dark-frame.md +++ b/wiki/interface/material-dark-frame.md @@ -130,6 +130,15 @@ levels are [TUNE]: the darkness must read as a physically dark room on camera, not a missing scene. +The camera blends earned material mass back into that same near-black +with an aggressive distance-fog falloff. It begins close to the attention +anchor and reaches black before a wide material frame can end in a crisp +wall silhouette. This is a lighting/camera treatment on geometry already +earned by fog; it never draws, outlines, or otherwise invents an Unknown +tile. Light and the blend should make a seen wall *disappear into the +room*, not terminate the room as a square map cutout. [TUNE: start/end +distances are renderer constants, calibrated by captures.] + ### The dev work light Development needs to see geometry that the fiction keeps dark, so the @@ -199,3 +208,7 @@ 7. The flat sensorium, terminal, and agent frame gain no material-only chassis from telemetry alone; panel telemetry and feel-graph remain; no surface gains a pictured fact light/sound did not earn. +8. In a close and a wide Seen capture, rendered wall mass fades into + near-black under the dark rig and camera fog rather than ending in a + hard lit silhouette at the Unknown boundary; the fog audit still proves + Unknown geometry is absent. diff --git a/wiki/log/2026-07-09-material-fog.md b/wiki/log/2026-07-09-material-fog.md new file mode 100644 --- /dev/null +++ b/wiki/log/2026-07-09-material-fog.md @@ -0,0 +1,38 @@ +# 2026-07-09 — Material fog blends walls into darkness + +``` +Type: log +``` + +## Intent + +Cameron called out the material screenshot's hard fog edge: visible wall +blocks simply stopped at unrendered space, making darkness read as a square +map cutoff. The right read is a camera losing light and material certainty. + +## Changed + +- The material `Camera3d` now carries an aggressive near-black + `DistanceFog` (`start = 1.5`, `end = 7.0` world units). It blends rendered + mass into the same sensor-darkness as the void rather than drawing a sharp + far-wall silhouette. +- This composes with the dark frame's machine-only light rig: ambient remains + near-nothing and the core strip remains the tick-zero diegetic source, so + illumination and the camera blend both dissolve the earned map into dark. +- `material-dark-frame.md` now owns the rule: this is a camera/light treatment + on earned geometry only. Unknown tiles stay geometry-free and the fog audit + still asserts it. + +## Evidence + +- `MISALIGNED_SHOT=close` → `/tmp/misaligned-close-fog.png` +- `MISALIGNED_SHOT=wide` → `/tmp/misaligned-wide-fog.png` + +Both runs printed the material fog audit: Unknown/blueprint/remembered mass +absent, Seen and owned-telemetry surfaces lit, and all pooled world materials +flat (no textures). + +## Checks + +`./tools/check.sh --frontend` — passed (format, Bevy-bin tests, Bevy clippy, +corpus/wiki/environment gates). diff --git a/wiki/log/DEVLOG.md b/wiki/log/DEVLOG.md --- a/wiki/log/DEVLOG.md +++ b/wiki/log/DEVLOG.md @@ -75,6 +75,18 @@ - Checks: ./tools/check.sh --docs. - Log: wiki/log/2026-07-09-agent-scale-capture.md. +## 2026-07-09 - Material fog blends walls into darkness + +- Intent: Cameron's material screenshot still ended visible wall blocks as a + hard map cutoff. Make the camera feel like it loses light and sight rather + than simply failing to draw the next square. +- Changed: added aggressive near-black distance fog to the material camera, + complementing the dark rig's machine-only light. The fog only blends geometry + fog already earned; Unknown remains absent and the fog audit retains that + assertion. +- Checks: close + wide material harness captures; frontend `./tools/check.sh`. +- Log: wiki/log/2026-07-09-material-fog.md. + ## 2026-07-09 - Faster proportional check.sh at agent scale - Intent: stop concurrent agents thrashing on a serial full cargo wall;