Fix the pose harness: disable the avatar process so the FSM cannot revert the pose
Full build / Import + headless tests (push) Successful in 46s
Full build / Full desktop build + optional release (push) Skipped

This commit is contained in:
zwitschi committed 2026-11-04 11:24:35 +01:00
1 parent 75dea2e7c2
commit e984129597
4 files changed
+52 -31

No files matched your search

+7 -5
View File
@@ -86,11 +86,13 @@ canonical implemented-features list in `docs/development-status.md`.
sculpting in `_face()`/`_hands_and_shoes()`); `tools/npc_pipeline.py` builds **only**
`assets/models/generated/npc_base.glb`, the frozen plain-primitive fallback. Reading
`npc_pipeline.py` to judge the library's face/hand detail is wrong.
- **Pose capture is blocked** (narrowed 2026-11-03): the recipe (SubViewport + `force_draw()` +
`force_update_all_bone_transforms()` + disabled process/physics) still yields byte-identical rest
frames. Decisive probe: teleporting the avatar renders (diff 10) but moving its `Rig` child does
not (diff 0) — the skinned mesh ignores its `Rig` parent transform. Next attempt must answer
that, or stage poses via the known-good `capture_npc_review.gd`.
- **Pose capture fixed (2026-11-04):** the harness was missing `set_physics_process(false)`/
`set_process(false)` on the avatar, so the FSM (`_advance_fsm` + `_move_toward_target`) ran every
tick, reset `arrived`/velocity and made `theater_pose()` revert to idle/rest. Disabling both fixes
it (sit vs idle diff 5.63, walk vs idle 2.29). The earlier "moving the `Rig` child does not
render" probe was a red herring — it set the position inside `_shoot()` in the same frame as
`root.get_texture().get_image()`, so it never rendered a frame. Lesson: pose/portrait harnesses
must freeze the avatar's process/physics before driving `_animate()`.
- Capture/pose harness gotchas: scripts that read captured-mouse input must run windowed
(`smoke_props.gd`); the NPC FSM rewrites `rotation.y` every physics tick, so pose/portrait
captures set the yaw after `set_physics_process(false)`; `visible=false` does not keep the crowd