#[non_exhaustive]pub struct SparseVolumeGridData {
pub origin: [f32; 3],
pub cell_size: f32,
pub active_cells: Vec<[u32; 3]>,
pub cell_scalars: HashMap<String, Vec<f32>>,
pub node_scalars: HashMap<String, Vec<f32>>,
pub cell_colors: HashMap<String, Vec<[f32; 4]>>,
}Expand description
Input data for a sparse regular voxel grid.
Only the cells listed in active_cells are considered occupied. Boundary
faces (faces not shared between two active cells) are extracted and uploaded
as a standard surface mesh.
§Attribute conventions
cell_scalars/cell_colors: one entry per element ofactive_cells(parallel arrays).node_scalars: dense array indexed bynk * (W * H) + nj * W + niwhereW = max_i + 2,H = max_j + 2andmax_i,max_j,max_kare derived fromactive_cells(see module docs). Set via [AttributeRef { kind: AttributeKind::Face, .. }] after upload — node scalars are averaged to face scalars during extraction.
§Upload
use viewport_lib::{SparseVolumeGridData, AttributeKind, AttributeRef};
use std::collections::HashMap;
let mut data = SparseVolumeGridData::default();
data.origin = [-1.0, -1.0, -1.0];
data.cell_size = 1.0;
data.active_cells = vec![[0, 0, 0], [1, 0, 0]];
data.cell_scalars.insert("pressure".to_string(), vec![0.3, 0.8]);
// upload via resources.upload_sparse_volume_grid_data(device, &data)Fields (Non-exhaustive)§
This struct is marked as non-exhaustive
Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.origin: [f32; 3]World-space position of the [0, 0, 0] corner of cell [0, 0, 0].
cell_size: f32Side length of one cubic cell in world units. Must be positive.
active_cells: Vec<[u32; 3]>Grid indices [i, j, k] of occupied cells.
cell_scalars: HashMap<String, Vec<f32>>Named per-cell scalar attributes (one f32 per active cell, parallel to
active_cells). Remapped to AttributeKind::Face during extraction.
node_scalars: HashMap<String, Vec<f32>>Named per-node scalar attributes. Dense array; see module-level
indexing convention. Averaged over 4 quad corners to produce
AttributeKind::Face values.
cell_colors: HashMap<String, Vec<[f32; 4]>>Named per-cell RGBA color attributes (one [f32; 4] per active cell,
parallel to active_cells). Remapped to AttributeKind::FaceColor
during extraction.
Trait Implementations§
Source§impl Default for SparseVolumeGridData
impl Default for SparseVolumeGridData
Source§fn default() -> SparseVolumeGridData
fn default() -> SparseVolumeGridData
Auto Trait Implementations§
impl Freeze for SparseVolumeGridData
impl RefUnwindSafe for SparseVolumeGridData
impl Send for SparseVolumeGridData
impl Sync for SparseVolumeGridData
impl Unpin for SparseVolumeGridData
impl UnsafeUnpin for SparseVolumeGridData
impl UnwindSafe for SparseVolumeGridData
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> 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>, which can then be
downcast into Box<dyn 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>, which 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> DowncastSend for T
impl<T> DowncastSend for T
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 moreSource§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.