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>
92 lines
5.6 KiB
Markdown
92 lines
5.6 KiB
Markdown
# PROCITY pipeline (Lane E) — how to re-run everything
|
|
|
|
The asset pipeline: audit ultra's library → normalize the good bits to house GLB law → publish
|
|
to the 3GOD depot → ship `web/assets/manifest.json` (the contract Lanes B/C/D read) → fill facade
|
|
+ prop gaps. **Everything is optional at runtime** — the game runs asset-free; this lane makes it
|
|
gorgeous, it doesn't make it work.
|
|
|
|
## Where things live
|
|
|
|
| what | where |
|
|
|---|---|
|
|
| ultra (library + Blender) | `ssh johnking@100.91.239.7` — key auth, **no** coreutils/timeout, py3.9, Blender at `/Applications/Blender.app/Contents/MacOS/Blender` (not on PATH) |
|
|
| model library | ultra `~/Documents/3D=models/{shop-fittings,street-furniture,furniture,props-scenes}` |
|
|
| 3GOD depot | `https://digalot.fyi/3god` — `GET /a/<f>`, `GET /api/list`, `POST /api/upload?name=<f>` |
|
|
| OpenRouter key (skins) | env `OPENROUTER_KEY` or `~/Documents/dealgod/lore/keys.env` (never committed) |
|
|
| depot password (publish) | env `GOD3_PW` (never committed; ask John) — cookie = `hmac(GOD3_PW,"3god-ok")` |
|
|
| Ollama (free LLM) | `http://100.89.131.57:11434` (qwen3) — for names/lore/cataloguing, unused so far |
|
|
| MODELBEAST (free local gen) | this box, `~/Documents/MODELBEAST`. `flux_local` = FLUX.2-klein-4B text→image on MPS (**used for the facade skins** — ungated, weights cached). `sf3d`/`trellis_mac` = image→GLB, local but HF-gated (setup needed) |
|
|
|
|
## The steps (each is idempotent / resumable)
|
|
|
|
### 1. Audit — `AUDIT.md` *(free)*
|
|
```bash
|
|
scp pipeline/glb_stat.py johnking@100.91.239.7:/tmp/
|
|
ssh johnking@100.91.239.7 'cd ~/Documents/3D=models && python3 /tmp/glb_stat.py --json shop-fittings street-furniture furniture props-scenes' > pipeline/_audit_stats.json
|
|
```
|
|
`glb_stat.py` is a dependency-free GLB parser (tris, bbox, texture sizes, Draco flag). Findings +
|
|
licensing triage are written up in `AUDIT.md`.
|
|
|
|
### 2. Normalize — `normalize.py` → 16 GLBs + thumbs *(free, runs on ultra)*
|
|
```bash
|
|
scp pipeline/normalize.py pipeline/batch.json johnking@100.91.239.7:/tmp/
|
|
BL=/Applications/Blender.app/Contents/MacOS/Blender
|
|
ssh johnking@100.91.239.7 "\$BL --background --python /tmp/normalize.py -- /tmp/batch.json /tmp/procity_norm"
|
|
scp johnking@100.91.239.7:/tmp/procity_norm/_results.json pipeline/_normalize_results.json
|
|
scp 'johnking@100.91.239.7:/tmp/procity_norm/thumbs/*.png' web/assets/thumbs/
|
|
scp 'johnking@100.91.239.7:/tmp/procity_norm/*.glb' pipeline/_normalized/
|
|
```
|
|
Enforces the house GLB law (metres, +Y up, base origin, ≤5k tris, WebP ≤1024, no Draco), renders a
|
|
256px thumbnail each. Extends `MESHGOD/scripts/finish_glb.py` (solidify/decimate/bright/base-origin)
|
|
+ adds texture-webp, height-normalize, outlier cleanup, per-asset up/yaw. Edit `batch.json` to add
|
|
assets; **always eyeball the thumbnails** — node-transform-distorted sources (see AUDIT rejects)
|
|
look fine in-frame but have wrong footprints.
|
|
|
|
### 3. Manifest — `build_manifest.py` + `validate_manifest.py` *(free)*
|
|
```bash
|
|
python3 pipeline/build_manifest.py # → web/assets/manifest.json
|
|
python3 pipeline/validate_manifest.py # Lane F gate: 0 errors = green
|
|
python3 pipeline/validate_manifest.py --depot # stricter: require GLBs live on the depot
|
|
```
|
|
`build_manifest.py` derives skins from `web/assets/gen/` + fittings from `_normalize_results.json`;
|
|
the curated facade→shop-type maps live at the top of that file (edit there when adding skins).
|
|
|
|
### 4. Publish — `publish.py` → 3GOD depot *(the one outward-facing step)*
|
|
```bash
|
|
python3 pipeline/publish.py --dry-run # free: list what would upload
|
|
export GOD3_PW=... # ask John
|
|
python3 pipeline/publish.py # POST each GLB + thumb to the depot (idempotent)
|
|
```
|
|
|
|
### 5. Facade skin gaps — `gen_skins.py --local` *(DONE, free, on-device)*
|
|
The 23-skin gap pack is **already generated + harvested + mapped**. To re-run or extend:
|
|
```bash
|
|
python3 pipeline/gen_skins.py --local --dry-run # free: list the pack, no GPU
|
|
python3 pipeline/gen_skins.py --local # MODELBEAST flux2-klein-4b on MPS → .genraw/ (~5.7s/img)
|
|
python3 pipeline/gen_skins.py --harvest # → web/assets/gen/facade-*.jpg, then re-run build_manifest.py
|
|
```
|
|
`--local` drives `~/Documents/MODELBEAST/server/operators/flux_local/run.py` directly (no server,
|
|
no key, weights cached). It runs one GPU job at a time. Add skins by editing `PROMPTS` in
|
|
`gen_skins.py` and their shop-type map in `build_manifest.py` (`FACADE_TYPES`). **Always eyeball
|
|
`.genraw/` and delete rejects before `--harvest`.** Cloud fallback (drop `--local`): OpenRouter
|
|
`google/gemini-3.1-flash-image`, ~$0.004/img, needs `OPENROUTER_KEY`. Manual flow: `SKIN_PROMPTS.md`.
|
|
|
|
### 6. Bespoke hero props — `MESHGOD_BATCH.md` + `meshgod_batch.json` *(≈$2.70, GATED)*
|
|
Glass case, fridge, till, listening booth, etc. — the gaps no library asset fills. **Do not run
|
|
without John's go**; check the DealGod cache / depot for reuse first (cash-register + glass-case
|
|
likely already exist). Everything has a primitive fallback.
|
|
|
|
## Cost summary
|
|
|
|
| step | cost |
|
|
|---|---|
|
|
| audit, normalize, manifest, validate, publish | **free** (compute + bandwidth) |
|
|
| facade skin gap-fill (23 imgs) | **free** — done on-device (MODELBEAST flux_local); cloud fallback ~9¢ |
|
|
| MeshGod hero props (9 solids) | **~$2.70** — gated on John (local `sf3d`/`trellis_mac` is free but HF-gated) |
|
|
|
|
## Artifacts (not committed — regenerated from the steps)
|
|
|
|
`pipeline/_normalized/` (staging GLBs, live on depot), `pipeline/.genraw/` (raw skin gen).
|
|
Committed: the scripts, `*.md`, `batch.json`, `meshgod_batch.json`, `_audit_stats.json`,
|
|
`_normalize_results.json`, `web/assets/manifest.json`, `web/assets/thumbs/`, `docs/shots/laneE/`.
|