pub struct KfaSprite {
pub limbs: Vec<Sprite>,
pub hinges: Vec<Hinge>,
pub hinge_sort: Vec<usize>,
pub kfaval: Vec<i16>,
pub p: [f32; 3],
pub s: [f32; 3],
pub h: [f32; 3],
pub f: [f32; 3],
}Expand description
One animated KFA sprite — bones + hinges + per-bone live animation values.
The host owns one of these per animated model, updates kfaval[]
over time, and passes it to roxlap-core’s draw_kfa_sprite each
frame. Construction is data-only (this crate); rendering is in
roxlap-core.
Fields§
§limbs: Vec<Sprite>One crate::sprite::Sprite per bone. Limb i’s
(s, h, f, p) is computed per frame by the renderer from
the parent’s transform + hinge math; the kv6 field holds
the bone’s kv6 mesh and never changes.
hinges: Vec<Hinge>Bone hierarchy. Mirror of voxlap’s kfatype.hinge[].
hinge_sort: Vec<usize>Topological sort of bone indices — populated once at construction, used by the renderer’s per-frame loop.
kfaval: Vec<i16>Per-bone animation value. Voxlap’s vx5.kfaval[]. Q15
angle (full circle = 65536). Host updates per frame.
p: [f32; 3]World-space anchor of the root limb’s hinge.p[0]. The
root limb is positioned so hinge.p[0] lands at this
point given the world basis below.
s: [f32; 3]World-space basis for the root limb. Mirror of
vx5sprite.{s, h, f} for the root.
h: [f32; 3]§f: [f32; 3]Implementations§
Source§impl KfaSprite
impl KfaSprite
Sourcepub fn new(limbs: Vec<Sprite>, hinges: Vec<Hinge>, root_pos: [f32; 3]) -> Self
pub fn new(limbs: Vec<Sprite>, hinges: Vec<Hinge>, root_pos: [f32; 3]) -> Self
Build a KFA sprite from a list of (Sprite, Hinge) bones.
limbs.len() must equal hinges.len(). The first bone with
parent < 0 is the root.
kfaval is initialised to all zeros; the host should set
per-bone angles before / between render calls.
§Panics
Panics if limbs.len() != hinges.len().