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>
2.9 KiB
2.9 KiB
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)
# 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 inweb/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 toweb/assets/manifest.json(re-runbuild_manifest.pyonce the results land), publish. - Re-run
validate_manifest.py --depotto confirm they're live and the manifest stays green.