diff options
| author | Sébastien Crozet <developer@crozet.re> | 2022-07-05 15:15:17 +0200 |
|---|---|---|
| committer | Sébastien Crozet <developer@crozet.re> | 2022-07-05 15:15:17 +0200 |
| commit | 7831ebfc3109d4a4c2029f50e432dd1d4be9ef82 (patch) | |
| tree | 39d57c778ee69399b654e11fa967e03b375f7ec2 /src | |
| parent | ba081fb6f567dd547cee86095480dd443aff2c4c (diff) | |
| download | rapier-7831ebfc3109d4a4c2029f50e432dd1d4be9ef82.tar.gz rapier-7831ebfc3109d4a4c2029f50e432dd1d4be9ef82.tar.bz2 rapier-7831ebfc3109d4a4c2029f50e432dd1d4be9ef82.zip | |
Add methods to read the mass or volume of a collider.
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynamics/rigid_body.rs | 5 | ||||
| -rw-r--r-- | src/geometry/collider.rs | 30 | ||||
| -rw-r--r-- | src/geometry/collider_set.rs | 4 |
3 files changed, 29 insertions, 10 deletions
diff --git a/src/dynamics/rigid_body.rs b/src/dynamics/rigid_body.rs index 494dc6c..a44e335 100644 --- a/src/dynamics/rigid_body.rs +++ b/src/dynamics/rigid_body.rs @@ -4,8 +4,7 @@ use crate::dynamics::{ RigidBodyIds, RigidBodyMassProps, RigidBodyPosition, RigidBodyType, RigidBodyVelocity, }; use crate::geometry::{ - Collider, ColliderHandle, ColliderMassProps, ColliderParent, ColliderPosition, ColliderSet, - ColliderShape, + ColliderHandle, ColliderMassProps, ColliderParent, ColliderPosition, ColliderSet, ColliderShape, }; use crate::math::{AngVector, Isometry, Point, Real, Rotation, Vector}; use crate::utils::WCross; @@ -484,7 +483,7 @@ impl RigidBody { } /// Removes a collider from this rigid-body. - pub(crate) fn remove_collider_internal(&mut self, handle: ColliderHandle, coll: &Collider) { + pub(crate) fn remove_collider_internal(&mut self, handle: ColliderHandle) { if let Some(i) = self.colliders.0.iter().position(|e| *e == handle) { self.changes.set(RigidBodyChanges::COLLIDERS, true); self.colliders.0.swap_remove(i); 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); |
