pub struct VoxelClip {
pub dims: [u32; 3],
pub pivot: [f32; 3],
pub voxel_world_size: f32,
pub loop_mode: LoopMode,
pub default_frame_ms: u32,
pub frames: Vec<EncodedFrame>,
pub durations: Vec<u32>,
pub extra_chunks: Vec<([u8; 4], Vec<u8>)>,
}Expand description
On-disk animated voxel clip. Construct via VoxelClip::from_frames
(the encoder) or VoxelClip::parse; expand to a runtime flipbook
via VoxelClip::decode.
Fields§
§dims: [u32; 3]§pivot: [f32; 3]§voxel_world_size: f32§loop_mode: LoopMode§default_frame_ms: u32Frame duration used when durations is empty.
frames: Vec<EncodedFrame>I/P frame stream. The first frame must be a Key.
durations: Vec<u32>Per-frame durations (ms); empty ⇒ uniform default_frame_ms.
extra_chunks: Vec<([u8; 4], Vec<u8>)>Unknown top-level chunks, preserved verbatim for forward-compat.
Implementations§
Source§impl VoxelClip
impl VoxelClip
Sourcepub fn occ_words_per_col(&self) -> u32
pub fn occ_words_per_col(&self) -> u32
u32 occupancy words per column for this clip.
pub fn frame_count(&self) -> usize
Sourcepub fn from_kv6_frames(
frames: &[Kv6],
voxel_world_size: f32,
loop_mode: LoopMode,
durations: &[u32],
default_frame_ms: u32,
keyframe_interval: u32,
) -> Result<VoxelClip, Kv6ImportError>
pub fn from_kv6_frames( frames: &[Kv6], voxel_world_size: f32, loop_mode: LoopMode, durations: &[u32], default_frame_ms: u32, keyframe_interval: u32, ) -> Result<VoxelClip, Kv6ImportError>
Build a clip from a sequence of .kv6 frames sharing one
[xsiz, ysiz, zsiz] — the authoring path from animated voxel
sprites to a .rvc clip. Each kv6 becomes a VoxelFrame via
VoxelFrame::from_kv6, then the lot is encoded with
VoxelClip::from_frames (frame 0 + every keyframe_interval-th a
keyframe; 0 ⇒ only frame 0). The pivot comes from the first
frame’s kv6; voxel_world_size is the render scale (.kv6 carries
none). durations is per-frame ms (empty ⇒ uniform
default_frame_ms).
§Errors
Kv6ImportError::Empty if frames is empty;
Kv6ImportError::DimsMismatch if any frame’s dims differ from the
first (clips are fixed-bbox).
Sourcepub fn from_kv6_frames_auto(
frames: &[Kv6],
voxel_world_size: f32,
loop_mode: LoopMode,
durations: &[u32],
default_frame_ms: u32,
max_keyframe_gap: u32,
) -> Result<VoxelClip, Kv6ImportError>
pub fn from_kv6_frames_auto( frames: &[Kv6], voxel_world_size: f32, loop_mode: LoopMode, durations: &[u32], default_frame_ms: u32, max_keyframe_gap: u32, ) -> Result<VoxelClip, Kv6ImportError>
Like from_kv6_frames but auto-chooses
keyframe vs. delta per frame via
from_frames_auto (VCL.1) — the turnkey
“import .kv6 frames into a well-encoded clip” path. max_keyframe_gap
caps keyframe spacing (0 = fully cost-driven).
§Errors
Same as from_kv6_frames.
Sourcepub fn from_frames(
dims: [u32; 3],
pivot: [f32; 3],
voxel_world_size: f32,
loop_mode: LoopMode,
frames: &[VoxelFrame],
durations: &[u32],
default_frame_ms: u32,
keyframe_interval: u32,
) -> VoxelClip
pub fn from_frames( dims: [u32; 3], pivot: [f32; 3], voxel_world_size: f32, loop_mode: LoopMode, frames: &[VoxelFrame], durations: &[u32], default_frame_ms: u32, keyframe_interval: u32, ) -> VoxelClip
Encode a sequence of full frames into a clip. Frame 0 (and every
keyframe_interval-th frame) is stored as a keyframe; the rest are
diffed against the previous frame. keyframe_interval == 0 ⇒ only
frame 0 is a keyframe (smallest, but no mid-stream seek points).
durations is per-frame ms; pass an empty slice for uniform
default_frame_ms.
§Panics
If any frame fails VoxelFrame::validate for dims, or
durations is non-empty but not frames.len() long.
Sourcepub fn from_frames_auto(
dims: [u32; 3],
pivot: [f32; 3],
voxel_world_size: f32,
loop_mode: LoopMode,
frames: &[VoxelFrame],
durations: &[u32],
default_frame_ms: u32,
max_keyframe_gap: u32,
) -> VoxelClip
pub fn from_frames_auto( dims: [u32; 3], pivot: [f32; 3], voxel_world_size: f32, loop_mode: LoopMode, frames: &[VoxelFrame], durations: &[u32], default_frame_ms: u32, max_keyframe_gap: u32, ) -> VoxelClip
Encode a sequence of full frames, auto-choosing keyframe vs. delta
per frame (VCL.1) instead of a fixed interval — the codec’s I-frame
decision. A frame is stored as a keyframe when its delta would be
large (a “scene change”: at least [KEYFRAME_COST_PCT]% of the
keyframe’s size — a delta that big is barely a saving and a keyframe
is independently seekable), or when max_keyframe_gap frames have
passed since the last keyframe (a seekability cap; 0 = no cap, fully
cost-driven). Frame 0 is always a keyframe. Otherwise identical to
from_frames.
§Panics
Same as from_frames.
Sourcepub fn decode(&self) -> Result<DecodedClip, DecodeError>
pub fn decode(&self) -> Result<DecodedClip, DecodeError>
Expand the I/P stream to full frames, compute per-frame dirs, and
resolve durations — the runtime flipbook.
§Errors
DecodeError::DeltaBeforeKey if the stream doesn’t start with a
keyframe; DecodeError::ColumnOutOfRange if a delta names a
column outside dims; DecodeError::Frame if a reconstructed
frame fails validation.
Sourcepub fn serialize(&self) -> Vec<u8> ⓘ
pub fn serialize(&self) -> Vec<u8> ⓘ
Serialise to the .rvc byte form. Round-trips byte-equally with
VoxelClip::parse.
Sourcepub fn parse(bytes: &[u8]) -> Result<VoxelClip, ParseError>
pub fn parse(bytes: &[u8]) -> Result<VoxelClip, ParseError>
Parse the .rvc byte form.
§Errors
ParseError for a bad magic / unsupported version / truncation /
missing required chunk / malformed frame stream.
Trait Implementations§
impl StructuralPartialEq for VoxelClip
Auto Trait Implementations§
impl Freeze for VoxelClip
impl RefUnwindSafe for VoxelClip
impl Send for VoxelClip
impl Sync for VoxelClip
impl Unpin for VoxelClip
impl UnsafeUnpin for VoxelClip
impl UnwindSafe for VoxelClip
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