diff --git a/src/bin/assets/rack.rs b/src/bin/assets/rack.rs index f1d534f..4d50843 100644 --- a/src/bin/assets/rack.rs +++ b/src/bin/assets/rack.rs @@ -211,17 +211,21 @@ pub fn spawn_server_rack( parent: Option, ) -> Entity { let (tower_color, fold_color) = chassis_palette(state.owned()); + // Matte pass (2026-07-09): clinical surfaces are chalk, not + // lacquer — high roughness, no metal, specular nearly off. let tower = materials.add(StandardMaterial { base_color: tower_color, - perceptual_roughness: 0.55, - metallic: 0.06, + perceptual_roughness: 0.85, + metallic: 0.0, + reflectance: 0.06, emissive: wash_emissive(state, style), ..default() }); let fold = materials.add(StandardMaterial { base_color: fold_color, - perceptual_roughness: 0.60, - metallic: 0.06, + perceptual_roughness: 0.88, + metallic: 0.0, + reflectance: 0.06, emissive: wash_emissive(state, style), ..default() }); @@ -407,9 +411,10 @@ pub fn spawn_server_rack( if state == RackState::Core { let spine = materials.add(StandardMaterial { base_color: AMBER, - emissive: AMBER.to_linear() * 5.0, - perceptual_roughness: 0.30, - metallic: 0.08, + emissive: AMBER.to_linear() * 2.6, + perceptual_roughness: 0.55, + metallic: 0.0, + reflectance: 0.06, ..default() }); for x in [-(half_w - 0.025), half_w - 0.025] { @@ -429,15 +434,16 @@ pub fn spawn_server_rack( // albedo no longer does. if style == ClaimStyle::Ring && state.owned() { let glow = match state { - RackState::Core => AMBER.to_linear() * 4.0, - RackState::Busy => AMBER.to_linear() * 2.4, - _ => AMBER.to_linear() * 1.4, + RackState::Core => AMBER.to_linear() * 2.4, + RackState::Busy => AMBER.to_linear() * 1.7, + _ => AMBER.to_linear() * 1.1, }; let ring = materials.add(StandardMaterial { base_color: AMBER_DIM, emissive: glow, - perceptual_roughness: 0.40, - metallic: 0.05, + perceptual_roughness: 0.60, + metallic: 0.0, + reflectance: 0.06, ..default() }); spawn_floor_frame( @@ -513,7 +519,7 @@ fn strip_material(state: RackState, mode: RackMode) -> StandardMaterial { ..default() }, RackState::Foreign => lit(scaled(SIGNAL, 0.45), SIGNAL.to_linear() * 0.8), - RackState::Core => lit(AMBER, AMBER.to_linear() * 2.8), + RackState::Core => lit(AMBER, AMBER.to_linear() * 1.9), RackState::Idle | RackState::Busy => match mode { RackMode::DayJob => lit(SIGNAL, SIGNAL.to_linear() * 1.6), RackMode::Research => lit(BONE, BONE.to_linear() * 1.4), @@ -528,7 +534,7 @@ fn strip_material(state: RackState, mode: RackMode) -> StandardMaterial { /// bar. Same hue family always — the fill never recolors the mode. fn strip_fill_material(state: RackState, mode: RackMode) -> StandardMaterial { let mut m = strip_material(state, mode); - m.emissive *= if state == RackState::Core { 1.9 } else { 2.6 }; + m.emissive *= if state == RackState::Core { 1.5 } else { 2.2 }; m } @@ -633,8 +639,9 @@ pub fn spawn_switch_chassis( let (tower_color, _) = chassis_palette(state.owned()); let slab = materials.add(StandardMaterial { base_color: tower_color, - perceptual_roughness: 0.55, - metallic: 0.06, + perceptual_roughness: 0.85, + metallic: 0.0, + reflectance: 0.06, ..default() }); let channel = materials.add(StandardMaterial { @@ -715,9 +722,10 @@ pub fn spawn_switch_chassis( if style == ClaimStyle::Ring && state.owned() { let ring = materials.add(StandardMaterial { base_color: AMBER_DIM, - emissive: AMBER.to_linear() * 1.4, - perceptual_roughness: 0.40, - metallic: 0.05, + emissive: AMBER.to_linear() * 1.1, + perceptual_roughness: 0.60, + metallic: 0.0, + reflectance: 0.06, ..default() }); spawn_floor_frame(commands, meshes, ring, root, 0.66, 0.40, 0.04, 0.05); @@ -789,15 +797,17 @@ pub fn spawn_token_anchors( // light — data in a box — not a lamp. let cube_core = materials.add(StandardMaterial { base_color: SIGNAL, - emissive: SIGNAL.to_linear() * 2.4, - perceptual_roughness: 0.25, - metallic: 0.05, + emissive: SIGNAL.to_linear() * 1.5, + perceptual_roughness: 0.45, + metallic: 0.0, + reflectance: 0.06, ..default() }); let cube_shell = materials.add(StandardMaterial { base_color: scaled(GUNMETAL_DARK, 0.6), - perceptual_roughness: 0.35, - metallic: 0.30, + perceptual_roughness: 0.70, + metallic: 0.0, + reflectance: 0.06, ..default() }); let x = -(half_w + 0.17); @@ -843,9 +853,10 @@ pub fn spawn_token_anchors( if knowledge > 0.05 { let mercury = materials.add(StandardMaterial { base_color: scaled(BONE, 1.05), - emissive: BONE.to_linear() * 0.55, - perceptual_roughness: 0.22, + emissive: BONE.to_linear() * 0.40, + perceptual_roughness: 0.38, metallic: 0.0, + reflectance: 0.10, ..default() }); let x = half_w + 0.19; diff --git a/src/bin/bevy.rs b/src/bin/bevy.rs index 284db81..07cfc00 100644 --- a/src/bin/bevy.rs +++ b/src/bin/bevy.rs @@ -1681,9 +1681,10 @@ fn spawn_claim_ring( ) { let ring = materials.add(StandardMaterial { base_color: AMBER_DIM, - emissive: AMBER.to_linear() * if core { 4.0 } else { 1.8 }, - perceptual_roughness: 0.40, - metallic: 0.05, + emissive: AMBER.to_linear() * if core { 2.4 } else { 1.3 }, + perceptual_roughness: 0.60, + metallic: 0.0, + reflectance: 0.06, ..default() }); let ring_root = commands @@ -2155,8 +2156,8 @@ fn setup_3d( commands.spawn(( PointLight { color: AMBER, - intensity: 160_000.0, - range: 4.0, + intensity: 70_000.0, + range: 3.2, shadows_enabled: false, ..default() }, diff --git a/wiki/interface/computer-visual-language.md b/wiki/interface/computer-visual-language.md index ec98811..ff3949e 100644 --- a/wiki/interface/computer-visual-language.md +++ b/wiki/interface/computer-visual-language.md @@ -189,4 +189,10 @@ to the map-zoom and mixed-tile read; the two channels agree everywhere [TUNE] at implementation time: emissive multipliers per state, the per-mode strip colors/patterns (dash and dot counts), the load-fill brightness factor, blink rate/phase, chassis white point (bone vs -porcelain), and ring inset and thickness. +porcelain), and ring inset and thickness. Matte calibration +(2026-07-09, Cameron: "more matte"): chassis surfaces are chalk, not +lacquer — high roughness, zero metallic, specular reflectance ~0.06 — +and all amber emissives (core strip/fill/spines, claim rings, the +core's lamp) sit low enough that the core never clips to white under +the HDR bloom camera; the tower must stay readable geometry, not a +flare. diff --git a/wiki/log/DEVLOG.md b/wiki/log/DEVLOG.md index 94d8589..93e553c 100644 --- a/wiki/log/DEVLOG.md +++ b/wiki/log/DEVLOG.md @@ -5,6 +5,19 @@ Type: log ``` Reverse chronological implementation notes. Keep this factual: what changed, why, checks, and spec impact. +## 2026-07-09 - Matte pass: chalk surfaces, no blowout + +- Intent: Cameron flagged the core render as too bright/shiny; the + clinical look wants matte. +- Changed: chassis/cube/mercury/ring/spine materials across the shared + library go matte (roughness up, metallic 0, reflectance ~0.06); + core strip/fill/spine and ring emissives lowered; the core's amber + lamp halved to a tight pool — the core now reads as geometry, not a + flare, under HDR bloom. Calibration recorded in the spec's [TUNE] + paragraph. +- Checks: full ./tools/check.sh; game tokens shot + tester lineup. +- Log: entry only (visual [TUNE] pass). + ## 2026-07-09 - Exposure drift banks downwind - Intent: the even drift halo read as decoration; dust should read as