Skip to content

Character (Animation Controller)

App: apps/character_anim/

The end-to-end demo for the Animation Controller: a skinned Blender character (Character.blend / Fire_Sprite) driven through node.attachController("controllers/biped.toml"). The controller owns and drives the character’s pose from a TOML-authored graph — a blend-node locomotion State, a typed speed param fed from input, root-motion designation, and a tagged cancel section — and the engine auto-ticks it each frame. The character skins and animates on the GPU via the controller (not node.animations).

(This sits alongside — it does not replace — character_controller, the Jolt CharacterVirtual physics demo. “Controller” here is the animation controller.)

Terminal window
% ./plume3d character_anim
KeyAction
WASD / Arrow keysMove → sets the speed blend param
ShiftRun (higher speed)
EA one-shot intent that is buffered and consumed only inside the clip’s cancel section
Mouse (right-drag)Fly-camera look
  • node.attachController(path) loads a TOML controller asset and binds it to the skinned node; the engine hot-reloads it if you edit the file while it runs.
  • A blend-node locomotion State (blend1d over speed) authored in TOML.
  • Typed params driven from input, and a behaviour hook (onEnter) firing from the auto-tick.
  • Clip phase: a tagged cancel section drives the input-buffering / cancel-window pattern — an E press is held and consumed only while ctrl.inSection("cancel").
  • Root motion (read-only): ctrl.rootMotionDelta is applied to the character’s transform.

The shipped Character.blend carries a single action (Idle_ArmSwing), so the locomotion blend is a single-entry blend1d and there is no distinct masked-Action clip yet. A full walk/run blend and an upper-body Action need a richer rig (multiple actions) — the engine supports both today (they are unit-tested); the demo is fixture-limited, not engine-limited.