#[non_exhaustive]pub struct VolumeMeshData {
pub positions: Vec<[f32; 3]>,
pub cells: Vec<[u32; 8]>,
pub cell_scalars: HashMap<String, Vec<f32>>,
pub cell_colours: HashMap<String, Vec<[f32; 4]>>,
}Expand description
Input data for an unstructured volume mesh (tets, hexes, or mixed).
Each cell is represented as exactly 8 vertex indices. For cells with fewer
than 8 vertices, fill unused slots with CELL_SENTINEL (u32::MAX).
use viewport_lib::{VolumeMeshData, CELL_SENTINEL};
// Two tets sharing vertices 0-1-2
let mut data = VolumeMeshData::default();
data.positions = vec![
[0.0, 0.0, 0.0],
[1.0, 0.0, 0.0],
[0.5, 1.0, 0.0],
[0.5, 0.5, 1.0],
[0.5, 0.5, -1.0],
];
data.cells = vec![
[0, 1, 2, 3, CELL_SENTINEL, CELL_SENTINEL, CELL_SENTINEL, CELL_SENTINEL],
[0, 2, 1, 4, CELL_SENTINEL, CELL_SENTINEL, CELL_SENTINEL, CELL_SENTINEL],
];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.positions: Vec<[f32; 3]>Vertex positions in local space.
cells: Vec<[u32; 8]>Cell connectivity : exactly 8 indices per cell.
Tets: first 4 indices are the tet vertices; indices [4..8] must be
CELL_SENTINEL. Hexes: all 8 indices are valid. Other cell types
use CELL_SENTINEL to pad unused slots (see module-level docs).
cell_scalars: HashMap<String, Vec<f32>>Named per-cell scalar attributes (one f32 per cell).
Automatically remapped to boundary face scalars during upload so they
can be visualised via AttributeKind::Face.
cell_colours: HashMap<String, Vec<[f32; 4]>>Named per-cell RGBA colour attributes (one [f32; 4] per cell).
Automatically remapped to boundary face colours during upload, rendered
via AttributeKind::FaceColour.
Implementations§
Source§impl VolumeMeshData
impl VolumeMeshData
Sourcepub fn push_tet(&mut self, a: u32, b: u32, c: u32, d: u32)
pub fn push_tet(&mut self, a: u32, b: u32, c: u32, d: u32)
Append a tetrahedral cell (4 vertices).
Slots [4..8] are filled with CELL_SENTINEL automatically.
Sourcepub fn push_pyramid(&mut self, base: [u32; 4], apex: u32)
pub fn push_pyramid(&mut self, base: [u32; 4], apex: u32)
Append a pyramidal cell (square base + apex, 5 vertices).
base holds the four base vertices in VTK order (counter-clockwise
when viewed from outside the cell); apex is the tip vertex.
Slots [5..8] are filled with CELL_SENTINEL automatically.
Sourcepub fn push_wedge(&mut self, tri0: [u32; 3], tri1: [u32; 3])
pub fn push_wedge(&mut self, tri0: [u32; 3], tri1: [u32; 3])
Append a wedge (triangular prism) cell (6 vertices).
tri0 and tri1 are the bottom and top triangular faces; vertex
tri1[i] is directly above tri0[i], forming the three lateral quad
faces. Slots [6..8] are filled with CELL_SENTINEL automatically.
Trait Implementations§
Source§impl Default for VolumeMeshData
impl Default for VolumeMeshData
Source§fn default() -> VolumeMeshData
fn default() -> VolumeMeshData
Auto Trait Implementations§
impl Freeze for VolumeMeshData
impl RefUnwindSafe for VolumeMeshData
impl Send for VolumeMeshData
impl Sync for VolumeMeshData
impl Unpin for VolumeMeshData
impl UnsafeUnpin for VolumeMeshData
impl UnwindSafe for VolumeMeshData
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.