TURNCRAFT/docs/briefs/GLOWUP_ART.md
jing b65103ea0e Briefs: Headshell Workshop (cartridge assembly) + Glow-Up art pass
Fresh-eyes review outcomes as two parallel-safe Opus briefs:
- WORKSHOP_CARTRIDGE.md: the stylus node becomes a five-stage cartridge
  assembly - seat/rotate the cart, crimp four color-coded wires onto
  stubborn pins (catenary carry, continuity lamp), torque screws evenly
  (tilt = azimuth error), balance the counterweight while RIDING the
  seesawing tonearm, then a needle-drop test where every mistake is
  audible + drawn on a diegetic scope. Multiplayer-shared state.
- GLOWUP_ART.md: atlas v2 (32px, tile variants), selective LED bloom,
  screen-print decals + party flyers, mixer-face density, PCB pagodas.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 11:24:29 +10:00

112 lines
6.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# BRIEF — The Glow-Up (art & atmosphere pass)
*Fresh-eyes verdict: the bones are great, the surfaces are underdressed.
This pass closes the gap to the concept art. Pure art/atmosphere — no
gameplay logic — so it can run in parallel with WORKSHOP_CARTRIDGE.md.*
**For one Opus 4.8 session.** Read `docs/CONTRACTS.md`,
`docs/INTEGRATION_NOTES.md`, `src/engine/atlas.ts`, `src/engine/renderer.ts`,
`src/worldgen/buildBooth.ts`, `src/fx/` first.
**You own:** `src/engine/atlas.ts`, `src/engine/renderer.ts`,
`src/worldgen/**` (dressing additions), `src/fx/**` (decals module),
`src/ui/Menu.ts` (one settings row). **Merge point with the workshop
brief:** `src/main.ts` and `src/worldgen/buildBooth.ts` — keep your edits
small and additive there. Do not touch `src/machines/**`, `src/interact/**`,
`src/audio/**`, `src/net/**`, `server/**`.
## Findings this brief fixes (from the review, with screenshots taken)
1. **Mixer face is an empty black plain** — knob clusters are specks on a
82×95 desert; real DJMs are dense. No screen-print labels anywhere.
2. **PCB Depths read as green wallpaper** — one tile repeated makes
astroturf, not circuitry; caverns lack vertical interest.
3. **Textures are flat at 16px** — brushed_alu reads as concrete speckle
up close; vinyl tiers are matte plastic; no tile variation anywhere.
4. **LEDs don't bloom** — emissive blocks read as flat colored squares;
the concept art's glow is absent.
5. Fader alleys/vents are void-black slots with no depth cues.
## Tasks
### G1. Atlas v2 (engine/atlas.ts)
- Tiles 16→**32 px**, and give patterns **per-block-position variation**:
hash (x,y,z) → one of up to 4 painted variants per pattern (requires
the mesher's UV path to pick a variant — if that's invasive, an
acceptable fallback is 4 variants painted for `pcb` only, chosen by a
world-position hash in the shader patch; document your choice).
- Pattern quality: `brushed` = long directional strokes (not noise);
`grooves` = concentric arcs with a subtle specular line; `pcb` = 34
variants that visually tile into routed traces + via dots + silkscreen
flecks; `plywood` = longer wavy grain, end-grain variant for `ply_edge`.
- Keep `NearestFilter` chunkiness — sharper *pattern*, same voxel soul.
- Material feel: give the two chunk materials a slightly higher
`envMapIntensity`-free polish via roughness tuning only (no env maps).
### G2. Bloom (engine/renderer.ts + main.ts + Menu)
- Selective bloom for emissive: `EffectComposer` + `UnrealBloomPass`
(three/examples), threshold tuned so ONLY LEDs/strobe/lamps bloom
(~strength 0.55, radius 0.4). This is the single biggest step toward
the concept art.
- Gate on quality: add a `bloom` boolean to Settings (default on;
auto-off when quality = 'fast'). `createRenderer` returns a `render()`
that internally uses the composer when enabled — main.ts keeps calling
`render()` unchanged apart from passing the setting through.
- Budget: ≥ 100 fps must survive on the current test machine; measure
before/after and record numbers in your handoff.
### G3. Screen-print decal system (fx/decals.ts + worldgen anchors)
- A tiny module that bakes text/markings onto canvas textures applied as
thin plane meshes (0.05 proud, `polygonOffset` to avoid z-fight).
- Print set (all positions derived from LAYOUT/anchors):
- Mixer face: `CH 14` under each fader alley, tick marks along alleys,
`TURNCRAFT-800` model text at the top edge, crossfader `A ↔ B`.
- Decks: `START·STOP`, `33` `45` beside buttons, pitch `+/` scale,
Technics-style script line on the plinth rear ("Quartz Direct Drive").
- Patch bay: tiny socket numbers. Fuse box: `FUSE 250V`.
- Booth walls: 34 procedural **party flyers** (canvas typography:
random gig names from a word bank, big condensed type, one accent
color each) pasted like posters near the patch bay and front lip.
- Keep total decal draw calls < 25 (merge planes per gear piece where easy).
### G4. Worldgen density pass (buildBooth.ts — additive only)
- **Mixer face**: mushroom knob caps (2×2 cap on 1×1 stem, mixed heights)
replacing the flat single-voxel caps; double the knob rows per channel
strip (EQ + trim + filter row); 1-voxel panel seam grooves (matte_black
rubber lines) sectioning the face; LED pips beside each alley.
- **PCB Depths**: IC-chip **pagoda buildings** (matte_black slabs on
solder pin-legs you can walk under, 23 sizes, a few stacked), ribbon
cable walls (alternating cable_black/cable_white columns), more copper
trace inlays connecting features, sparse led_green "status" pips near
ICs (they pulse post-win via existing emissive boost free).
- **Fader alleys/vents**: a dim led_amber pip at the bottom of each alley
and inside vent mouths so dark slots read as *deep*, not void.
- Keep `buildBooth` deterministic (same seed), build time < 800 ms, and
do NOT move any LAYOUT/QUEST_POS anchor (machines depend on them).
### G5. Record material moment
- The vinyl tier sides get a subtle groove-sheen: a fine repeating
light/dark ring texture on the tier side cylinders (machines/platter.ts
is workshop-owned instead provide the improved texture via
`blockMaterial`'s existing tint path or hand the workshop session a
`recordSideTexture()` in `src/fx/decals.ts` and note it in your handoff
for them to wire do not edit platter.ts yourself).
## Acceptance
- [ ] Before/after screenshots of: mixer face, PCB depths, deck top,
full-booth win state (use `window.TURNCRAFT_CINE`)
- [ ] Bloom on LEDs only (plywood must NOT glow), toggleable, fps 100
measured and recorded
- [ ] All decals legible at play distance, no z-fighting while circling
- [ ] buildBooth deterministic, anchors untouched (grep QUEST_POS usage),
build < 800 ms, chunk meshes < 600
- [ ] `npm run typecheck` clean, zero console errors, live smoke of the
full quest still passes (don't break the game for prettiness)
- [ ] Handoff note listing every file touched + the two merge points
## Out of scope
Mobs/critters, mobile UI, new blocks (atlas is at 31/32 ids variants
must come from painting, not new ids), any machines/audio/net code.