Context
A character must aim a pistol while walking: legs play walk, upper body plays aim_pistol. The animation system plays exactly one clip per entity today (PlayAnimation/CrossFade) — layered animations with bone masks are listed as a verified gap. Without this, every locomotion × weapon combination needs its own full-body clip (combinatorial explosion: 4 weapons × 5 movement states = 20 authored clips instead of 9).
Goal
Layered evaluation in AnimationService: a base layer (full body) plus override layers restricted to a bone mask (e.g. spine-up), each with its own clip, time and weight — composited into one palette before the existing GPU upload. Additive mode optional in v1; override mode is the priority.
Acceptance Criteria
Technical Notes
Composite in local space per bone before hierarchy multiplication (blend local TRS by mask weight), not on world palettes. Keep the single-clip fast path untouched when no layers are active.
Dependencies
- None strictly; pairs with 'animation: synced multi-entity clips — character + weapon animation pairs'
Context
A character must aim a pistol while walking: legs play
walk, upper body playsaim_pistol. The animation system plays exactly one clip per entity today (PlayAnimation/CrossFade) — layered animations with bone masks are listed as a verified gap. Without this, every locomotion × weapon combination needs its own full-body clip (combinatorial explosion: 4 weapons × 5 movement states = 20 authored clips instead of 9).Goal
Layered evaluation in
AnimationService: a base layer (full body) plus override layers restricted to a bone mask (e.g. spine-up), each with its own clip, time and weight — composited into one palette before the existing GPU upload. Additive mode optional in v1; override mode is the priority.Acceptance Criteria
UpperBody = Spine1+animator.PlayLayered(clip, layer, mask, weight)Technical Notes
Composite in local space per bone before hierarchy multiplication (blend local TRS by mask weight), not on world palettes. Keep the single-clip fast path untouched when no layers are active.
Dependencies