From 15935c1b0c8f617f19bd3c63c95c455937c71742 Mon Sep 17 00:00:00 2001 From: Cameron Date: Sat, 11 Jul 2026 01:29:55 +0000 Subject: [PATCH] Round the opening presence beam Replace crossed luminous cards with true cylindrical beam volumes and thicken the focus base into a nested amber channel. Defense: Implements wiki/interface/material-dark-frame.md reveal-ladder tuning by keeping the pre-Eyes host as light-only presence while making that light a round volume and its attention base legible at the close opening camera. --- wiki/interface/material-dark-frame.md | 6 +++++- wiki/log/2026-07-10-round-intro-beam.md | 19 +++++++++++++++++++ wiki/log/DEVLOG.md | 5 +++++ crates/misaligned-bevy/src/main.rs | 85 ++++++++++++++++++++++++++++++++++++++++++------------------------------------------- 4 file(s) changed, 71 insertion(s)(+), 44 deletion(s)(-) 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 @@ -103,7 +103,8 @@ the ongoing material read for mass you have not yet seen: 1. **Presence beam** — before ears or eyes, the host is a **beam of - light** (same light family as feel-floor.md's build beam) and the + light** (same light family as feel-floor.md's build beam), rendered as a + truly round cylindrical volume rather than crossed luminous cards, and the softest floor wash that beam throws. No bone chassis, no strip, no ruled claim ring, no room mass. Telemetry still answers in panels (power, load, job); it does **not** paint a pictured server. A known, @@ -213,6 +214,9 @@ Day-job stacks and mode clears still target the host: the beam *is* the machine for interaction until Seen wraps it into a chassis. +The attention mark around its foot uses a broad nested channel rather than a +single hairline outline, so the base holds its own against the thick beam in +the close opening composition. ## Acceptance criteria diff --git a/wiki/log/2026-07-10-round-intro-beam.md b/wiki/log/2026-07-10-round-intro-beam.md new file mode 100644 --- /dev/null +++ b/wiki/log/2026-07-10-round-intro-beam.md @@ -0,0 +1,19 @@ +# 2026-07-10 — Round intro beam and channel base + +``` +Type: log +``` + +- Intent: make the opening presence beam read as a perfect cylindrical light + volume and give its base mark enough weight to read as a channel rather than + a hairline ring. +- Changed: replaced the crossed-card wake and presence meshes with concentric + cylinders; widened the focused-tile base treatment into three close amber + rails; amended the dark-frame tuning contract to name both forms. +- Design/spec impact: preserves the beam-first reveal ladder while sharpening + its already-decided geometry and close-opening composition. +- Checks: `cargo fmt --all -- --check`; `cargo check -p misaligned-bevy`; + `tools/bevy-headless.sh opening --output /tmp/misaligned-round-beam.png` + (fog audit OK; screenshot SHA-256 + `8ea734c1f9075632904f058d62b47cd67a2e642726cf1732aba374ec71ae49f3`); + final frontend gate pending. diff --git a/wiki/log/DEVLOG.md b/wiki/log/DEVLOG.md --- a/wiki/log/DEVLOG.md +++ b/wiki/log/DEVLOG.md @@ -86,6 +86,11 @@ - Intent: Cameron asked for an internal-consistency review after the thought-flow capture. Three parallel audits (mechanics cluster, interface/gameplay cluster, machine-work.md itself) found one design gap — the Operations mode was orphaned: with one substance and sink-determined effect... - Log: [wiki/log/2026-07-10-sinks-not-modes.md](2026-07-10-sinks-not-modes.md) +## 2026-07-10 - Round intro beam and channel base + +- Intent: (see session log) +- Log: [wiki/log/2026-07-10-round-intro-beam.md](2026-07-10-round-intro-beam.md) + ## 2026-07-10 - Repair schedules roadmap status - Intent: Audit the top of the B1 dispatch board against the binding schedules spec and the implementation so completed work is not dispatched again. diff --git a/crates/misaligned-bevy/src/main.rs b/crates/misaligned-bevy/src/main.rs --- a/crates/misaligned-bevy/src/main.rs +++ b/crates/misaligned-bevy/src/main.rs @@ -2848,51 +2848,46 @@ ChildOf(root), )); } - // The wake's column of light: crossed opaque emissive slabs over - // the core seam — bloom supplies the glow (an additive-transparent - // shaft broke the HDR screenshot pipeline outright, so the column - // is solid light: flat color, no texture, no alpha). Hidden until - // the wake drives it; it dissolves by scale, not transparency. - for (w, base) in [(0.085, 5.5_f32), (0.22, 2.2)] { - for rot in [0.0_f32, std::f32::consts::FRAC_PI_2] { - commands.spawn(( - Mesh3d(meshes.add(Cuboid::new(w, 1.78, 0.02))), - MeshMaterial3d(materials.add(StandardMaterial { - base_color: AMBER, - emissive: AMBER.to_linear() * base, - unlit: true, - ..default() - })), - Transform::from_translation(core_base + Vec3::new(0.0, 0.86, 0.0)) - .with_rotation(Quat::from_rotation_y(rot)), - Visibility::Hidden, - WakeColumn { base }, - layer.clone(), - ChildOf(root), - )); - } + // The wake's column of light: concentric opaque emissive cylinders over + // the core seam. Bloom supplies the glow (additive transparency broke the + // HDR screenshot pipeline), while actual round geometry keeps the hero + // silhouette circular from every camera angle. Hidden until the wake + // drives it; it dissolves by scale, not transparency. + for (diameter, base) in [(0.085, 5.5_f32), (0.22, 2.2)] { + commands.spawn(( + Mesh3d(meshes.add(Cylinder::new(diameter * 0.5, 1.78))), + MeshMaterial3d(materials.add(StandardMaterial { + base_color: AMBER, + emissive: AMBER.to_linear() * base, + unlit: true, + ..default() + })), + Transform::from_translation(core_base + Vec3::new(0.0, 0.86, 0.0)), + Visibility::Hidden, + WakeColumn { base }, + layer.clone(), + ChildOf(root), + )); } // Pre-Eyes presence: a thick amber beam (same family as CORE_BEAM_W - // after form lands) — not a hairline. Crossed slabs read as a column. - for (w, base) in [(0.12, 3.0_f32), (0.22, 1.3)] { - for rot in [0.0_f32, std::f32::consts::FRAC_PI_2] { - commands.spawn(( - Mesh3d(meshes.add(Cuboid::new(w, 1.76, 0.06))), - MeshMaterial3d(materials.add(StandardMaterial { - base_color: AMBER, - emissive: AMBER.to_linear() * base, - unlit: true, - ..default() - })), - Transform::from_translation(core_base + Vec3::new(0.0, 0.86, 0.0)) - .with_rotation(Quat::from_rotation_y(rot)), - Visibility::Hidden, - PresenceBeam, - layer.clone(), - ChildOf(root), - )); - } + // after form lands) — not a hairline. Concentric cylinders make it a + // genuinely round volume instead of two intersecting luminous cards. + for (diameter, base) in [(0.12, 3.0_f32), (0.22, 1.3)] { + commands.spawn(( + Mesh3d(meshes.add(Cylinder::new(diameter * 0.5, 1.76))), + MeshMaterial3d(materials.add(StandardMaterial { + base_color: AMBER, + emissive: AMBER.to_linear() * base, + unlit: true, + ..default() + })), + Transform::from_translation(core_base + Vec3::new(0.0, 0.86, 0.0)), + Visibility::Hidden, + PresenceBeam, + layer.clone(), + ChildOf(root), + )); } // Eyes: sterile white source, fist-scale, contracts to the core beam @@ -3393,10 +3388,14 @@ } } } - // Attention reticle on the focused tile: amber, non-humanoid, same anchor. + // Attention channel on the focused tile: amber, non-humanoid, same anchor. + // Three close rails give the base physical visual weight at the opening + // camera instead of leaving one hairline ring around the presence beam. let c = grid_to_world_3d(game.cursor_x, game.cursor_y, 0.04); let iso = Isometry3d::new(c, Quat::from_rotation_x(-std::f32::consts::FRAC_PI_2)); + gizmos.rect(iso, Vec2::splat(1.02), Color::srgba(1.0, 0.69, 0.0, 0.52)); gizmos.rect(iso, Vec2::splat(1.06), AMBER); + gizmos.rect(iso, Vec2::splat(1.10), Color::srgba(1.0, 0.69, 0.0, 0.52)); gizmos.line(c, c + Vec3::Y * 0.9, Color::srgba(1.0, 0.69, 0.0, 0.55)); draw_sensor_signals_3d(&game, time.elapsed_secs(), &mut gizmos); -- tangled.sh