Avatar physics bones: bone drifts to an unrelated spot after an animation on it ends #207

Closed
opened 2026-09-30 19:25:43 +00:00 by sky_line · 2 comments
Owner

Avatar physics (jiggle / bounce: breasts, belly, butt, and the bento collision-volume bones they drive) has several bugs, some inherited from LL. This ticket starts with the most visible one and tracks the rest as they're found.

Bug 1: drift after an animation releases the bone

When an animation animates a physics-driven bone and then ends, the bone doesn't return to its rest position. It drifts to some unrelated spot, and physics then continues from there. Expected: when the animation releases the bone, it goes back to its original (rest + visual-param) position first, and physics resumes from that rest pose.

Background

  • LLPhysicsMotion (indra/newview/llphysicsmotion.cpp) simulates each physics group and writes "driven" visual params (*_Physics_*_Driven). Those params deform collision-volume joints (position / scale via skeletal distortions).
  • Under Vulkan the GPU animation store (llcleananimstore.cpp) evaluates keyframes on the GPU. Non-animation local writes (visual params, avatar physics, joint overrides, skeleton resets) are tracked per joint by LLJoint::mGpuExtWrite and uploaded as base writes applied before the blend.
  • The handoff between an animation that owns a joint and the physics / visual-param writes, and what the joint's base state is when the animation's weight goes to zero, is where the drift comes from.

Other physics issues to fold in here (fill in as found)

  • Drift after the animation ends (above).
  • ...
Avatar physics (jiggle / bounce: breasts, belly, butt, and the bento collision-volume bones they drive) has several bugs, some inherited from LL. This ticket starts with the most visible one and tracks the rest as they're found. ## Bug 1: drift after an animation releases the bone When an animation animates a physics-driven bone and then ends, the bone doesn't return to its rest position. It drifts to some unrelated spot, and physics then continues from there. **Expected:** when the animation releases the bone, it goes back to its original (rest + visual-param) position first, and physics resumes from that rest pose. ## Background - `LLPhysicsMotion` (`indra/newview/llphysicsmotion.cpp`) simulates each physics group and writes "driven" visual params (`*_Physics_*_Driven`). Those params deform collision-volume joints (position / scale via skeletal distortions). - Under Vulkan the GPU animation store (`llcleananimstore.cpp`) evaluates keyframes on the GPU. Non-animation local writes (visual params, avatar physics, joint overrides, skeleton resets) are tracked per joint by `LLJoint::mGpuExtWrite` and uploaded as base writes applied before the blend. - The handoff between an animation that owns a joint and the physics / visual-param writes, and what the joint's base state is when the animation's weight goes to zero, is where the drift comes from. ## Other physics issues to fold in here (fill in as found) - [ ] Drift after the animation ends (above). - [ ] ...
Author
Owner

Bug 1 (drift after an animation releases the bone): fixed in bb867f35ab.

  • Physics and shape deltas are held while an animation drives a bone's position.
  • When the animation lets go, the bone stays where the animation left it (sticky, as in every viewer, so "reset" animations work), with the held deltas applied on top.
  • Under the GPU animation path, the CPU copy tracks the animated pose while held, so no stale value gets uploaded on release.

Confirmed working in-world. RenderVKPhysicsDiag (debug) logs the physics collision volumes for your avatar or RenderVKDumpAvatar's, for any further physics reports.

Leaving this open as the umbrella for the other avatar-physics issues as they're found.

**Bug 1 (drift after an animation releases the bone): fixed in bb867f35ab.** - Physics and shape deltas are held while an animation drives a bone's position. - When the animation lets go, the bone stays where the animation left it (sticky, as in every viewer, so "reset" animations work), with the held deltas applied on top. - Under the GPU animation path, the CPU copy tracks the animated pose while held, so no stale value gets uploaded on release. Confirmed working in-world. `RenderVKPhysicsDiag` (debug) logs the physics collision volumes for your avatar or `RenderVKDumpAvatar`'s, for any further physics reports. Leaving this open as the umbrella for the other avatar-physics issues as they're found.
sky_line added this to the Slipstream project 2026-10-06 15:04:15 +00:00
Author
Owner

Done. Bug 1 (drift after an animation releases a physics-driven bone) fixed in bb867f35ab and confirmed working in-world (see the earlier comment). No other physics bugs are listed on this ticket; file new ones separately. Shipped in 1.2.0.

Done. Bug 1 (drift after an animation releases a physics-driven bone) fixed in bb867f35ab and confirmed working in-world (see the earlier comment). No other physics bugs are listed on this ticket; file new ones separately. Shipped in 1.2.0.
sky_line 2026-10-10 05:32:59 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
sky_line/Slipstream#207
No description provided.