pub struct Character {
pub name: String,
pub root: [f32; 3],
pub meshes: Vec<Kv6>,
pub bones: Vec<Bone>,
pub clips: Vec<Clip>,
pub voxel_clips: Vec<VoxelClip>,
pub extra_chunks: Vec<([u8; 4], Vec<u8>)>,
}Expand description
A parsed rigged-character container.
Index conventions that the byte layout depends on:
meshesis indexed bymesh_id(MeshRef::Static).bonesindex is the canonical bone index — the column index of every clip’sfrmvaland ofKfaSprite::kfaval, and the target of everyHinge::parent.
Fields§
§name: StringHuman-facing name (META). May be empty.
root: [f32; 3]World placement passed to KfaSprite::new (META).
meshes: Vec<Kv6>Bone meshes (MSHS), indexed by mesh_id.
bones: Vec<Bone>The skeleton (BONS); index = canonical bone index.
clips: Vec<Clip>Named animation clips (CLPS). May be empty (a posable rig with
no baked animation).
voxel_clips: Vec<VoxelClip>Embedded animated voxel clips (VCLP, VCL.5), indexed by
MeshRef::Clip. May be empty.
extra_chunks: Vec<([u8; 4], Vec<u8>)>Unknown top-level chunks preserved verbatim so re-saving with an older build doesn’t strip newer data. Re-emitted after the known chunks in encounter order. Empty for canonically-written files.
Implementations§
Source§impl Character
impl Character
Sourcepub fn to_kfa_sprite(&self, clip: Option<usize>) -> KfaSprite
pub fn to_kfa_sprite(&self, clip: Option<usize>) -> KfaSprite
Build a renderable KfaSprite. clip selects a Skeletal
clip to bake in via KfaSprite::set_animation; None leaves
the sprite in its rest pose for the host to drive kfaval
directly. A non-Skeletal (Unknown) clip selection is ignored
(no animation attached).
Meshes are cloned per call. Editors that re-pose every frame should build the sprite once and reuse it.
§Panics
Panics if clip is out of range, or if a bone’s MeshRef::Static
index is out of range for Character::meshes. Character
values from parse keep mesh indices in range.
Sourcepub fn to_kfa(&self, clip: Option<usize>, kv6_name: impl Into<Vec<u8>>) -> Kfa
pub fn to_kfa(&self, clip: Option<usize>, kv6_name: impl Into<Vec<u8>>) -> Kfa
Export a lossy voxlap-toolchain Kfa (.kfa): the skeleton
plus one clip, referencing a single kv6 by filename.
voxlap’s .kfa is fundamentally narrower than this container — it
stores the hinge skeleton and one animation, but points at just
one kv6 file (voxlap rigs a single mesh with a per-voxel limb
index, which roxlap deliberately doesn’t model). So this export
drops, by design:
- every embedded
Character::meshesmesh — onlykv6_name(the filename voxlap should load) is written. Export the bone meshes separately viakv6::serializeif a tool needs them. - every clip except
clip.
clip selects the ClipData::Skeletal clip whose frmval /
seq to bake in. None, an out-of-range index, or a
non-Skeletal clip yields an empty animation table (a posable rig
with no baked motion). Serialise the result with
kfa::serialize.
Trait Implementations§
Auto Trait Implementations§
impl Freeze for Character
impl RefUnwindSafe for Character
impl Send for Character
impl Sync for Character
impl Unpin for Character
impl UnsafeUnpin for Character
impl UnwindSafe for Character
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more