aboutsummaryrefslogtreecommitdiff
path: root/src/geometry
diff options
context:
space:
mode:
Diffstat (limited to 'src/geometry')
-rw-r--r--src/geometry/collider.rs30
-rw-r--r--src/geometry/collider_set.rs4
2 files changed, 27 insertions, 7 deletions
diff --git a/src/geometry/collider.rs b/src/geometry/collider.rs
index 421523f..7b0cc4c 100644
--- a/src/geometry/collider.rs
+++ b/src/geometry/collider.rs
@@ -237,12 +237,32 @@ impl Collider {
&self.material
}
- /// The density of this collider, if set.
- pub fn density(&self) -> Option<Real> {
+ /// The volume (or surface in 2D) of this collider.
+ pub fn volume(&self) -> Real {
+ self.shape.mass_properties(1.0).mass()
+ }
+
+ /// The density of this collider.
+ pub fn density(&self) -> Real {
+ match &self.mprops {
+ ColliderMassProps::Density(density) => *density,
+ ColliderMassProps::Mass(mass) => {
+ let inv_volume = self.shape.mass_properties(1.0).inv_mass;
+ mass * inv_volume
+ }
+ ColliderMassProps::MassProperties(mprops) => {
+ let inv_volume = self.shape.mass_properties(1.0).inv_mass;
+ mprops.mass() * inv_volume
+ }
+ }
+ }
+
+ /// The mass of this collider.
+ pub fn mass(&self) -> Real {
match &self.mprops {
- ColliderMassProps::Density(density) => Some(*density),
- ColliderMassProps::Mass(_) => None,
- ColliderMassProps::MassProperties(_) => None,
+ ColliderMassProps::Density(density) => self.shape.mass_properties(*density).mass(),
+ ColliderMassProps::Mass(mass) => *mass,
+ ColliderMassProps::MassProperties(mprops) => mprops.mass(),
}
}
diff --git a/src/geometry/collider_set.rs b/src/geometry/collider_set.rs
index b9f4ae3..b141445 100644
--- a/src/geometry/collider_set.rs
+++ b/src/geometry/collider_set.rs
@@ -137,7 +137,7 @@ impl ColliderSet {
if let Some(parent_handle) = curr_parent {
if let Some(rb) = bodies.get_mut(parent_handle) {
- rb.remove_collider_internal(handle, &*collider);
+ rb.remove_collider_internal(handle);
}
}
@@ -189,7 +189,7 @@ impl ColliderSet {
if let Some(parent_rb) =
bodies.get_mut_internal_with_modification_tracking(parent.handle)
{
- parent_rb.remove_collider_internal(handle, &collider);
+ parent_rb.remove_collider_internal(handle);
if wake_up {
islands.wake_up(bodies, parent.handle, true);