foitin/pipeline
2026-08-16 15:43:29 +10:00
..
autohitbox.py Scaffold: deterministic 60Hz combat core, drop-in character format, MODELBEAST pipeline 2026-07-28 18:45:44 +10:00
batch_roster.py MIRPAMO wave: SIREN + DAPHNE (fighters 17-18), roster grid 3rd size tier 2026-07-29 14:44:28 +10:00
combat_clips.md Two real fighters: KACHUJIN and VESPER, 11 moves each from Mixamo combat clips 2026-07-28 19:50:56 +10:00
pack_character.py Torn-clothing wardrobe mechanic (Phase A) 2026-07-28 21:09:06 +10:00
README.md Blender render pipeline + first real character from asset library 2026-07-28 19:02:39 +10:00
render_geared.sh Gear wardrobe state (Phase B): vesper geared with MODELBEAST boxing gloves + headgear 2026-07-28 22:23:05 +10:00
render_moves.py Closed-loop camera calibration: pixel servo handles arbitrary rig conventions 2026-07-29 13:37:58 +10:00
restyle_frames.py restyle_frames.py: generate frames@<style> tiers (pillow-xray + farm engines); vesper gets 4th band 'xray' 2026-08-16 15:43:29 +10:00
strip_skin.py strip_skin: export GLB not FBX — Blender 5 FBX exporter flattens slotted actions 2026-07-29 14:39:58 +10:00

FOITIN asset pipeline (MODELBEAST)

New fighter = one pass through this pipeline. Target cost: hours, not weeks. Steps 13 run as MODELBEAST jobs (queue on m3ultra :8777 — see the fleet skill); 46 run locally.

1. IDENTITY   FLUX + character LoRA        → master portrait(s), costume locked
2. MESH       Hunyuan3D-2.1 / TRELLIS      → textured 3D mesh (GLB) from portrait
3. RIG+MOVES  auto-rig → retarget the SHARED move library (~30 clips) onto the rig
              (character-specific specials are extra clips, added per character)
4. RENDER     render_moves.py (Blender headless, tested on Blender 5.1):
              handles Mixamo namespace remap, axis fix, height normalisation,
              first-frame pivot centring, transparent ortho side camera
   → renders/<char>/<move>/####.png
   /Applications/Blender.app/Contents/MacOS/Blender -b \
     --python pipeline/render_moves.py -- \
     --char <rigged.fbx|.glb> --clips <dir_or_list> --out renders/<id> \
     --rotz 155 --step 2
5. HITBOX     autohitbox.py — DWPose over rendered frames → hurtbox rects per move
6. PACK       pack_character.py — assemble characters/<char>/ per CHARACTER_SPEC.md

Timing/damage numbers still get tuned by hand in each move's data.json — that's game feel, not asset work. Startup/active windows: see STUDY.md §2 (modern pacing, NOT BKB's 53-frame jab).

Naming

Use the shared move vocabulary (idle, walk_f, jab, kick, hit, knockdown, …, spec/CHARACTER_SPEC.md "Required move names") so every character drops onto the same FSM with zero engine changes — the Mortal Kombat uniform-mechanics doctrine, same reason BKB could ship 12 fighters on one exe.