feat: polish nightdrive road sun and signage
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# Portfolio visual QA
|
||||
|
||||
Status date: 2026-09-02
|
||||
Status date: 2026-09-03
|
||||
|
||||
## Automated capture contract
|
||||
|
||||
@@ -81,14 +81,42 @@ The refreshed authenticated 1440×900 High-tier allocation trace passed at devic
|
||||
|
||||
The final ownership split remains deliberate. Blender should continue to own only the finite car because silhouette, bevels, clean normals, wheel forms, material groups, and LOD/export discipline justify authored geometry. Terrain, road, sky, horizon banks, distant silhouettes, roadside anchors, sun, stars, streaks, signs, camera, palette, and scroll response should stay in Three.js because they depend on infinite wrapping, dynamic text, responsive framing, reversible route state, and performance-tier control. The added depth layers strengthen that conclusion: their deterministic instancing, chapter coupling, and FOV-safe screen/world-space behavior would become less flexible as baked GLB scenery, while the measured geometry increase is only 2,996 bytes. No additional Blender export is justified.
|
||||
|
||||
## Nightdrive cohesion continuation
|
||||
|
||||
The 2026-09-03 cohesion pass is retained under `docs/reviews/evidence/nightdrive-iteration/cohesion-pass/`. Its `before/` directory preserves the five opening families captured before this pass; `final/` contains the corresponding 390×844, 844×390, 768×1024, 1440×900, and 2560×1440 openings plus dedicated cruise/acceleration horizons, opening/later-chapter suns, acceleration/release/coast particles, three reverse-scroll frames, sign approach/readable/departure/reconciliation states, Static and reduced-motion states, and empty browser-error logs. The supplementary later-chapter sun frame keeps the focal point unobstructed, while the first later-chapter frame proves that it remains subordinate when content crosses it.
|
||||
|
||||
The investigation found four shared causes rather than unrelated tuning defects. First, the road, terrain, and atmospheric layers received a monotonic distance value but multiplied the accumulated phase by the current speed, so easing back toward cruise could make the computed phase decrease. Second, road and terrain geometry ended at the same `z = -410` plane, where opaque black distance fades formed a visible cap; the sun was also in front of the silhouette stack, preventing atmospheric occlusion. Third, sign lifecycle state and sign pose were split: reverse input could cancel a readable approach, target changes could cut short the 1,400ms dwell, departure assumed the dwell pose even when it began during approach, and resize immediately replaced live poses. Fourth, the original sign face used non-normalized shape UVs and then sat behind its replacement housing, which explained the blank/soft face independently of lifecycle behavior.
|
||||
|
||||
The world now has one 794-unit depth contract (`z = 34` through `z = -760`) and one linear 330–705 fog interval shared by native materials and analytic shaders. Road and terrain extend through that envelope, converge through the same fog and horizon light, and no longer use an opaque black endpoint. Asphalt combines low-amplitude broad and fine deterministic variation with longitudinal wear, shoulder breakup, and restrained atmospheric pickup. Lane and shoulder contrast fade into the same horizon instead of disappearing at a separate boundary. The five final viewport captures and both 66° cruise/79° acceleration captures show no finite mesh edge, black cap, floating road, shoulder seam, or exposed camera angle.
|
||||
|
||||
The sun is now a layered shader focal point at `z = -720`, with broad and fine internal variation, a shaded limb, restrained scan bands, a muted halo, and a separate horizon-light bleed. Distant silhouettes at `z = -675` write depth and partially occlude the disc; terrain edges, road pickup, fog, and chapter warmth use the same palette response. Opening and later-chapter evidence shows the richer disc without clipped edges, broad bloom, flare sprites, or content-competing saturation.
|
||||
|
||||
The sign remains runtime-authored Three.js geometry. A clipped beveled housing, backplate, bracket, brace, narrow supports, and planted footing supply finite construction detail, while the 1024×288 mipmapped canvas face keeps chapter text sharp and runtime-owned. Cyan is limited to a small practical corner marker and amber to the route accent. The controller keeps one canonical target, lets concealed signs retarget immediately, preserves visible labels, defers stale departure until the minimum dwell expires, coalesces jumps, and starts departure from the actual current pose. Visible viewport changes are deferred until concealment, avoiding teleportation or revival. Focused browser evidence and `sign-lifecycle-trace.json` record only `Profile` through a forced multi-section jump (`staleLabelMutated: false`). Another Blender asset was not justified: the sign's dynamic text, lifecycle, responsive pose, and quality-tier behavior benefit more from stable runtime geometry than from a baked GLB.
|
||||
|
||||
`travel-distance.ts` is now the only physical travel-phase owner. It advances from elapsed time, maintains an 18-unit-per-second forward cruise floor, adds filtered speed/energy response, caps delayed-frame contribution, and never subtracts document deltas. Road, terrain, streaks, anchors, and other travel uniforms consume that direct phase; scroll direction is still available to non-diegetic anticipation but cannot reverse the world. `forward-motion-trace.json` sampled six live WebGL distance uniforms 74 times while document scroll reversed from 1,800px to 1,280px. Every uniform remained monotonic, advanced through acceleration, release, coast, and reverse scroll, and had a positive minimum observed delta of approximately 2.772 units. Streak visibility is proportional and fades through release; deterministic jitter keeps anchor recycling outside conspicuous regions and avoids synchronized rows. The existing lateral waves were not changed.
|
||||
|
||||
Fresh verification produced these results:
|
||||
|
||||
- Type checking passed.
|
||||
- The complete unit/build gate passed 43 files and 525 tests; the focused world, sign-controller, and drive-controller run passed 64 tests in 3 files.
|
||||
- The complete four-worker browser matrix reported 172 passed checks, 43 deliberate skips, and one existing desktop heading-focus geometry timeout. That exact check passed unchanged in 2.9 seconds with one worker. The newly added sign/navigation cases passed unchanged in both desktop and mobile projects with one worker.
|
||||
- Deployment verification passed 9 tests in 3 files. Its first sandboxed attempt could not bind its local HTTP fixture (`EPERM`); the unchanged test passed when rerun with the required local-network permission.
|
||||
- The authenticated High-tier runtime budget passed with no violations at 1440×900, device DPR 2, and renderer ratio 1.5. It measured 748,476 geometry bytes, 1,589,248 texture bytes, 161,344,784 render-target bytes, a 33,554,432-byte non-render-target allowance, and 197,236,940 total accounted bytes. Peak scene-image concurrency was 1 and video concurrency was 0.
|
||||
- Transfer verification passed with a 222,464-byte Brotli-accounted first-live-scene payload. The environment chunk measured 699,501 raw / 145,875 Brotli bytes, application JavaScript 79,894 transfer bytes, and the unchanged authored car GLB 410,408 raw / 76,589 transfer bytes.
|
||||
- Browser console capture remained empty in both recorded checks. Static, reduced motion, WebGL failure/fallback, accessibility/keyboard, responsive, and flash-safety cases are included among the passing browser checks.
|
||||
- `git diff --check` passed.
|
||||
|
||||
The unchanged 20-second interaction harness still does not yield a valid long trace on this host, so no interaction latency or frame-cadence result is claimed. Its independent mobile-low run loaded content under the prescribed throttle but stayed in `data-scene-state="loading"` beyond the fixed five-second scene-ready window. Its independent desktop-high run again reached the Toolkit CDP action but exceeded the fixed 75-second test timeout, matching the previously documented host behavior. Neither assertion or budget was weakened. The authenticated allocation trace, deterministic live-uniform trace, responsive screenshots, and browser assertions are the measured evidence for this pass; physical-browser, cross-engine, and audience checks remain outstanding below.
|
||||
|
||||
## Direction review checklist
|
||||
|
||||
- [x] Information uses near-black opaque panels rather than neon glass.
|
||||
- [x] Cyan and amber remain accents; content does not use glow or scanlines.
|
||||
- [x] Scene stays decorative and excluded from the accessibility tree.
|
||||
- [x] Clip-space sky and horizon banks cover portrait through ultrawide at both 66° and 79° FOV without a finite-plane seam.
|
||||
- [x] Road, terrain, anchors, and streaks consume one monotonically advancing travel phase and continue through reverse document input and coast.
|
||||
- [x] Road flow, camera, streaks, bloom, and suspension use independent persistent response curves and settle through a visible coast.
|
||||
- [x] Readable stale signs depart cleanly; concealed candidates may retarget; multi-section jumps do not queue stale labels.
|
||||
- [x] Readable stale signs preserve their clock-driven dwell and depart from their live pose; concealed candidates may retarget; multi-section jumps do not queue or mutate stale labels.
|
||||
- [x] The desktop road corridor and alternating panels preserve the chase composition.
|
||||
- [x] Mobile becomes a readable single column and keeps the world subordinate.
|
||||
- [x] The original car is Blender-authored; the infinite road/world remain procedural Three.js and are not AI-generated project artwork.
|
||||
|
||||
Reference in New Issue
Block a user