aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEmil Ernerfeldt <emil.ernerfeldt@gmail.com>2021-03-08 10:12:12 +0100
committerEmil Ernerfeldt <emil.ernerfeldt@gmail.com>2021-03-08 10:12:12 +0100
commit0370e7e37d2ed298561d7b9aa36ed2cbe651ea9d (patch)
treec0847671ad76df776291295ff5a750361401e42d /src
parent05614dc471c785fbaefeae061458694695d7b948 (diff)
downloadrapier-0370e7e37d2ed298561d7b9aa36ed2cbe651ea9d.tar.gz
rapier-0370e7e37d2ed298561d7b9aa36ed2cbe651ea9d.tar.bz2
rapier-0370e7e37d2ed298561d7b9aa36ed2cbe651ea9d.zip
Store either density or mass properties but not both
Diffstat (limited to 'src')
-rw-r--r--src/geometry/collider.rs63
1 files changed, 25 insertions, 38 deletions
diff --git a/src/geometry/collider.rs b/src/geometry/collider.rs
index 23b62fa..593c53c 100644
--- a/src/geometry/collider.rs
+++ b/src/geometry/collider.rs
@@ -41,6 +41,14 @@ impl ColliderFlags {
}
}
+#[derive(Clone)]
+#[cfg_attr(feature = "serde-serialize", derive(Serialize, Deserialize))]
+enum MassInfo {
+ /// `MassProperties` are computed with the help of [`SharedShape::mass_properties`].
+ Density(Real),
+ MassProperties(Box<MassProperties>),
+}
+
#[cfg_attr(feature = "serde-serialize", derive(Serialize, Deserialize))]
#[derive(Clone)]
/// A geometric entity that can be attached to a body so it can be affected by contacts and proximity queries.
@@ -48,9 +56,7 @@ impl ColliderFlags {
/// To build a new collider, use the `ColliderBuilder` structure.
pub struct Collider {
shape: SharedShape,
- density: Real,
- /// If None, use [`Self::density`] and [`SharedShape::mass_properties`].
- mass_properties: Option<Box<MassProperties>>,
+ mass_info: MassInfo,
pub(crate) flags: ColliderFlags,
pub(crate) solver_flags: SolverFlags,
pub(crate) parent: RigidBodyHandle,
@@ -115,9 +121,12 @@ impl Collider {
self.solver_groups
}
- /// The density of this collider.
- pub fn density(&self) -> Real {
- self.density
+ /// The density of this collider, if set.
+ pub fn density(&self) -> Option<Real> {
+ match &self.mass_info {
+ MassInfo::Density(density) => Some(*density),
+ MassInfo::MassProperties(_) => None,
+ }
}
/// The geometric shape of this collider.
@@ -138,9 +147,9 @@ impl Collider {
/// Compute the local-space mass properties of this collider.
pub fn mass_properties(&self) -> MassProperties {
- match &self.mass_properties {
- Some(mass_properties) => **mass_properties,
- None => self.shape.mass_properties(self.density),
+ match &self.mass_info {
+ MassInfo::Density(density) => self.shape.mass_properties(*density),
+ MassInfo::MassProperties(mass_properties) => **mass_properties,
}
}
}
@@ -199,12 +208,6 @@ impl ColliderBuilder {
}
}
- /// The density of the collider being built.
- pub fn get_density(&self) -> Real {
- let default_density = if self.is_sensor { 0.0 } else { 1.0 };
- self.density.unwrap_or(default_density)
- }
-
/// Initialize a new collider builder with a compound shape.
pub fn compound(shapes: Vec<(Isometry<Real>, SharedShape)>) -> Self {
Self::new(SharedShape::compound(shapes))
@@ -564,20 +567,13 @@ impl ColliderBuilder {
/// Builds a new collider attached to the given rigid-body.
pub fn build(&self) -> Collider {
- let (density, mass_properties);
- if let Some(mp) = self.mass_properties {
- mass_properties = Some(Box::new(mp));
-
- let volume = volume(&self.shape);
- density = if volume == 0.0 || mp.inv_mass == 0.0 {
- Real::INFINITY
- } else {
- mass(&mp) / volume
- };
+ let mass_info = if let Some(mp) = self.mass_properties {
+ MassInfo::MassProperties(Box::new(mp))
} else {
- density = self.get_density();
- mass_properties = None;
- }
+ let default_density = if self.is_sensor { 0.0 } else { 1.0 };
+ let density = self.density.unwrap_or(default_density);
+ MassInfo::Density(density)
+ };
let mut flags = ColliderFlags::empty();
flags.set(ColliderFlags::SENSOR, self.is_sensor);
@@ -592,8 +588,7 @@ impl ColliderBuilder {
Collider {
shape: self.shape.clone(),
- density,
- mass_properties,
+ mass_info,
friction: self.friction,
restitution: self.restitution,
delta: self.delta,
@@ -609,11 +604,3 @@ impl ColliderBuilder {
}
}
}
-
-fn volume(shape: &SharedShape) -> Real {
- mass(&shape.mass_properties(1.0)) // TODO: add SharedShape::volume to parry
-}
-
-fn mass(mp: &MassProperties) -> Real {
- crate::utils::inv(mp.inv_mass) // TODO: add MassProperties::mass() to parry
-}