pub struct OrientVerdict {
pub flipped: bool,
pub all_closed: bool,
pub all_orientable: bool,
pub components: u32,
}Expand description
What orient_mesh_outward_verdict concluded about a mesh’s SURFACE
TOPOLOGY, on top of whether it re-wound anything.
The orienter has to decide, per connected component, whether that component is CLOSED (every welded edge shared by exactly two triangles) and ORIENTABLE (no winding contradiction closes a cycle), because only such a component has a meaningful “outward” to flip toward. It then discarded the answer. Nothing downstream can recover it: by the time a mesh reaches the hasher or the FFI boundary the adjacency has not been rebuilt, and rebuilding it is this pass’s whole cost.
The consumer that needs it is a divergence-theorem volume. Over an OPEN surface that sum is not approximate, it is ARBITRARY — the boundary-loop flux grows with the distance to the reference point, so the “volume” of a sheet is whatever you referenced it to. There is no way to spot that from the number itself; it looks like an ordinary positive volume. This verdict is what lets a consumer refuse instead of guessing.
Fields§
§flipped: boolAt least one triangle’s winding was flipped, so any baked normals are
stale. Exactly the bool orient_mesh_outward returns.
all_closed: boolEVERY connected component is closed (no boundary edge, no non-manifold
edge). False if there are no components at all — see Self::INDETERMINATE.
all_orientable: boolEVERY connected component is orientable (consistent winding propagated
without contradiction). Independent of all_closed: a Klein-bottle-like
or self-touching component can be edge-manifold yet non-orientable.
components: u32Connected components found (BFS over welded-edge adjacency). A single closed body is 1; a faceted brep holding two disjoint solids, or a solid plus the shell of its own cavity, is 2.
Implementations§
Source§impl OrientVerdict
impl OrientVerdict
Sourcepub const INDETERMINATE: Self
pub const INDETERMINATE: Self
The verdict for a mesh the orienter refused to analyse: fewer than two
triangles, or a malformed position/index buffer. Nothing is known, so
nothing is claimed — all_closed is FALSE rather than vacuously true, so
a consumer gating on it emits nothing. That is also the correct geometric
answer: a mesh of under two triangles cannot enclose anything.
Sourcepub fn is_single_closed_solid(&self) -> bool
pub fn is_single_closed_solid(&self) -> bool
The one shape for which a divergence-theorem volume over this mesh is trustworthy: EXACTLY ONE closed, orientable component.
Why not the weaker “all components closed”. This pass flips each closed
component so its OWN signed volume is positive. For two disjoint solids
that is right and the sum is their combined volume. But for a solid whose
cavity is modelled as a second, inner shell it is wrong in the worst way:
the cavity shell is also made positive, so the sum reports
outer + cavity where the true volume is outer − cavity. Telling those
two arrangements apart needs a containment test this pass does not do —
and the orientation it already applied has destroyed the sign that would
have distinguished them. One component has no such ambiguity.
Trait Implementations§
Source§impl Clone for OrientVerdict
impl Clone for OrientVerdict
Source§fn clone(&self) -> OrientVerdict
fn clone(&self) -> OrientVerdict
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreimpl Copy for OrientVerdict
Source§impl Debug for OrientVerdict
impl Debug for OrientVerdict
Source§impl Default for OrientVerdict
impl Default for OrientVerdict
Source§fn default() -> OrientVerdict
fn default() -> OrientVerdict
impl Eq for OrientVerdict
Source§impl PartialEq for OrientVerdict
impl PartialEq for OrientVerdict
impl StructuralPartialEq for OrientVerdict
Auto Trait Implementations§
impl Freeze for OrientVerdict
impl RefUnwindSafe for OrientVerdict
impl Send for OrientVerdict
impl Sync for OrientVerdict
impl Unpin for OrientVerdict
impl UnsafeUnpin for OrientVerdict
impl UnwindSafe for OrientVerdict
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> 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
impl<T> Scalar 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.