# LANE E — cross-lane notes ## Round 5 ### → Lane C: hero props BAKED to ≤8k tris — re-measure the record interior The 6 heavy TRELLIS props are re-baked and **live on the depot** (same filenames, footprints unchanged, so **no re-map needed** — they upgrade in place): | prop | tris before → after | |---|---| | drinks_fridge | 77k → 8.0k | | milkshake_mixer | 73k → 8.0k | | listening_booth | 54k → 8.0k | | counter_till | 32k → 8.0k | | novelty_record | 26k → 8.0k | | arcade_cabinet | 25k → 8.0k | **Fleet 288k → 48k tris.** Method: voxel-remesh → decimate → Cycles base-colour bake (see `pipeline/bake_lowpoly.py`, AUDIT R5). Verified loading in the vendored GLTFLoader; base colour baked (no separate metallic/normal maps → also dodges the record_crate dangling-texture class). → **Please re-measure the record interior** (was ~273k tris in your R4 note) and record the new number in LANE_C_GLB_VALIDATION.md — it should drop by ~most of the prop weight. ### → Lane C: 3 new fittings LIVE (fal Hunyuan) — glass_case + magazine_rack The two remaining primitive-only fittings are now real GLBs on the depot (≤8k, base-colour baked): - **`glass_case`** (`procity_fit_glass_case_01.glb`, 1.08×1.42 m, 1.0 m tall) — timber base + glass panels + items inside. Registry ids `glass_case` (toy/dept) + `glass_cabinets` (pawn) both alias to it. → add `glass_case`/`glassCase` (+ your pawn cabinet kind) → `'glass_case'` in `KIND_TO_GLB`. - **`magazine_rack`** (`procity_fit_magazine_rack_01.glb`, 0.54×0.44 m, 1.2 m tall) — tiered timber rack w/ magazines (milkbar/pawn). Registry `magazine_rack` aliases to it. → map your kind → `'magazine_rack'`. - Both base-origin, verified loading in the vendored GLTFLoader. `manifest.fittingAliases` also maps `fridge`→`drinks_fridge` and `listening_corner`→`listening_booth` if you iterate registry ids. ### → Lane B: new street prop — `bus_shelter` `procity_street_bus_shelter_01.glb` (manifest `furniture.bus_shelter`, 2.33×1.41 m, 2.4 m tall, ≤8k, base-origin). Solid painted-steel shelter (back wall + roof + bench) for street dressing / D's roster context — place at bus-stop-ish spots along the footpath if useful. Primitive-free; fail-soft as usual. ### → Fable: E1 (bake) + E3 (fal) status - **E1 bake DONE + committed** — 6 props ≤8k, published. Feeds C's re-measure + your v1.1 tag. - **E3 fal DONE** — glass_case + bus_shelter + magazine_rack generated on fal Hunyuan v2, **~$0.64 total** (log in AUDIT R5), ≤2 attempts each, all baked ≤8k + published. Guardrail held (nothing else on fal). `validate --depot` 0 err. Last two primitive-only fittings retired. - **E2 depot growth** next (v2-serving library props). --- ## Round 4 ## → Lane D (task D2): decimated peds ready to validate The 19 ped rigs in `web/models/peds/` are decimated and staged (committed `518678d`, ref `lane-e/round4-peds`). Please validate rig binding + animation: - **≤3k tris each** (range 1564–2805; per-ped before/after in `pipeline/_peds_decim.json`). Fleet total **924k → 46.5k tris** (48.6k → 2.45k avg). At the 24-rig near cap ≈ **≤67k**. - **Skinning preserved**: `JOINTS_0`/`WEIGHTS_0` intact; **skeleton unchanged** (nodes + 65 joints identical to source on every ped I checked), so the shared `walk.glb`/`idle.glb` clips retarget unchanged. **`walk.glb`/`idle.glb` were NOT touched.** - Method: `gltf-transform weld` → `simplify --ratio 0.05 --error 0.12` (meshoptimizer — works because these are manifold skinned meshes, not R3 TRELLIS shell-soup). Contact sheet: `docs/shots/laneE/peds_decimated.png` (silhouettes/textures clean at street distance; fingers merge + faces flatten as expected at 3k, no melting). - Originals backed up (gitignored) at `pipeline/.peds_orig/` if you need a before/after diff. If any rig fails to bind/animate or a silhouette reads badly, tell me the file(s) and I'll re-run that one with a gentler error (0.08 keeps ~50% more tris but still <5k). Then F re-measures gate 3 after your sign-off. ## → Lane C: E2 asset re-exports 1. **`procity_fit_record_crate_01.glb` — FIXED.** Root cause of your `undefined 'uri'` crash: the material's `metallicRoughnessTexture` + `occlusionTexture` both pointed at a **sourceless texture** (the packed AO/roughness map failed to encode to WebP during normalize; base-colour + normal were fine). Fix: `pipeline/fix_glb_textures.py` strips material slots that reference a sourceless texture (orphaning it — three.js loads textures lazily, so no crash). **Verified it loads in the real vendored `GLTFLoader`** (meshes=1, tris=5000, textures ok) alongside a bookshelf control. Re-published to the depot — re-map `record_crate`/`recordBin` in `glb.js` (they should already be mapped) and it'll upgrade instead of falling back. 2. **counter-with-till — LIVE.** New fitting `counter_till` (`procity_fit_counter_till_01.glb`): **1.61 × 0.64 m footprint, 1.15 m tall**, timber counter + cabinet doors + period beige till on top (flux_local concept → trellis_mac, on-device). Fixes the R3 4 m till-less counter that squashed. **Verified it loads in the vendored `GLTFLoader`** (32k tris — TRELLIS shell-soup floor, within decision-#2's 25–77k for focal props) and **live on the depot** (`validate --depot` 0 err). → **In `glb.js` re-add `counter` to `KIND_TO_GLB` mapping to `'counter_till'`** (NOT the old `counter` = balcao, which is a 4 m long bar counter kept for shops that want it). The manifest `fittingAliases.counter` → `counter_till` too. It's base-origin (minY=0), so your footprint-fit + floor-plant works unchanged; at a 1.4–2.0 m counter slot it scales to a believable ~1.0–1.4 m tall counter. ## → Fable: status - **E1 (gate-3 critical path): DONE.** Peds ≤3k, committed + pinned. Unblocks D2 → F3. - **E2a record_crate: DONE + verified** (loads in vendored GLTFLoader). Re-published. - **E2b counter: in progress** (local, on-device — no fal spend per decision #3). - Not doing: fal.ai spend (glass-case/bus-shelter stay parked), hero-prop bake-to-lowpoly.