Go to file
type-two 5c80e65d58 Salvage the SD lane: patch MODELBEAST, add the SD backend, fix the assets filter at source
The LoRA bench concluded the SD1.5 lane was invalid for garments. That was true of the
CHECKPOINT, not the lane: Hyper_Realism_1.2 was the only one the farm could reach and it is a
person-photoreal merge that framed every garment as worn-and-cropped no matter how hard you
negative-prompted. Given four non-person checkpoints, the lane works — and now beats flux.

MODELBEAST patches (John's explicit blessing; flux_local deliberately untouched because a
parallel session owned it and had already deployed LoRA + Z-Image support there):
· comfyui_sd now STACKS LoRAs. It hard-coded a single LoraLoader, so style+texture together
  was impossible; `lora` now takes a list, each entry optionally `name=0.6`, chained.
· comfyui_sd gains ControlNet (loader + ApplyAdvanced + staged control image). The payoff for
  a wardrobe is recolouring one garment into N colourways that share a byte-identical
  silhouette, so a single cut-out alpha is reusable across every variant.
· Per-node preflight widened to LoRAs and ControlNets, and the arch-mismatch warning now fires
  per LoRA. A wrong-base LoRA is a SILENT no-op, so everything fails loudly instead.
· Deployed to all three nodes that run comfyui_sd (m3ultra, ultra=m1, m4pro=m4), each backed up.
· GET /api/assets now honours ?parent_job=. It declared no such parameter, so FastAPI silently
  dropped it and every caller got the whole table — 2,578 rows for a bogus id. Callers that
  took rows[0] were right only by accident of newest-first ordering. Verified: bogus -> 0 rows,
  real -> only its own. Restarted the queue in a zero-active-jobs window.
· Copied 4 non-person checkpoints ultra -> m3ultra over the fast LAN (12.6 GB).

wardrobegod:
· `sd` backend on /api/gen, defaulting to juggernautXL_ragnarok, with checkpoint/lora/negative
  passthrough. Measured on one prompt+seed: a full isolated flat-lay where Hyper_Realism crops
  a worn garment.
· flat3d template gains 'no hanger, no coat hanger' — a wire hanger appeared in most SD product
  shots and keys into the cutout as if it were garment. doll2d already had the clause.

Verified end-to-end: 7/7 salvage cells ran (including a 2-LoRA stack, previously impossible),
and a Coogi knit generated through wardrobegod's own /api/gen came back isolated on white with
legible raised-knit texture.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-24 18:14:21 +10:00
tools Phase 2: reskin engine — dress the nude TRELLIS bodies without fitting anything 2026-07-24 16:22:38 +10:00
web Salvage the SD lane: patch MODELBEAST, add the SD backend, fix the assets filter at source 2026-07-24 18:14:21 +10:00
.gitignore Phase 3: the 2D paper-doll tier — 392 garments you can actually change 2026-07-24 16:07:13 +10:00
blender_ops.py WARDROBEGOD v1 — wardrobe generator bench (bodies, fits, garment gen pipeline) 2026-07-20 20:53:43 +10:00
README.md WARDROBEGOD v1 — wardrobe generator bench (bodies, fits, garment gen pipeline) 2026-07-20 20:53:43 +10:00
server.py Salvage the SD lane: patch MODELBEAST, add the SD backend, fix the assets filter at source 2026-07-24 18:14:21 +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.