PROCITY/pipeline/MESHGOD_BATCH.md
m3ultra 063a959e29 Lane E (assets): pipeline, manifest + 23 on-device facade skins
Audit -> normalize (16 GLBs + thumbs) -> web/assets/manifest.json (the
contract Lanes B/C/D read) -> facade gap-fill.

Step 4 facades generated locally on the M3 Ultra via MODELBEAST
flux_local (FLUX.2-klein-4B / MLX on MPS): 23 skins, free, ~5.7s each,
blank signboard, eyeballed, harvested, mapped to shop types. Every
registry type now has >=3 facades (stall 2->4, closing the Lane A gap).
Corner-lot -side walls tagged face:"side" with empty types so no shop
front ever selects a windowless wall. manifest validates green.

Still gated on John (both optional -- the game runs asset-free):
publish the 16 GLBs to 3GOD (needs GOD3_PW), MeshGod hero props (~$2.70).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-14 13:48:25 +10:00

61 lines
2.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# PROCITY bespoke hero props — MeshGod batch (Step 5)
> **Budget-gated. Do NOT run without John's go.** ≈ 9 solids × ~30¢ ≈ **$2.70**. 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_<name>_01.glb` / `procity_street_<name>_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.