From 017270f7e688e07a19b44d2bc237b07a65c258b2 Mon Sep 17 00:00:00 2001 From: Cameron Date: Thu, 9 Jul 2026 21:39:09 -0700 Subject: [PATCH] Bank the exposure drift downwind MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The even halo read as decoration; dust reads as accumulation. The drift scatter now biases toward an airflow-shadow direction — fuller reach downwind, thinned upwind, slight center offset — still a pure deterministic function of the amount. Defense: a [TUNE] pass within the decided exposure form (mechanics/machine-work.md, amended with the uneven-settling note in this commit): density and spread still carry the amount, paused geometry still reads, no RNG or wall clock enters the renderer. --- src/bin/assets/rack.rs | 22 +++++++++++++++++++--- wiki/log/DEVLOG.md | 10 ++++++++++ wiki/mechanics/machine-work.md | 4 +++- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/bin/assets/rack.rs b/src/bin/assets/rack.rs index bc7da55..f1d534f 100644 --- a/src/bin/assets/rack.rs +++ b/src/bin/assets/rack.rs @@ -915,17 +915,33 @@ fn spawn_exposure_drift( let n = ((exposure * 16.0).ceil() as usize).min(140); let r0 = 0.52; let r1 = r0 + 0.16 * exposure.sqrt(); + // Dust settles unevenly: the drift banks downwind of the machine + // (an even halo reads as decoration, not accumulation). BIAS is + // the airflow-shadow direction; upwind flecks thin out and the + // downwind bank reaches further. + const BIAS: f32 = 0.7; // radians, toward front-right for i in 0..n { let theta = i as f32 * 2.399_963; // golden angle + let downwind = (theta - BIAS).cos(); + // Thin the upwind side: roughly two of three upwind flecks + // settle elsewhere. + if downwind < -0.25 && i % 3 != 0 { + continue; + } let frac = (i as f32 * 0.618_034) % 1.0; - let r = r0 + (r1 - r0) * frac.sqrt(); + let reach = 1.0 + 0.45 * downwind.max(0.0); + let r = (r0 + (r1 - r0) * frac.sqrt()) * reach; let (sx, sz) = (theta.cos(), theta.sin() * 0.85); let s = if i % 3 == 0 { 0.030 } else { 0.018 }; commands.spawn(( Mesh3d(meshes.add(Cuboid::new(s, 0.008, s * 0.8))), MeshMaterial3d(fleck.clone()), - Transform::from_translation(Vec3::new(r * sx, 0.006, r * sz)) - .with_rotation(Quat::from_rotation_y(i as f32 * 1.7)), + Transform::from_translation(Vec3::new( + r * sx + 0.06 * BIAS.cos(), + 0.006, + r * sz + 0.05 * BIAS.sin(), + )) + .with_rotation(Quat::from_rotation_y(i as f32 * 1.7)), ChildOf(root), )); } diff --git a/wiki/log/DEVLOG.md b/wiki/log/DEVLOG.md index 20d4d34..94d8589 100644 --- a/wiki/log/DEVLOG.md +++ b/wiki/log/DEVLOG.md @@ -5,6 +5,16 @@ Type: log ``` Reverse chronological implementation notes. Keep this factual: what changed, why, checks, and spec impact. +## 2026-07-09 - Exposure drift banks downwind + +- Intent: the even drift halo read as decoration; dust should read as + accumulation. +- Changed: the drift scatter biases downwind (fuller reach, thinned + upwind side, slight center offset), deterministic as before; + machine-work exposure bullet notes the uneven settling ([TUNE] bias). +- Checks: full ./tools/check.sh; exposure board recapture. +- Log: entry only (small [TUNE] pass on the decided form). + ## 2026-07-09 - Exposure decided: particulate residue + footprint trails - Intent: close the exposure half of issue #1 — Cameron rejected the diff --git a/wiki/mechanics/machine-work.md b/wiki/mechanics/machine-work.md index 147756a..f004896 100644 --- a/wiki/mechanics/machine-work.md +++ b/wiki/mechanics/machine-work.md @@ -310,7 +310,9 @@ that can ride wires; exposure is contamination that cannot. The family kit is: exposure is dust"). Working machines shed faint crimson motes that settle into a **stippled drift** of fine angular flecks at the floor/base outside the amber ownership ring; density and spread are the amount, so a paused - frame carries the read. It absorbs light rather than emitting it — the one + frame carries the read. The drift settles unevenly — banked downwind, thin + upwind — so it reads as accumulation, never a decorative halo (bias + direction and thinning are [TUNE]). It absorbs light rather than emitting it — the one near-unlit material in a world of signals. Its physics and carrier roles stand: pulled by concealment wells (a vacuum draw on the dust), transfers onto people as attention, and materializes at the Office as filings -- 2.51.2