diff --git a/src/bin/bevy.rs b/src/bin/bevy.rs index 52b68db1..d54e4086 100644 --- a/src/bin/bevy.rs +++ b/src/bin/bevy.rs @@ -2825,25 +2825,31 @@ fn wake_sequence( // Camera: born ~0.3 units from the strip, gaze nearly level so the // column is the world; pull back and up along the game tilt until - // the tower looms and normal framing can take over seamlessly. + // the attention-close default (CLOSE_DIST / zoom 1.0). Ending at the + // old ~13-unit god-view left handoff at zoom ≈ 5 and a visible leap + // when update_camera_real took over (material-dark-frame.md). let core = game.sim.core_position(); let core_w = grid_to_world_3d(core.0, core.1, 0.0); + // Match update_camera_real's look-at height so the handoff does not + // pitch-jump when the play camera starts lerping. + let play_target = core_w + Vec3::new(0.0, 0.45, 0.0); let strip_mid = core_w + Vec3::new(0.0, 0.85, 0.0); let tilt = CAMERA_TILT_DEG.to_radians(); let ang = 0.10 + (tilt - 0.10) * pull; // Pull back to the dark-frame close default (material-dark-frame.md), so // the wake settles exactly on the opening close-up instead of the retired - // fit-to-content wide frame. + // fit-to-content wide frame. Look-at eases to play_target (chassis height), + // not the floor pad, so update_camera_real does not pitch-jump. let dist = 0.30 + (CLOSE_DIST - 0.30) * pull.powf(1.55); - let target = strip_mid.lerp(core_w, pull); + let target = strip_mid.lerp(play_target, pull); let eye = target + Vec3::new(0.0, ang.sin(), ang.cos()) * dist; *tf = Transform::from_translation(eye).looking_at(target, Vec3::Y); if done { wake.active = false; - // Hand the camera off near where the wake left it, on the new - // attention-close zoom scale (material-dark-frame.md). - mode.zoom = (dist / CLOSE_DIST).clamp(MIN_ZOOM, MAX_ZOOM); + // Settle on the default attention-close framing — not the wake's + // last pull distance converted into a far zoom multiplier. + mode.zoom = 1.0; mode.dirty = true; } } diff --git a/wiki/interface/material-dark-frame.md b/wiki/interface/material-dark-frame.md index e9c0a46d..58411836 100644 --- a/wiki/interface/material-dark-frame.md +++ b/wiki/interface/material-dark-frame.md @@ -30,13 +30,15 @@ Status note: captured 2026-07-09 from Cameron's screenshot feedback on units; fit-to-known-content is retired here (it governs the flat sensorium only) and the camera aims above the floor for a room-security-cam read. Zoom bounds retuned around the close default (MIN_ZOOM=0.5, - MAX_ZOOM=6.0). fog_audit_3d amended: material mode asserts blueprint / - remembered mass is absent, seen and owned-telemetry surfaces are lit. - [TUNE] values (exposure/ambient/pool falloff/close distance/zoom - clamp) recorded in wiki/log/2026-07-09-dark-frame.md with opening, - worklight pair, and zoom-bound screenshots. The map-zoom claim mark - stays the one [OPEN]: the proposed pool-alone default is what landed - (there is no ring at any zoom in the material frame yet). + MAX_ZOOM=6.0). The wake pull-back ends at CLOSE_DIST / zoom 1.0 and + matches the play look-at height so the handoff does not leap to the + retired god-view distance. fog_audit_3d amended: material mode asserts + blueprint / remembered mass is absent, seen and owned-telemetry + surfaces are lit. [TUNE] values (exposure/ambient/pool falloff/close + distance/zoom clamp) recorded in wiki/log/2026-07-09-dark-frame.md with + opening, worklight pair, and zoom-bound screenshots. The map-zoom claim + mark stays the one [OPEN]: the proposed pool-alone default is what + landed (there is no ring at any zoom in the material frame yet). Stage: B1 — The Basement Design: - wiki/art/visual-identity.md#visual-identity-clinical-gore @@ -160,12 +162,15 @@ if distance screenshots prove the pool illegible. After the wake (opening.md), the default material camera anchors to attention (the cursor, which opens on the host) at a **close** distance: the **presence beam** dominates the frame, the rest is dark. -No chassis, no room slab, no floor grid, no blueprint silhouette, no -ruled amber frame. Fit-to-known-content stays retired as the material -camera's default framing driver. Zooming out reveals more only where -earned light or Heard mass exists — never as a schematic. The -bevy-visual-floor rules still bind in spirit: the frame is deliberate, -and darkness is sensor/physical darkness, never a missing scene. +The wake's pull-back ends at that same distance and hands off at zoom +1.0 — it must not park the play camera at a far multiplier converted +from the old god-view endpoint. No chassis, no room slab, no floor +grid, no blueprint silhouette, no ruled amber frame. Fit-to-known- +content stays retired as the material camera's default framing driver. +Zooming out reveals more only where earned light or Heard mass exists +— never as a schematic. The bevy-visual-floor rules still bind in +spirit: the frame is deliberate, and darkness is sensor/physical +darkness, never a missing scene. Day-job stacks and mode clears still target the host: the beam *is* the machine for interaction until Seen wraps it into a chassis. diff --git a/wiki/log/2026-07-09-close-camera.md b/wiki/log/2026-07-09-close-camera.md index f46df81d..8fee4784 100644 --- a/wiki/log/2026-07-09-close-camera.md +++ b/wiki/log/2026-07-09-close-camera.md @@ -22,7 +22,10 @@ absence, dark rig, pools, work light) stays READY. `CLOSE_DIST * zoom`, look-at slightly above the floor (0.45) so the chassis fills the frame. - Initial material camera spawns at `CLOSE_DIST`, not 24. -- Wake handoff writes `dist / CLOSE_DIST` into the new zoom scale. +- Wake handoff initially wrote `dist / CLOSE_DIST` into the new zoom + scale — that preserved the old ~13-unit pull-back as zoom ≈ 5.1. + Fixed same day in [2026-07-09-wake-handoff-close.md](2026-07-09-wake-handoff-close.md): + pull ends at `CLOSE_DIST`, handoff is zoom 1.0. - Shot harness zooms retuned to the new scale. ## Evidence diff --git a/wiki/log/2026-07-09-wake-handoff-close.md b/wiki/log/2026-07-09-wake-handoff-close.md new file mode 100644 index 00000000..61263381 --- /dev/null +++ b/wiki/log/2026-07-09-wake-handoff-close.md @@ -0,0 +1,31 @@ +# 2026-07-09 — Wake handoff look-at matches the play camera + +``` +Type: log +``` + +## Intent + +After the attention-close material camera landed (`ffee805`), a fresh +run leaped far at the end of the wake: the path still eased to ~13 +world units and wrote `dist / CLOSE_DIST` as `mode.zoom ≈ 5.1`. The +dark-frame land (same day) already retuned the pull endpoint to +`CLOSE_DIST` and the handoff to zoom 1.0. A residual pitch-jump +remained: the wake looked at the floor pad while `update_camera_real` +aims at chassis height (0.45). + +## Changed (`src/bin/bevy.rs`) + +- Final look-at eases to `play_target` (core tile + 0.45), matching + the play camera, so the handoff does not pitch-jump. +- Distance endpoint and zoom 1.0 handoff already live from dark-frame; + confirmed still correct under rebase. + +## Spec impact + +`material-dark-frame.md` status note: wake pull-back ends at CLOSE_DIST +/ zoom 1.0 and matches the play look-at height. + +## Checks + +`./tools/check.sh` (frontend Bevy change). diff --git a/wiki/log/DEVLOG.md b/wiki/log/DEVLOG.md index 70062bf8..ac49cd0e 100644 --- a/wiki/log/DEVLOG.md +++ b/wiki/log/DEVLOG.md @@ -5,6 +5,15 @@ Type: log ``` Reverse chronological implementation notes. Keep this factual: what changed, why, checks, and spec impact. +## 2026-07-09 - Wake handoff look-at matches the play camera + +- Intent: dark-frame already ended the wake at CLOSE_DIST / zoom 1.0; + residual pitch-jump remained because look-at still eased to the floor + pad while update_camera_real aims at chassis height (0.45). +- Changed: wake final look-at eases to play_target (core + 0.45). +- Checks: ./tools/check.sh (frontend). +- Log: wiki/log/2026-07-09-wake-handoff-close.md. + ## 2026-07-09 - Opening floor is earned - Intent: Cameron caught rails and pads disclosing the room at the start.