PROCITY/docs/LANES/LANE_E_ASSETS.md
2026-07-14 10:46:40 +10:00

101 lines
5.7 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.

# LANE E — ASSETS (skins, GLBs, the depot manifest)
> **Prompt for Opus 4.8.** You are working in `/Users/jing/Documents/PROCITY` with SSH access
> to **ultra** (`ssh johnking@100.91.239.7`, key auth works non-interactively — mind: no GNU
> coreutils/timeout/setsid, system python 3.9, Homebrew at /opt/homebrew). Read
> `docs/CITY_SPEC.md` and `docs/RESEARCH.md` first. You own `pipeline/*`, `web/assets/*`, and
> `web/assets/manifest.json`. Do not touch other lanes' files. **Spending rule: fal/MeshGod
> generations cost real money — batch nothing without listing it in a plan file first and
> keeping v1 to the shortlist below. Prompt-pack image gen is near-free but still list counts.**
> Verify every visual result with your own eyes (render thumbnails / open in browser) — never
> "should look right". Commit in small, described steps on `main`.
## Mission
Feed the other lanes: audit what exists, normalize the best of it into a PROCITY asset set,
publish it (3GOD depot + local), and ship the **manifest** that Lanes B/C/D consume. Then the
gap-fill generation passes (facade skins first, GLB props second). Everything optional at
runtime — the game must run asset-free — so this lane is about making it *gorgeous*, not
making it *work*.
## Step 1 — Audit (no generation yet)
- On ultra, read `~/Documents/3D=models/MANIFEST.md` + `CH_MAPPING.md`, then inventory
`shop-fittings/`, `street-furniture/`, `furniture/`, `props-scenes/` against the fittings
needs in CITY_SPEC's shop-type table and LANE_C's fittings list. Note tri counts, scale
sanity, licensing zone (🟢 web-ok only — anything unclear goes in a QUARANTINE list, not
the manifest).
- Hit `https://digalot.fyi/3god/api/list` — some of this may already be uploaded.
- Output: `pipeline/AUDIT.md` — table of candidate GLBs → PROCITY fitting/furniture id,
status (ready / needs-normalize / missing / quarantined-licence).
## Step 2 — Normalize & publish GLBs
- `pipeline/normalize.py` — runs **on ultra** against Blender + the existing MESHGOD scripts
(`~/Documents/MESHGOD/scripts/finish_glb.py`, `render_glb.py` — read them, extend, don't
fork): enforce house GLB law (metres, +Y up, origin at base, facing Z, ≤5k tris props,
webp textures ≤1024, no Draco), name as `procity_<category>_<name>_01.glb`, render a
256px thumbnail per asset.
- Upload to 3GOD (`POST /api/upload?name=<f>.glb`), thumbnails into `web/assets/thumbs/`.
- Priority order (what Lanes B/C actually place first): record crate + record bin, clothes
rack, metal wire shelf, garage shelves, bookshelf, cube shelf, glass case, counter (balcao),
trestle table, bench + longbench + park bench, market stall, food cart, streetlight, fridge.
## Step 3 — The manifest (`web/assets/manifest.json`)
The single contract file other lanes read:
```json
{
"version": 1,
"depot": "https://digalot.fyi/3god",
"fittings": { "record_bin": {"file":"procity_fit_record_bin_01.glb", "footprint":[1.2,0.8], "thumb":"…"}, },
"furniture": { "bench": {}, "streetlight": {}, },
"skins": {
"facade": {"weatherboard":{"file":"gen/facade-weatherboard.jpg","types":["opshop"]}, },
"sky": [...], "ground": {...}, "wall": [...], "interior": {...}
}
}
```
Catalogue the 69 skins already in `web/assets/gen/` (they came from thriftgod + 90sDJsim —
map them to shop types per the registry table). Add a `pipeline/validate_manifest.py`
(plain python3) that checks every referenced file exists locally or HEADs OK on the depot,
footprints are sane, and JSON parses — this runs in Lane F's gate.
## Step 4 — Facade skin expansion (prompt-pack pass)
The 18+7 existing facades are the style anchor. Gaps for a whole town: **toy shop, book shop,
video store, milk bar variants (23), arcade interior frontage, dept-store anchor (wide),
warehouse/roller-door, residential terrace/cottage fronts (34), corner-lot two-face,
market-square edge**. Two routes, in order:
1. Port thriftgod's `gen_assets.py` (OpenRouter `google/gemini-3.1-flash-image`, ~$0.004/img,
resumable `.genraw/` — see `thriftgod/gen_assets.py`) into `pipeline/gen_skins.py` with the
**same style bible prefix** and the **blank-signboard facade template** (`gen_assets.py:69-86`).
~30 images ≈ 12¢. Needs the OpenRouter key (`thriftgod/.env` pattern) — if absent, route 2.
2. Emit `pipeline/SKIN_PROMPTS.md` in the house FLOW_PROMPTS.md format (POLY lock, save-as
filenames) for John to run through the manual flow.
Also: **corner buildings need a second facade face** — add a `-side` variant convention
(`facade-X-side.jpg`) or document that Lane B reuses the front skin on corners (decide, write
it in the manifest README).
## Step 5 — Bespoke hero props (MeshGod, budget-gated)
Shortlist ONLY (≈10 solids ≈ $3): listening booth, till/cash register, VHS rewinder,
glass counter case (if audit finds none), spinner rack, milkshake mixer, arcade cabinet shell,
band-poster easel, giant novelty record (roof ornament), bus stop shelter. Write
`pipeline/MESHGOD_BATCH.md` (manifest-style, the `djsim_home.json` pattern) — **do not run the
batch without John's go**; everything has a primitive fallback anyway. Remember the MeshGod
gotcha: thin wires and flat discs reconstruct badly — those stay in-engine primitives.
## Acceptance
- `pipeline/AUDIT.md` complete; ≥15 normalized GLBs live on 3GOD with thumbnails.
- `web/assets/manifest.json` validates green; Lanes B/C load fittings from it untouched.
- Facade coverage: every shop type in the registry has ≥2 skins mapped; new skins
indistinguishable in style from the originals (side-by-side contact sheet in
`docs/shots/laneE/`).
- A one-page `pipeline/README.md`: how to re-run each step, what it costs, where creds live.