# 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` = 3–4 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 1–4` 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: 3–4 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, 2–3 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.