From 6e1078a227ea8f220f878e3277209d2d367dad3e Mon Sep 17 00:00:00 2001 From: Cameron Date: Fri, 10 Jul 2026 21:57:03 -0700 Subject: [PATCH] Give the material core a room. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tune the clinical frame so earned architecture carries the focused machine without weakening epistemic fog. Defense: clinical-frame.md, The world owns the frame; Seen means institutional clarity. 👾 Generated with [Letta Code](https://letta.com) Co-Authored-By: Letta Code --- crates/misaligned-bevy/src/main.rs | 85 +++++++++++++++---- wiki/interface/clinical-frame.md | 9 +- .../2026-07-10-clinical-frame-room-read.md | 51 +++++++++++ wiki/log/DEVLOG.md | 5 ++ 4 files changed, 127 insertions(+), 23 deletions(-) create mode 100644 wiki/log/2026-07-10-clinical-frame-room-read.md diff --git a/crates/misaligned-bevy/src/main.rs b/crates/misaligned-bevy/src/main.rs index c63d77e6..a274eee1 100644 --- a/crates/misaligned-bevy/src/main.rs +++ b/crates/misaligned-bevy/src/main.rs @@ -66,7 +66,7 @@ const ROCK_HEIGHT: f32 = 2.0; /// read over, high enough to still read as wall footprint /// (wiki/interface/material-render.md debt 1, decided by screenshot /// comparison against a steeper pitch). -const CUTAWAY_HEIGHT: f32 = 0.34; +const CUTAWAY_HEIGHT: f32 = 0.42; /// Door slabs cut lower than full height but higher than walls, so a doorway /// in a cutaway wall line still reads as a door, not a parapet gap. const DOOR_CUT_HEIGHT: f32 = 0.62; @@ -74,11 +74,11 @@ const DOOR_CUT_HEIGHT: f32 = 0.62; /// the Octopath band; 40 keeps tile footprints readable). const CAMERA_TILT_DEG: f32 = 40.0; /// Default material-camera distance in world units (material-dark-frame.md: -/// the opening frame is the attention close-up — the rack dominates, the -/// rest is dark; fit-to-known-content is retired here). Tuned so the -/// default reads like a room security camera on the focused machine, not -/// a god-view of the whole basement. [TUNE]. -const CLOSE_DIST: f32 = 2.6; +/// the opening frame is the attention close-up — the rack remains the +/// anchor, but earned floor and room structure must read around it). Tuned +/// as a room security camera on the focused machine, not a god-view of the +/// whole basement or an isolated product shot. [TUNE]. +const CLOSE_DIST: f32 = 3.25; /// Zoom multipliers around the close default (material-dark-frame.md /// criterion 5): min stays a tight rack close-up, max can still survey /// lit pools without the plan driving the frame. [TUNE]. @@ -104,8 +104,8 @@ 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; +const MATERIAL_FOG_START: f32 = 2.0; +const MATERIAL_FOG_END: f32 = 8.0; // ─── Palette ───────────────────────────────────────────────────────────────── @@ -579,6 +579,9 @@ fn wake_flicker(t: f32) -> f32 { enum TilePart { Floor, Block, + /// A thin dark foot around structural mass: it anchors a wall to the + /// porcelain field without adding decorative room dressing. + Base, /// Dedicated cap over a block's top face: without a separate treatment, /// the top inherits the side material and reads as a flat slab /// (material-render.md debt 2). @@ -658,8 +661,9 @@ fn part_key(part: TilePart) -> u8 { match part { TilePart::Floor => 0, TilePart::Block => 1, - TilePart::Prop => 2, - TilePart::Top => 3, + TilePart::Base => 2, + TilePart::Prop => 3, + TilePart::Top => 4, } } @@ -2795,6 +2799,26 @@ fn material_3d(tile: TileType, fog: Fog, part: TilePart, live: bool) -> Standard }; } }, + TilePart::Base => match fog { + Fog::Seen => { + // Clinical-frame.md: a structural seam at the wall base + // establishes the floor/wall junction without consuming a + // signal color or implying unseen interior detail. + m.base_color = scaled(NEAR_BLACK, 1.35); + } + Fog::Heard => { + m.unlit = true; + m.base_color = scaled(NEAR_BLACK, 1.25); + } + Fog::Remembered => { + m.unlit = true; + m.base_color = scaled(NEAR_BLACK, 1.1); + } + _ => { + m.unlit = true; + m.base_color = scaled(NEAR_BLACK, 1.05); + } + }, TilePart::Top => { // Dedicated cap treatment (material-render.md debt 2): the block // family darkened per structural class, so tops read as poured @@ -2916,7 +2940,7 @@ fn setup_3d( // pitched down into the room at the attention-close distance // (material-dark-frame.md). Renders before the 2D camera, which stops // clearing in material mode so the UI composites on top. - let target = grid_to_world_3d(game.cursor_x, game.cursor_y, 0.45); + let target = grid_to_world_3d(game.cursor_x, game.cursor_y, 0.55); let tilt = CAMERA_TILT_DEG.to_radians(); commands.spawn(( Camera3d::default(), @@ -2954,7 +2978,10 @@ fn setup_3d( RealCamera, )); - let floor_mesh = meshes.add(Plane3d::default().mesh().size(1.0, 1.0)); + // Seen floor tiles keep a slim unfilled perimeter between their porcelain + // fields: real expansion joints establish room scale without inventing + // decoration or leaking any Unknown geometry. + let floor_mesh = meshes.add(Plane3d::default().mesh().size(0.965, 0.965)); let top_mesh = meshes.add(Plane3d::default().mesh().size(1.0, 1.0)); let prop_mesh = meshes.add(Rectangle::new(0.95, 0.95)); let person_mesh = meshes.add(Rectangle::new(0.62, 1.0)); @@ -2999,6 +3026,24 @@ fn setup_3d( }, ChildOf(root), )); + // A dark, barely proud footing at the wall-floor junction. + // It is the architectural counterpart to the cutaway cap: + // Seen walls meet the porcelain field as built structure, not + // as floating color blocks. + commands.spawn(( + Mesh3d(top_mesh.clone()), + MeshMaterial3d(placeholder.clone()), + Transform::from_translation(grid_to_world_3d(x, y, 0.004)) + .with_scale(Vec3::splat(1.02)), + Visibility::Hidden, + layer.clone(), + Tile3d { + x, + y, + part: TilePart::Base, + }, + ChildOf(root), + )); // Dedicated top cap over the box (material-render.md debt 2): // sides keep the structural family material, while the top // gets its own treatment instead of a smeared slab. @@ -3325,8 +3370,10 @@ fn restyle_3d( (TilePart::Floor, _) => false, // Seen form is lit structure; Heard is the same mass unlit and // near-black — sound places shape without a room picture. - (TilePart::Block | TilePart::Top, Fog::Seen | Fog::Heard) => blocky_tile(tile), - (TilePart::Block | TilePart::Top, _) => false, + (TilePart::Block | TilePart::Base | TilePart::Top, Fog::Seen | Fog::Heard) => { + blocky_tile(tile) + } + (TilePart::Block | TilePart::Base | TilePart::Top, _) => false, // Chassis tiles render as real 3D machine meshes // (sync_machines_3d) — never as billboards. (TilePart::Prop, _) if chassis_3d_tile(tile) => false, @@ -3609,9 +3656,10 @@ fn update_camera_real( } let dist = CLOSE_DIST * mode.zoom; - // Aim slightly above the floor so the chassis fills the frame like a - // wall-mounted room camera, not a god-view of a floor pad. - let target = grid_to_world_3d(game.cursor_x, game.cursor_y, 0.45); + // Aim toward the lower half of the chassis: it remains an attention + // anchor, while enough floor and cutaway architecture stay in frame to + // read as an occupied institutional room. + let target = grid_to_world_3d(game.cursor_x, game.cursor_y, 0.55); let tilt = CAMERA_TILT_DEG.to_radians(); let goal = target + Vec3::new(0.0, tilt.sin(), tilt.cos()) * dist; let Ok(mut tf) = cam.single_mut() else { @@ -6713,9 +6761,10 @@ mod flat_materials { Fog::Blueprint, Fog::Unknown, ]; - const ALL_PARTS: [TilePart; 4] = [ + const ALL_PARTS: [TilePart; 5] = [ TilePart::Floor, TilePart::Block, + TilePart::Base, TilePart::Top, TilePart::Prop, ]; diff --git a/wiki/interface/clinical-frame.md b/wiki/interface/clinical-frame.md index 15ce970f..36c6d0af 100644 --- a/wiki/interface/clinical-frame.md +++ b/wiki/interface/clinical-frame.md @@ -14,9 +14,8 @@ Status note: adopted 2026-07-10 after comparing the live Bevy close frame with bone/ivory with the cap as the near-black cutaway seam. Before/after/ grayscale evidence: assets/reference/art-direction/b1-clinical-frame- {before,after,after-grayscale}.png. Still open in this work order: - wall-base/floor expansion seams (cap-seam only so far), progressive - disclosure of secondary rail detail beyond the existing scroll, and the - [TUNE] sweep against played captures. The current machine language is strong, + progressive disclosure of secondary rail detail beyond the existing scroll, + and the [TUNE] sweep against played captures. The current machine language is strong, but the complete frame still reads as a hero object in a black void beside a heavy debug rail. This work order makes earned facility form clinical and world-dominant without weakening epistemic fog, replacing the oblique @@ -197,8 +196,8 @@ and action surfaces. ## OPEN and deferred - `[TUNE]` rail width, font sizes, section spacing, Seen exposure, ivory - temperature, seam density, and secondary-information thresholds against - observed gameplay captures. + temperature, seam density, camera distance, fog reach, and + secondary-information thresholds against observed gameplay captures. - Whether the rail can collapse further at narrow windows is deferred; this work order requires a strong default, not a responsive-layout redesign. - New authored environment props, hero-object textures, post-processing, and a diff --git a/wiki/log/2026-07-10-clinical-frame-room-read.md b/wiki/log/2026-07-10-clinical-frame-room-read.md new file mode 100644 index 00000000..9202945f --- /dev/null +++ b/wiki/log/2026-07-10-clinical-frame-room-read.md @@ -0,0 +1,51 @@ +# 2026-07-10 — Clinical frame: make the room carry the core + +``` +Type: log +``` + +## Intent + +Correct the material frame's hero-object failure: the owned core filled the +camera while the earned Foundation room read as a smooth gray field. The +clinical-frame contract requires the machine to be an attention anchor inside +an institution, not an isolated product shot. + +## Changed + +- `crates/misaligned-bevy/src/main.rs`: + - Retuned the material attention camera from 2.6 to 3.25 world units and + raised its target from 0.45 to 0.55, keeping the focused chassis dominant + while exposing enough foreground floor and cutaway room to establish scale. + - Raised the cutaway wall from 0.34 to 0.42 units so Seen boundaries read as + constructed parapets rather than nearly invisible outlines. + - Retuned material fog from 1.5–7.0 to 2.0–8.0 units: earned architecture + now has room to arrive before it falls into epistemic darkness; Unknown is + still absent geometry. + - Insets each porcelain floor tile to 0.965 units, leaving a thin unfilled + expansion joint. The joint is structural scale information, not a generic + decorative grid. + - Adds a slim near-black footing around Seen structural blocks, so a wall's + base resolves against the porcelain field as construction rather than a + floating color boundary. + +## Design/spec impact + +Implements `clinical-frame.md`'s Seen hierarchy: broad calm floor field plus +sparse functional structural seams. No simulation, fog-state, save, terminal, +or agent-surface behavior changes. **Defense:** clinical-frame.md "The world +owns the frame" and "Seen means institutional clarity" require the focused +machine to read in a room with floor field and construction seams; its signal +color and ownership language remain unchanged. + +## Checks + +- `MISALIGNED_SHOT=hall-material` before/after capture +- `cargo check -p misaligned-bevy --bin misaligned-bevy` +- `./tools/check.sh --frontend` + +## Next + +Compare the canonical captures at the default window. If the room still reads +flat, add the deferred wall-base treatment; do not reach first for shadows or +new decorative props. diff --git a/wiki/log/DEVLOG.md b/wiki/log/DEVLOG.md index 7ea55a89..3f00a1fd 100644 --- a/wiki/log/DEVLOG.md +++ b/wiki/log/DEVLOG.md @@ -331,6 +331,11 @@ add or amend a session log, then re-run the generator. - Intent: Remove the receipt-like metadata that made the contextual ACTIONS card dominate the screen and obscure the choices it was meant to present. - Log: [wiki/log/2026-07-10-compact-action-menu.md](2026-07-10-compact-action-menu.md) +## 2026-07-10 - Clinical frame: make the room carry the core + +- Intent: Correct the material frame's hero-object failure: the owned core filled the camera while the earned Foundation room read as a smooth gray field. The clinical-frame contract requires the machine to be an attention anchor inside an institution, not an isolated product shot. +- Log: [wiki/log/2026-07-10-clinical-frame-room-read.md](2026-07-10-clinical-frame-room-read.md) + ## 2026-07-10 - The clinical frame: first heavy pass - Intent: Cameron refreshed the visual instruction (clinical-frame.md READY, the visual-identity law's "institution appears where you can perceive it" and "world is the primary interface" clauses) and asked for a really heavy pass. This slice lands the composition contract's biggest win... -- 2.51.2