BlendClock

from acron.anim import BlendClock
class BlendClock(actor)

Bases: object

One animation clock per clip – Godot’s AnimationTree, on Acron.

Godot advances every input of a blend by the same delta each process tick; each AnimationNodeAnimation wraps at its own length, and the mixer reads all of them at that instant. Acron has no such tick: Actor.loop hands a clip to the GLOBAL clock – the display’s, not the fixed step’s – and a port that poses only the loudest clip therefore has a blend in which

  • every quieter clip free-runs at the display rate, out of phase with the one that is driven, and ignoring the tree’s TimeScale, and

  • a clip that was posed once and then stopped being the loudest FREEZES at the frame it was left on, because pose() stops the control – so the pose jumps at every weight crossing, twice per walk-to-idle.

Both are invisible to a test that watches the body: the character is in the right place, moving at the right speed, wearing a pose assembled out of clips at unrelated frames. This keeps one time per clip name, advances each by dt * rate (the AnimationNodeTimeScale above it), wraps it at that clip’s own length, and poses EVERY control the clip has – a split skeleton keeps one per Actor subpart, and they must land on one frame or the two halves of the character animate against each other.

A clip’s clock starts at 0 when it enters the blend and is dropped when it leaves, which is Godot’s input_N/reset on a Transition: a jump clip begins at its first frame every jump, instead of wherever a shared clock happened to be.

Inheritance diagram

digraph inheritancef375c8b081 { bgcolor=transparent; rankdir=BT; size="8.0, 12.0"; "BlendClock" [URL="acron.anim.BlendClock.html#acron.anim.BlendClock",fillcolor=white,fontname="Vera Sans, DejaVu Sans, Liberation Sans, Arial, Helvetica, sans",fontsize=11,height=0.25,shape=box,style="",target="_top",tooltip="One animation clock per clip -- Godot's ``AnimationTree``, on Acron."]; }