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>
61 lines
2.9 KiB
Markdown
61 lines
2.9 KiB
Markdown
# 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.
|