Skip to content

Animation, the rest: docs, a character component, natural motion (#853) - #905

Merged
nicolas-maman merged 2 commits into
mainfrom
feat/anim-remaining
Nov 2, 2026
Merged

nicolas-maman merged 2 commits into
mainfrom
feat/anim-remaining

Conversation

@nicolas-maman

Copy link
Copy Markdown
Collaborator

All the remaining animation work in one pull request, in this order: the README, docs and images (#902), a character component (#903), then natural motion (#858, #859, #861), with the other milestones alongside. #891 landed the pipeline's first layers and closed its milestones before their lists were met; they are reopened, each with its remaining work written out. A box is ticked only when its issue's own list is met on this branch.

Issues

In this push

Handing a figure between writers, which Siltreach needs to put its settlers on the pipeline while motion sits them down (part of #860):

  • An animator freed while the engine runs leaves the engine's loop. It used to stay in it, and the pose phase called it on freed memory.
  • A behaviour removed mid-frame no longer shifts the list under the loop walking it: its slot is emptied and the holes close at the next frame. With the old removal, an animator freed in the pose phase left the next figure unposed for that frame (its clock 20 frames on of 21; now 21 of 21).
  • animator.pause / resume: paused, it writes none of the figure's joints (what another writer drew stands, 3·10⁻⁶° off). Resumed over 0.3 s, it eases out of that pose: the fastest joint turn is 9.7 rad/s against the clips' own 8.3 plus the easing's 6.7. Taken back at once, it snaps at 60.9 rad/s. ikrig.feet_reset lets go of locks held from before the pause.
  • animator.share_take: one take retargeted once and shared by every figure on a rig. It plays alike on two figures, outlives their animators, and is refused to a rig of another size.

test_anim_pipeline: 85 checks, all passing.

What Siltreach needs to put its settlers on the pipeline while motion
sits them down, eats and stands them up (2026-11-01):

- animator_free left its behaviour in the engine, so the pose phase
  went on calling it on freed memory. It removes and frees it now.
- engine_remove_behaviour took the behaviour out of the list the phase
  loops walk, so one removed mid-frame shifted the rest under the loop:
  with an animator freed in the pose phase, the next figure went unposed
  that frame (its clock 20 frames on of 21; now 21 of 21). The slot is
  emptied and the holes close at the start of the next frame; the
  behaviour count and index skip them.
- animator.pause / resume: paused, it writes none of the figure's
  joints and reads back what another writer draws (what stood was
  3e-6 degrees off it). Resumed over 0.3 s it eases out of that pose,
  inertialized as a transition is: the fastest joint turn 9.7 rad/s
  against the clips' own 8.3 plus the easing's 6.7; at once, it snaps
  at 60.9. ikrig.feet_reset lets go of the locks held before the pause.
- animator.share_take: a take retargeted once serves every figure on a
  rig, not freed with any of them; refused to a rig of another size.

test_anim_pipeline 85 checks, test_ik_constraints 16, test_matching 16,
and the suites that remove behaviours (campath, orbitcam, audio,
buoyancy, worldsound) all pass.
After #891, a merge that touched most of the engine, main's first Linux
run on the 26.04 image built cold and its linux and linux-2 legs were cut
off at 34 minutes in Run CI (run 41279330619), each leaving a rerun to
finish what it had started. A cut-off run and its rerun cost more than
one run let finish, and a warm shard (24 minutes) never comes near the
limit. Run CI stops at 54, six inside it, so a cut-off run still saves
its compile cache.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment