pub struct CompoundShape {
pub children: Vec<CompoundChild>,
}Expand description
A compound shape made of multiple lightweight primitive children.
Unlike Compound which uses Arc<dyn Shape>, this uses concrete enum
variants for common shapes, avoiding dynamic dispatch and allocations.
Fields§
§children: Vec<CompoundChild>The child shapes.
Implementations§
Source§impl CompoundShape
impl CompoundShape
Sourcepub fn add_sphere(&mut self, center: [f64; 3], radius: f64)
pub fn add_sphere(&mut self, center: [f64; 3], radius: f64)
Add a sphere child.
Sourcepub fn add_capsule(&mut self, center: [f64; 3], radius: f64, half_height: f64)
pub fn add_capsule(&mut self, center: [f64; 3], radius: f64, half_height: f64)
Add a capsule child.
Sourcepub fn child_count(&self) -> usize
pub fn child_count(&self) -> usize
Return the number of children.
Sourcepub fn total_volume(&self) -> f64
pub fn total_volume(&self) -> f64
Compute total volume of all children (no overlap correction).
Sourcepub fn aabb(&self) -> ([f64; 3], [f64; 3])
pub fn aabb(&self) -> ([f64; 3], [f64; 3])
Compute axis-aligned bounding box of all children.
Returns (min, max) as [f64; 3] arrays.
Sourcepub fn center_of_mass(&self) -> [f64; 3]
pub fn center_of_mass(&self) -> [f64; 3]
Compute volume-weighted center of mass.
Sourcepub fn contains_point(&self, p: [f64; 3]) -> bool
pub fn contains_point(&self, p: [f64; 3]) -> bool
Test if a point is inside any child shape.
Source§impl CompoundShape
impl CompoundShape
Sourcepub fn inertia_tensor(&self, density: f64) -> [[f64; 3]; 3]
pub fn inertia_tensor(&self, density: f64) -> [[f64; 3]; 3]
Compute the inertia tensor of the compound shape about its center of mass.
Uses the parallel axis theorem. density is the uniform mass density.
Sourcepub fn bounding_sphere(&self) -> ([f64; 3], f64)
pub fn bounding_sphere(&self) -> ([f64; 3], f64)
Compute the bounding sphere (center, radius) of the compound shape.
Sourcepub fn scale(&mut self, factor: f64)
pub fn scale(&mut self, factor: f64)
Apply a uniform scaling to all child shape positions and sizes.
Sourcepub fn merge_with(&self, other: &CompoundShape) -> CompoundShape
pub fn merge_with(&self, other: &CompoundShape) -> CompoundShape
Returns a new compound shape merged with another (concatenation of children).
Source§impl CompoundShape
impl CompoundShape
Sourcepub fn raycast(
&self,
ray_origin: [f64; 3],
ray_dir: [f64; 3],
max_t: f64,
) -> Option<(f64, usize)>
pub fn raycast( &self, ray_origin: [f64; 3], ray_dir: [f64; 3], max_t: f64, ) -> Option<(f64, usize)>
Ray cast returning (t, child_index) for the closest hit within max_t.
Unlike ray_cast this omits the normal to match the requested signature.
Sourcepub fn center_of_mass_weighted(&self, masses: &[f64]) -> [f64; 3]
pub fn center_of_mass_weighted(&self, masses: &[f64]) -> [f64; 3]
Mass-weighted center of mass.
masses[i] is the mass of child i. If masses is shorter than
children, remaining children have zero mass.
Source§impl CompoundShape
impl CompoundShape
Sourcepub fn remove_child(&mut self, index: usize)
pub fn remove_child(&mut self, index: usize)
Remove the child at the given index. Panics if index is out of range.
Sourcepub fn swap_remove_child(&mut self, index: usize)
pub fn swap_remove_child(&mut self, index: usize)
Remove the child at the given index by swapping with the last element.
Faster than remove_child (O(1) vs O(n)) but changes the order of
remaining children.
Sourcepub fn replace_with_sphere(
&mut self,
index: usize,
center: [f64; 3],
radius: f64,
)
pub fn replace_with_sphere( &mut self, index: usize, center: [f64; 3], radius: f64, )
Replace the child at index with a new sphere.
Sourcepub fn replace_with_box(
&mut self,
index: usize,
center: [f64; 3],
half_extents: [f64; 3],
)
pub fn replace_with_box( &mut self, index: usize, center: [f64; 3], half_extents: [f64; 3], )
Replace the child at index with a new box.
Sourcepub fn closest_point_with_dist2(&self, p: [f64; 3]) -> ([f64; 3], f64, usize)
pub fn closest_point_with_dist2(&self, p: [f64; 3]) -> ([f64; 3], f64, usize)
Closest surface point among all children together with the squared distance and the child index.
Returns (closest_point, squared_distance, child_index).
Sourcepub fn broad_phase_pairs(&self, other: &CompoundShape) -> Vec<(usize, usize)>
pub fn broad_phase_pairs(&self, other: &CompoundShape) -> Vec<(usize, usize)>
Check if two CompoundShape instances have any overlapping pair of
children using conservative bounding-sphere overlap tests.
Returns the index pairs (i, j) of all overlapping child pairs.
Sourcepub fn overlaps_compound(&self, other: &CompoundShape) -> bool
pub fn overlaps_compound(&self, other: &CompoundShape) -> bool
Test if two CompoundShape instances overlap at all (broad phase).
Sourcepub fn centroid_with_densities(&self, densities: &[f64]) -> [f64; 3]
pub fn centroid_with_densities(&self, densities: &[f64]) -> [f64; 3]
Compute the centroid of the compound (volume-weighted center) using per-child densities.
densities[i] is the density for child i. If densities is shorter
than children, remaining children use density 1.0.
Sourcepub fn penetration_depth_sphere(
&self,
center: [f64; 3],
radius: f64,
) -> Option<(f64, usize)>
pub fn penetration_depth_sphere( &self, center: [f64; 3], radius: f64, ) -> Option<(f64, usize)>
Approximate penetration depth between this compound and a sphere at
center with radius.
For each child, computes the signed distance to the child’s surface (negative inside). Returns the minimum signed distance (most negative = deepest penetration) together with the child index.
Returns None if there is no penetration.
Sourcepub fn child_masses(&self, density: f64) -> Vec<f64>
pub fn child_masses(&self, density: f64) -> Vec<f64>
Compute per-child masses from a uniform density.
Sourcepub fn total_mass(&self, density: f64) -> f64
pub fn total_mass(&self, density: f64) -> f64
Total mass of the compound given uniform density.
Sourcepub fn child_aabb_public(child: &CompoundChild) -> ([f64; 3], [f64; 3])
pub fn child_aabb_public(child: &CompoundChild) -> ([f64; 3], [f64; 3])
Axis-aligned bounding box of a single child (public accessor).
Trait Implementations§
Source§impl Clone for CompoundShape
impl Clone for CompoundShape
Source§fn clone(&self) -> CompoundShape
fn clone(&self) -> CompoundShape
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 CompoundShape
impl Debug for CompoundShape
Auto Trait Implementations§
impl Freeze for CompoundShape
impl RefUnwindSafe for CompoundShape
impl Send for CompoundShape
impl Sync for CompoundShape
impl Unpin for CompoundShape
impl UnsafeUnpin for CompoundShape
impl UnwindSafe for CompoundShape
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> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.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> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§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.Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.