pub struct MeshData {
pub vertices: Vec<Vertex>,
pub indices: Vec<u32>,
pub albedo: Option<Arc<Albedo>>,
pub base_color: [f32; 4],
pub parts: Vec<MeshPart>,
pub dependencies: Vec<String>,
}Expand description
Indexed CPU triangle mesh with optional imported material information. Indices refer into vertices; call validate before uploading externally generated data.
Fields§
§vertices: Vec<Vertex>Interleaved triangle vertices.
indices: Vec<u32>Triangle-list indices; length must be divisible by three.
albedo: Option<Arc<Albedo>>Base-colour texture of the model’s first textured material, if it had one.
base_color: [f32; 4]Base-colour factor of the model’s first material (white if none).
parts: Vec<MeshPart>Material runs for models with several materials (empty = the whole mesh uses albedo).
dependencies: Vec<String>Asset-relative source files referenced by an imported mesh (buffers/textures). Render caches watch these dependencies as well as the model file itself.
Implementations§
Source§impl MeshData
impl MeshData
Sourcepub fn triangle_count(&self) -> usize
pub fn triangle_count(&self) -> usize
Number of complete indexed triangles. Use Self::validate to reject a trailing index.
Sourcepub fn is_empty(&self) -> bool
pub fn is_empty(&self) -> bool
Whether there are no drawable triangles (vertices alone do not draw anything).
Sourcepub fn validate(&self) -> Result<(), String>
pub fn validate(&self) -> Result<(), String>
Checks triangle topology, finite vertex attributes and embedded image dimensions. Zero-length normals and degenerate triangles are allowed (common at primitive poles).
Sourcepub fn recalculate_normals(&mut self) -> Result<(), String>
pub fn recalculate_normals(&mut self) -> Result<(), String>
Recomputes area-weighted smooth vertex normals from indexed triangles. Checks topology/positions before mutation; isolated vertices receive zero normals.
Sourcepub fn transformed(&self, matrix: Mat4) -> Result<Self, String>
pub fn transformed(&self, matrix: Mat4) -> Result<Self, String>
Copies and transforms a mesh by a finite nonsingular affine matrix. Normals use the inverse transpose; mirrored transforms reverse triangle winding so the front-face convention stays consistent. Texture pixels remain shared.
Sourcepub fn effective_parts(&self) -> Vec<MeshPart>
pub fn effective_parts(&self) -> Vec<MeshPart>
The material runs of this mesh; a mesh without explicit parts is one run with its own albedo.
Sourcepub fn append(&mut self, other: &Self) -> Result<(), String>
pub fn append(&mut self, other: &Self) -> Result<(), String>
Appends another valid mesh, offsetting indices, while retaining this mesh’s material. Checks both inputs and index overflow before mutation. Meshes with different textures should be drawn separately instead of merged through this operation.
Sourcepub fn surface_area(&self) -> Result<f32, String>
pub fn surface_area(&self) -> Result<f32, String>
Sum of triangle areas in square local units, including duplicated/double-sided faces. Invalid topology or non-finite positions return an error.
Sourcepub fn bounds(&self) -> (Vec3, Vec3)
pub fn bounds(&self) -> (Vec3, Vec3)
Axis-aligned local bounds (minimum, maximum). Empty meshes return two zero vectors.
Trait Implementations§
Auto Trait Implementations§
impl Freeze for MeshData
impl RefUnwindSafe for MeshData
impl Send for MeshData
impl Sync for MeshData
impl Unpin for MeshData
impl UnsafeUnpin for MeshData
impl UnwindSafe for MeshData
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,
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§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.§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.§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.§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.§impl<T> DowncastSend for T
impl<T> DowncastSend for T
§impl<T> DowncastSync for T
impl<T> DowncastSync for T
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 moreimpl<T> MaybeSync for T
§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read more§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).§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.