Go to file
type-two 9012e3e652 Export hub, unified wardrobe, warm thumbs, body-type heights
EXPORT HUB. An 8-agent pass read every consumer's ACTUAL loader code (not its docs) and
adversarially re-verified each contract, because writing a wrong filename into a live game
directory corrupts shipping assets silently. The result reframed the whole feature: of six
targets, only TWO ingest by file drop.

· 3GOD depot is wireable today, but NOT the way the plan assumed. Its auth trusts the raw socket
  peer against a tailnet allow-list, so through the digalot.fyi Cloudflare front the peer is CF
  and every write 403s. Measured live: /api/list reports authed=false via CF, authed=true direct
  on http://100.94.195.115:8788. (thriftgod's shipped prop_campaign.py --publish defaults to the
  CF URL and is broken for exactly this reason.) This is the high-value target — thriftgod AND
  procity both read their props from it.
· The depot's clean_name DELETES illegal characters instead of substituting, so 'shop!-cat.glb'
  becomes 'shop-cat.glb' — an existing, different mesh — and is then served silently. Reproduced
  the rule exactly and added a pre-flight collision check that refuses unless overwrite is set.
· The other four are NOT file drops and the hub says so instead of showing a green tick over a
  no-op: djsim peds and procity peds load from hardcoded name arrays, thriftgod's props come from
  literal HERO_FLOOR/HERO_COUNTER strings, and not-tonight has no garment/doll/character art path
  at all (find public -type d returns only public and public/props). Each returns 409 naming the
  exact file and line to edit.
· thriftgod, the "most important 3D consumer", has NO paper-doll, atlas or reskin consumer —
  zero grep hits across web/ and tools/. Worth knowing before generating art for it.
· nsfw-tagged assets are refused on every target, including the ready ones.

UNIFIED WARDROBE. The 392 doll layers lived in a separate catalogue search couldn't reach, so
"find the coogi jumper" only ever looked at the 9 3D garments. Both tiers now share one manifest
and one grid: 401 items, tier filter, slot counts spanning both. Doll slots map to canonical ones
(top->torso, bottom->legs, shoes->feet, hat->head) and are NOT marked as guesses, because the
filename prefix is what djsim itself resolves art by.

THUMBS. /api/thumbs/warm pre-renders everything, deliberately SERIAL — each 3D thumb launches its
own Blender and a grid's worth at once buries the machine. 346 rendered, 0 failed. 2D layers are
cropped to their alpha bbox first: a doll layer is a garment-sized patch on a 704x1408 canvas, so
a plain downscale gives a mostly-empty tile.

BODY-TYPE HEIGHTS. small 1.58 / medium 1.72 / large 1.88 / tall 1.95 / child 1.30 / obese 1.74 /
stocky 1.68, stored per body and applied at export. This is the other half of unitfix only
repairing impossible scales: the library keeps real proportions, the game gets a sane height.

Verified in-browser, no JS errors: 401-item grid, cross-tier search, tier filter, export hub
returning the registry line for each unready target, nsfw refused on a ready target.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-24 21:00:46 +10:00
tools Phase 2: reskin engine — dress the nude TRELLIS bodies without fitting anything 2026-07-24 16:22:38 +10:00
web Export hub, unified wardrobe, warm thumbs, body-type heights 2026-07-24 21:00:46 +10:00
.gitignore Phase 5: the dressing room — thumbnails, a manifest, and the rig/LOD/dress bench on one page 2026-07-24 20:25:44 +10:00
blender_ops.py Phase 5: the dressing room — thumbnails, a manifest, and the rig/LOD/dress bench on one page 2026-07-24 20:25:44 +10:00
README.md WARDROBEGOD v1 — wardrobe generator bench (bodies, fits, garment gen pipeline) 2026-07-20 20:53:43 +10:00
server.py Export hub, unified wardrobe, warm thumbs, body-type heights 2026-07-24 21:00:46 +10:00
STATE_AND_PLAN.md Record build status for phases 0-3 + recon corrections found while building 2026-07-24 16:23:39 +10:00

WARDROBEGOD — one skeleton, infinite fits

The wardrobe generator bench: load bodies (FBX/GLB/OBJ), build a clothes library, generate new garments on the farm, fit them, assemble dressed NPCs. Sibling of NPCFACTORY (the dress-up/clip bench) and MeshGod imagelab — this one owns clothing.

python3 server.py                 → http://localhost:8150
WG_HOST=0.0.0.0 python3 server.py → expose on the tailnet
MB_TOKEN=mbt_… python3 server.py  → enables the generator tab (MODELBEAST bearer token)

No build step: stdlib server + three.js from CDN. Heavy lifting = local headless Blender (blender_ops.py, tested on 5.1.2; override path with WG_BLENDER).

What it does

  • Library panes: bodies (scans library/bodies/ + ~/Documents/anatomy + thriftgod's web/assets/models), garments, generated images, finished outfits. Upload via file inputs.
  • Stage: orbit viewer; FBX auto-converts to GLB (cached in .glbcache/); HUD reads tris / height / rig state (bones + clips); first clip auto-plays.
  • Body ops: scale-to-height (bases arrive 1.0m tall — normalize to ~1.72m); decimate-keep-weights (the SAFE local path for rigged meshes — never farm /finish).
  • Rigid attach (tier 1): hats/bags/shoes → pick a bone, slide offsets, preview live. Bake permanently via the fleet /rig endpoint (m1ultra :8011) when happy.
  • Deforming FIT (tier 2): weight-transfers the rigged body's skinning onto a garment mesh (Blender data_transfer, nearest-face interpolated, optional inflate-mm of air), parents it to the armature. FIT → wardrobe item = garment+skeleton GLB (reusable); fit → dressed glb = body+garment in one.
  • Assemble: body + ticked fitted garments → one dressed GLB in out/ — drop straight into thriftgod / djsim / procity, or publish to 3GOD.

Generating NEW clothing (the pipeline, $0 on MODELBEAST)

  1. flux (flux_local, Klein) — product-shot prompt template: garment laid flat, white bg
  2. cutout (bg_remove_local) — the biggest quality lever before 3D
  3. then ONE of:
    • → rigid 3D (trellis_mac, ~5 min): hats, shoes, bags, glasses — bone-parent these. NOT for floppy cloth: reconstruction eats thin geometry (fleet traps ledger).
    • → hanging texture: flat garment PNG for rack planes (djsim fittings.js garment({image})) and the paper-doll wardrobe. Flat clothes love this route.
    • deforming wearables: model/retopo against the base body (or socket-cut a clothed torso, character_kit_modular style), then FIT. Never raw-gen these.

House rules

  • Bases (anatomical models) stay in the library. Only dressed outfits ship into games.
  • FIT requires a rigged body. Unrigged base → rig first (MIRPAMO on ultra, or Mixamo).
  • One skeleton (mixamorig) across the fleet: any garment fitted on one body fits every body on that skeleton, and every clip in the bank drives it.