docs(WP-35): main.gd split + studio built; Felt Studio.bat launcher

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_019GQG9nbFhFnHak8avAUjp8
This commit is contained in:
MarioGLealPandClaude Opus 5.5 committed 2026-10-01 08:42:57 +01:00
1 parent a80e52581a
commit f7b8456581
4 files changed
+75 -3

No files matched your search

+3
View File
@@ -0,0 +1,3 @@
@echo off
rem WP-35 Animation Studio - the overlay in a normal window, beside live Felt.
start "" "E:\Felt\felt-character-assets\tools\godot\Godot.exe" --path "E:\Felt\felt-character-assets\felt-godot-overlay" res://studio.tscn
+4 -2
View File
@@ -242,8 +242,10 @@ uv run pre-commit run --all-files # run every hook without committing
felt-character-assets (from `felt-godot-overlay/`): `uvx --from
"gdtoolkit==4.*" gdlint .` (report-only — see its own CI job and
`gdlintrc`'s `excluded_directories`). **Never run `gdformat` on
`main.gd`/`props.gd`** until WP-35's split lands (it would clash with
the split and the `wp35-partial` stash).
`main.gd`/`props.gd`** without a headless before/after check: WP-35's split
landed 2026-10-01 (`components/*.gd`), and every move there was verified with
`scratch/wp35/run.sh` + the TCP drives; reuse them. (The old `wp35-partial`
stash is superseded and can be dropped.)
A new setting always ships with its `.env.example` key in the **same**
commit (rule 6); the local `check-env-example` pre-commit hook (where
+1 -1
View File
@@ -74,7 +74,7 @@ Audit + fixes of WP-01…19: [`AUDIT-2026-09-24.md`](AUDIT-2026-09-24.md).
| [WP-31](WP-25-31-life-features.md#wp-31) | Calendar heads-up | WP-25 | S | 🔎 built 10-01 (felt-core `e5ddf11`, **committed locally, not pushed**: push = deploy, waiting on Mario); needs the 12-min test event check |
| [WP-32](WP-32-33-wardrobe-automation.md#wp-32) | Wardrobe Tier A: source accessories and clothing assets online (+ Booth shortlist for Mario) | none | M | 🔎 sourced 10-01: 18 new accessories (+8 WP-21 props = 26), fits tuned on her in the review app; **needs Mario's review** (`review/wp32-accessories`), then props.json wiring |
| [WP-33](WP-32-33-wardrobe-automation.md#wp-33) | ★ Wardrobe Tier A: a new tee every day (UV print areas, ≥ 60 tees, review gallery, daily pick) | none | M | 🔎 needs review |
| [WP-35](WP-35-animation-studio.md) | Animation Studio: contained window to browse/play/scrub every clip, build base+upper combos, inspect feet/root motion, mark clips keep/broken | WP-20 | M–L | ☐ |
| [WP-35](WP-35-animation-studio.md) | Animation Studio: contained window to browse/play/scrub every clip, build base+upper combos, inspect feet/root motion, mark clips keep/broken | WP-20 | M–L | 🔎 built 10-01: main.gd split 3563 → 1264 into 9 `components/` (each verified headless + TCP drives vs the original), studio = `Felt Studio.bat`; needs Mario's look |
| [WP-36](WP-36-llamacpp.md) | Local brain: llama.cpp `felt-llm` (Gemma 4 12B QAT) on the server's P104, one call with native tools; **full local, no cloud AI** (Gemini, Ollama, router and privacy classifier removed) | none | M–L | 🟡 live 09-29 (felt-core `24bd218`, infra `367c89a`/`7ff9501`); left: Nitro5 Ollama removal, first real day |
| [Tier C](MARIO-vroid-outfits.md) | **Mario's** VRoid outfit checklist (pajamas, hoodie, rain, winter, Halloween by mid-Oct, …) | none | ongoing | ☐ |
| **Phase 7: packaging (last, after everything else is ticked)** |||||
+67
View File
@@ -86,3 +86,70 @@ felt-animation is optional. **Size:** M–L. **Depends on:** WP-20.
open.
- The overlay's behaviour is unchanged by the shared-code refactor:
before/after screenshots, plus the walk measured with no backward frames.
## Notes from implementation (2026-10-01)
**The split (felt-character-assets `2fccbea`..`37d7f9b`).** `main.gd` went
from 3563 to 1264 lines. Nine components in `felt-godot-overlay/components/`:
| file | what | LOC |
|---|---|---|
| `clip_library.gd` | library scan, rest-corrected VRMA retarget, in-place cycles, gait symmetrise, blend times | 415 |
| `layer_mixer.gd` | WP-20 AnimationTree, A/B slots, cross-fades, upper mask, tag classes, finish detection | 256 |
| `pose_layer.gd` | FeltPoseModifier: gaze, nod, listening tilt, beat bob | 313 |
| `face.gd` | lipsync visemes, blink, expression mapping, region compositor | 474 |
| `speech_bubble.gd` | WP-09 bubble | 137 |
| `screen_light.gd` | WP-28 lighting + contact shadow | 137 |
| `body_motion.gd` | walk, feet/hips clamps, support, gravity, hop, climb, ledge sit | 490 |
| `wardrobe.gd` | WP-27 outfit swap + WP-33 garments | 164 |
| `debug_tools.gd` | screenshots, bone probes, debug yaw | 115 |
- **What stays in `main.gd`:** the window and per-monitor views, the scene
build, the relay listener and dispatcher, clip choice and what happens
after a clip finishes. That's what the overlay host is for.
- **Policy vs mechanism:** the layer mixer reports a finished base clip,
and `main.gd` decides what plays next.
- **Coupling:** body motion, wardrobe and debug tools are moved as-is and
reach overlay state through a typed `host` reference. The rest are clean
APIs.
- **Verification, every step:**
- a headless startup log diffed against the pre-split run (same 169
clips and 94 tags, same per-clip retarget numbers);
- TCP drives on `-- --port=8799` (new: a second instance runs beside
live Felt), compared with the original `main.gd`:
- layers (full-body wave, migrate onto a walk, upper clap, hit
override, sitting talk): identical states and finished notices;
- pose (gaze modes, listen, nod, beat): head, neck and eyes within
0.1°;
- movement (walk, run, fall, hop, ledge sit/stand, climb): same
notices;
- outfits (Maid mid-wave and back): same;
- face, bubble and lighting messages: no script errors.
- Only the random idle pick ever differed.
- Harness: `scratch/wp35/{run.sh,layertest.sh,posetest.sh,movetest.sh,outfittest.sh,facetest.sh,drive*.py}`.
- **The live overlay still runs its old exported `.pck`.** The split
reaches her on the next overlay export.
**The studio (`5b60041`, launcher `E:\Felt\Felt Studio.bat`).**
- `studio.gd` **extends** `main.gd`, so it's the same code path as the
overlay with no fork. It overrides only:
- the window (normal, opaque, 1600×900);
- the side views, relay listener and supervisor (all off, so it never
touches live Felt);
- the gaze viewer (the orbit camera);
- the loop rule (a Loop checkbox, so walks loop in place).
- **UI:**
- orbit camera (drag / wheel) with Front, Side, Back and Overlay-view
presets;
- a searchable tag/clip tree showing each tag's layer class;
- Play / Loop / Pause / Idle and speed 0.1–2×;
- Keep / Broken / Needs fix plus a note, written to
`animations/library/REVIEW.json`;
- a screenshot button (saves to `E:\Felt\scratch\studio\`).
- **Combos:** play a base (idle/sitting, or a walk with Loop), then a
gesture. `_play_tag` routes it to the upper layer exactly as live.
- **Unattended check:** `-- --play=<tag> --shot=<png>`.
- **Skipped (ponytail; add on request):** scrub bar, GIF/WebM capture, bone
overlay and sliding-feet warning, locomotion across the grid, face,
outfit and procedural panels, send-to-live.