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

6.1 KiB
Raw Permalink Blame History

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.