pub struct VoxelFrame {
pub occupancy: Vec<u32>,
pub colors: Vec<u32>,
pub color_offsets: Vec<u32>,
}Expand description
One fully-reconstructed frame in the dense-column layout. Field shapes
are validated against the clip’s dims by VoxelFrame::validate.
Fields§
§occupancy: Vec<u32>Per-column occupancy bitmask, dims[0] * dims[1] * occ_words_per_col words. Bit z & 31 of word
col * occ_words_per_col + (z >> 5) is set iff voxel (x, y, z)
is solid, where col = x + y * dims[0].
colors: Vec<u32>Voxel colours (voxlap-packed 0x80RRGGBB), ascending z within
each column, columns in col order.
color_offsets: Vec<u32>Prefix sums: color_offsets[col] is the first colour index of
column col; length dims[0] * dims[1] + 1.
Implementations§
Source§impl VoxelFrame
impl VoxelFrame
Sourcepub fn from_kv6(kv6: &Kv6) -> VoxelFrame
pub fn from_kv6(kv6: &Kv6) -> VoxelFrame
Build one dense-column VoxelFrame from a .kv6 model — the
authoring bridge from a voxel sprite to a clip frame. The frame’s
dims are the kv6’s [xsiz, ysiz, zsiz]; the kv6’s pivot +
voxel-world-size travel at the clip level (see
VoxelClip::from_kv6_frames).
.kv6 already stores surface voxels per (x, y) column in
ascending z — the very layout a frame wants — so this is a re-index
from the kv6’s x-major column order (x · ysiz + y) to the frame’s
col = x + y · xsiz, packing each column’s z’s into the occupancy
bitmask. Each column is sorted by z so the colour run is ascending
even if the source isn’t strictly ordered; voxels with z >= zsiz
are dropped (defensive against malformed input).
Sourcepub fn to_kv6(&self, dims: [u32; 3], pivot: [f32; 3]) -> Kv6
pub fn to_kv6(&self, dims: [u32; 3], pivot: [f32; 3]) -> Kv6
Inverse of from_kv6: materialise this frame as a
flat-lit .kv6 model (every voxel vis = 63, dir = 0 — voxel
clips render full-bright, so per-face normals are unused). dims is
the clip bounding box, pivot becomes the kv6 pivot. Lets a single
streaming-clip frame drive add_sprite_model / refresh_sprite_model
(one model re-uploaded per frame) instead of an N-frame flipbook.
Sourcepub fn dirs(&self, dims: [u32; 3]) -> Vec<u32>
pub fn dirs(&self, dims: [u32; 3]) -> Vec<u32>
Per-voxel surface-normal LUT indices (dir), parallel to colors,
recomputed from the occupancy — the same dirs decode
caches per frame. The GPU sprite-model upload carries these; lets an
in-place frame edit build a model identical to the register path
(rather than flat zeros). The frame must be valid for dims.
Sourcepub fn validate(&self, dims: [u32; 3]) -> Result<(), FrameError>
pub fn validate(&self, dims: [u32; 3]) -> Result<(), FrameError>
Check the field shapes + per-column occupancy/colour agreement for
the given clip dims.
§Errors
Returns the offending FrameError (wrong array length, broken
prefix-sum bounds/monotonicity, or a column whose occupancy
popcount disagrees with its colour-run length).
Trait Implementations§
Source§impl Clone for VoxelFrame
impl Clone for VoxelFrame
Source§fn clone(&self) -> VoxelFrame
fn clone(&self) -> VoxelFrame
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for VoxelFrame
impl Debug for VoxelFrame
impl Eq for VoxelFrame
Source§impl PartialEq for VoxelFrame
impl PartialEq for VoxelFrame
Source§fn eq(&self, other: &VoxelFrame) -> bool
fn eq(&self, other: &VoxelFrame) -> bool
self and other values to be equal, and is used by ==.impl StructuralPartialEq for VoxelFrame
Auto Trait Implementations§
impl Freeze for VoxelFrame
impl RefUnwindSafe for VoxelFrame
impl Send for VoxelFrame
impl Sync for VoxelFrame
impl Unpin for VoxelFrame
impl UnsafeUnpin for VoxelFrame
impl UnwindSafe for VoxelFrame
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<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
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