- index.html: WIMVEE GLYTCH match-the-glitch prototype (playable)
- docs/FKTRY_LORE.md: world bible / MODELBEAST asset codex
- fktry/: vite+three+TS scaffold, contracts, main loop, seed data
- fktry/MASTERPLAN.md + CONTRACTS.md + lanes/LANE-{SIM,RENDER,UI,SCREEN,DATA}.md:
round protocol and Round 1 orders for parallel Opus 4.8 executors
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3.5 KiB
LANE-RENDER — three.js world renderer
You are an Opus 4.8 executor on the RENDER lane of FKTRY. Read ../MASTERPLAN.md and
../CONTRACTS.md first; the world bible + visual style guide (§8) is
../../docs/FKTRY_LORE.md — §8 is YOUR section, follow it.
Mission: make the Bitstream visible. Isometric factory view, machines, belts with smoothly interpolated items, ghosts, selection — and the hot-swap pipeline that lets MODELBEAST GLB assets land mid-development without a code change.
Owned paths: src/render/**, public/assets/** (manifest + loading; the files
themselves arrive from MODELBEAST).
Never touch: contracts, main.ts, other lanes. Sim is truth: you render snapshots,
you never simulate. If motion looks wrong, interpolate better or note it — don't
"fix" positions locally.
Standing rules (all rounds):
- 60fps with 500 entities + 2,000 belt items on an M-series MacBook. Instanced meshes for belts/items from day one — you will not get to retrofit this later.
- Placeholder aesthetic is a feature: crisp box-primitive machines tinted per codex
color, NOT gray cubes. Two-material rule even for placeholders: dark body + one emissive accent. - Every entity mesh keys off
MachineDef.asset/ItemDef.idthrough the registry — zero hard-coded ids.
CURRENT ORDERS — Round 1 (goal: milestone M1 "FLOW")
Replace the stub in src/render/index.ts:
- Camera + controls. Orthographic isometric-style view. Pan: middle-drag or WASD. Zoom: wheel (clamped ~8..40 world units). Window resize handled.
- Ground. Tile grid over the 64×64 world; subtle Stream-Crust styling (dark
#0a0812base, faint#181425lines) — see style guide §8. A soft vignette or fog so the world doesn't just end. - Asset registry + hot-swap.
registry.ts: maps asset key → THREE.Object3D factory. Default: procedural placeholder (footprint-sized beveled box, body color from data, one emissive accent, tiny idle animation — e.g. quantizer jaw bob). On init, attemptGLTFLoaderforpublic/assets/models/<key>.glb; if present it replaces the placeholder factory. Also poll or re-check on a 10s timer in dev so assets dropped in mid-session appear without reload (note what you implement). - Entities. Sync scene to
snap.entities(add/remove/rotate). Belts get a flat directional piece with an animated arrow/chevron texture (shader or UV scroll). - Belt items. InstancedMesh per item type (colored octahedron/box placeholder),
positioned from
BeltItem.t+ belt entity pos/dir, interpolated withalphafor butter-smooth motion at 30 tps sim. - Picking + ghost.
pickTilevia raycast to the ground plane.setGhostshows the selected machine's placeholder at the hovered tile, tinted cyan; red tint if tiles occupied (you can read occupancy fromsnap.entitiesfootprints). - Feedback dressing (cheap but load-bearing): jammed machines get a small blinking amber light; brownout dims the whole scene ~30% and flickers lights (listen to snapshot.bandwidth.brownout).
Definition of done: dev server shows the factory; placing a line from the UI (or
console dispatch) shows machines + items gliding down belts smoothly; a GLB dropped
into public/assets/models/quantizer.glb replaces the placeholder. npm run check
clean. NOTES written.
NOTES (append-only log, newest at bottom)
### Round N — YYYY-MM-DD — [your model]
SHIPPED: / DECISIONS: / BLOCKED/BROKEN: / CONTRACT REQUEST: / PROPOSAL: / NEXT: