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

2.9 KiB
Raw Blame History

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 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.