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 · 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<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.