# PROCITY bespoke hero props — MeshGod batch (Step 5) > **Budget-gated. Do NOT run without John's go.** Pricing corrected (2026-07-14, John): fal > Hunyuan v2 is **~14–17¢/gen, not 30¢**. Post-R3/R4 the batch is mostly filled free on > MODELBEAST; the fal remainder is only **glass-case + bus-shelter** (+ optionally > magazine-rack) ≈ **$0.28–0.51 one-pass, ~$1 worst case** with the ≤2-attempts rule. Everything > here has an in-engine primitive fallback, so the game never blocks on it. The batch spec is > `pipeline/meshgod_batch.json` (djsim_home / thriftgod_hero pattern). ## What this fills The audit coverage table (`AUDIT.md`) found the sorted library has **no usable source** for a handful of shop-defining props. These are them — the objects that make a shop-type read instantly: | prop | shop type | why not from the library | |---|---|---| | listening-booth | record | nothing like it in the dump | | cash-register | all | none (till is universal) | | glass-case | toy / pawn / milkbar | audit found no glass display case | | drinks-fridge | milkbar | none | | magazine-rack | milkbar / pawn | none | | arcade-cabinet | arcade / dept | none | | milkshake-mixer | milkbar | none | | novelty-record | record (roof ornament) | the "ooh" landmark object | | bus-shelter | street | none (Lane B street dressing) | ## Run it (only after go-ahead) ```bash # 1. FIRST check for reuse — save money. cash-register & glass-case very likely already exist # from thriftgod_hero.json (its street-bench/council-bin/milk-crate-stack/cashbot are already # live on the depot): curl -s https://digalot.fyi/3god/api/list | grep -iE 'register|glass|display|fridge|arcade' # 2. generate the ones not already available: cd ~/Documents/MESHGOD # (or meshgod) python -m meshgod.batch manifest ~/Documents/procity/pipeline/meshgod_batch.json --out assets3d/procity # 3. finish + publish through the SAME house pipeline as the library assets: # meshgod.batch already runs finish_glb (metres/base-origin/decimate). Then normalize any # stragglers with pipeline/normalize.py and publish with pipeline/publish.py. ``` ## The MeshGod gotcha (why some gaps are NOT here) Thin wires and flat discs reconstruct badly in image→3D. These stay **in-engine primitives** (listed under `_primitives_instead` in the JSON) — Lane B/C build them from boxes/cylinders: - **spinner-rack** (thin wire) → extruded-cylinder primitive - **band-poster-easel** (thin A-frame) → box + canvas poster - **vhs-rewinder** (tiny box) → box primitive - **returns-slot** → a cut in the shopfront wall plane - **escalator-prop** → extruded ramp primitive - **pegboard-wall** → a plane skinned with `tex-pegboard.jpg` (already in `web/assets/gen/`) The `novelty-record` is deliberately specced as a **thick chunky disc on a base** (not a flat disc) so it survives reconstruction. ## After generation - Each solid → `procity_fit__01.glb` / `procity_street__01.glb`, thumbnail rendered, add to `web/assets/manifest.json` (re-run `build_manifest.py` once the results land), publish. - Re-run `validate_manifest.py --depot` to confirm they're live and the manifest stays green.