- Removed the old create_walk.gd script, which generated walk animations. - Introduced create_animations.gd to unify the generation of walk_left, walk_right, and stand_up animations. - Added a new SpinBox for rest timeout configuration in physics_test_harness.gd. - Enhanced StickmanRig to support automatic recovery from ragdoll state with configurable timeout. - Implemented recovery logic in StickmanRig, allowing for smooth transitions from ragdoll to animated state. - Updated animation generation logic to use new pose templates for standing and lying down positions.
9.5 KiB
9.5 KiB
Technical Debt & Optimization Log
Overview
This document tracks known technical debt, optimization opportunities, and minor improvements for the Stickman Studio project. Items are prioritized by impact and effort. Update this log as issues are identified, resolved, or deprioritized.
Current Observations
| # | Issue | Priority | Status | Notes |
|---|---|---|---|---|
| 1 | Neck Joint Free Rotation — The head can spin 360° during violent ragdoll tumbles, which looks unnatural. | Medium | Open | Consider adding angular_limit_enabled = true with ±45° limits and low stiffness to allow natural lolling while preventing full rotations. |
| 2 | Torso Capsule Origin — The torso capsule's local origin should be at its midpoint for natural rotation. Currently derived from bone distance; verify alignment. | Low | Open | Test by rotating the torso body in ragdoll mode — it should spin about its center, not its top. Adjust position offset if needed. |
| 3 | Collision Layers Separation — Bodies and terrain share layer 1/mask 1. This may cause self‑collision issues (limbs clipping through each other) under high stress. | Low | Open | Future enhancement: assign ragdoll limbs to layer 2, terrain to layer 1, and use masks to allow limb‑limb collision only where desired. |
| 4 | Performance (Ragdoll Pooling) — Spawning 10 bodies + 9 joints procedurally is fine for a single rig. If the scene ever contains dozens of ragdolls, consider a pooling system to avoid allocation spikes. | Low | Open | Not needed now, but worth noting if scaling to large crowds. |
| 5 | Line2D ↔ Capsule Radius Match — Limbs use Line2D width 16, ragdoll capsules radius 8. These align visually. |
✅ Resolved | Closed | Verified during implementation. No action needed. |
| 6 | Recovery Animation Starting Pose — The stand_up animation must work from any captured ragdoll pose. Currently uses a fixed start frame. |
High | ✅ Resolved | Phase 11: _start_recovery() captures the 10 bodies' rig‑local pose, snap‑solves the skeleton via the 6 IK targets, then _play_stand_up() tweens the markers directly from the captured values to STAND_POSE (STAND_UP_DURATION, sine ease‑in‑out) — the baked stand_up animation is not played (a fixed first keyframe can never match an arbitrary rest pose; the earlier bridge‑into‑the‑animation approach caused a visible jump and was removed). Revision: the snap now derives the hip (pos − dir·half) and wrist/ankle (pos + dir·half) from the capsule ends and subtracts the Torso bone's bone_angle for the marker rotation, so recovery starts from the ragdoll's exact final pose (e.g. sitting stays sitting). (2026‑08‑27) |
| 7 | Transition Visual Pop — The crossfade between kinematic and ragdoll currently uses a simple modulate.a lerp. This may cause ghosting if the kinematic and ragdoll poses are misaligned. |
Medium | ✅ Resolved | Phase 11: the entry is now an instant handoff — the ragdoll is built from the current solved bone positions (AnimationPlayer.stop(true) keeps the pose), then Body/* is hidden and the IK stack disabled in the same call. The earlier opacity crossfade + pin‑softness ramp was removed on director feedback (it read as ghosting, since both poses are identical). Recovery snap‑solves the kinematic skeleton to the captured ragdoll pose before re‑showing Body/*, eliminating the pop on both directions. (2026‑08‑27) |
| 8 | Rest Timeout UI — The director can adjust rest_timeout via inspector, but there is no in‑world UI in the physics harness yet. |
Low | ✅ Resolved | Phase 11: added a Rest SpinBox (0.1–10 s, step 0.1) to the harness UI that writes _rig.rest_timeout (runtime‑only), plus a "Recover Now" button → _rig.request_recovery(). (2026‑08‑27) |
| 9 | Animation Generation DRY — create_walk.gd is a standalone script. It should be merged into a unified create_animations.gd that also generates stand_up and idle animations. |
Medium | ✅ Resolved | Phase 11: create_walk.gd deleted; new scripts/create_animations.gd (@tool extends EditorScript) bakes walk_left/walk_right (same keyframes) and a one‑shot stand_up into the scene's AnimationLibrary (the baked stand_up is an authored reference only — runtime recovery tweens the IK targets directly). (2026‑08‑27) |
| 10 | Rig Collision Proxy Re‑addition — The proxy is re‑added on ragdoll exit, but may cause a brief visual pop if it appears while the kinematic rig is visible. | Low | Open | Phase 11 still re‑adds the proxy as soon as RECOVERING begins (state_changed handler), while Body/* is already visible — the static box can pop in around the standing figure before the stand‑up completes. Consider delaying re‑addition until after recovery finishes (ANIMATED). (2026‑08‑27) |
Suggested Future Improvements (Beyond Current Scope)
| Improvement | Description | Status / Priority |
|---|---|---|
| Soft Transition Blending | Add physical blending (joint stiffness ramp) to complement visual crossfade. | ✅ Done, then removed — implemented with Phase 11, but the whole crossfade was removed on director feedback (ghosting); entry is now an instant handoff. |
| Ragdoll Recovery Interruptibility | Allow the director to force a mode switch mid‑recovery (e.g., if they want the character to ragdoll again immediately). | ✅ Done |
| Multiple Rig Support | Ensure all state variables are instance‑specific (already true) and that the harness can manage multiple rigs. | Future |
| Animation Blending (IK vs. Physics) | Blend between the animation‑driven pose and the ragdoll pose during transition to prevent snapping. | Future |
| Save/Load for Ragdoll State | Save the current ragdoll pose to .stk (e.g., for storyboarding a fall). |
Future |
How to Use This Log
- New Issues: Add a row with
#, description,Priority(Low/Medium/High),Status(Open/In Progress/Resolved/Deprecated), andNotes. - Resolving Issues: Change
StatustoResolvedand add a note with the date and fix details. - Deprioritizing: If an issue is no longer relevant, mark it
Deprecatedwith a brief reason. - Quarterly Review: Revisit this log every major milestone to reassess priorities.
Change Log
| Date | Change |
|---|---|
| 2026-08-26 | Initial creation — migrated observations from Phase 10 review. |
| 2026-08-27 | Phase 11 resolved #6 (recovery starting pose), #7 (transition visual pop), #8 (rest timeout UI), #9 (animation generation DRY); #10 (proxy re‑addition) remains open with updated scope. Later revision: stand‑up recovery switched from bridge‑into‑baked‑animation to a direct marker tween (captured pose → STAND_POSE), fixing a visible jump; baked stand_up kept as authored reference only. Second revision: ragdoll entry builds from the current solved bone positions (IK disabled only after the blend completes) and the recovery snap derives joint ends from capsule half‑heights with Torso bone_angle compensation, fixing the entry pose‑pop and the "recovery starts lying" bugs. Third revision: the entire crossfade/blend (transition_duration, BlendDirection, opacity fade, softness ramp) was removed on director feedback — entry is now an instant handoff (build at current pose → hide Body/* → disable IK in one call), since the ragdoll spawns at the identical pose and a fade only read as ghosting. |
End of Log