Use Box<Option<MassProperties>> instead to save on memory

This commit is contained in:
Emil Ernerfeldt
2021-03-05 12:04:27 +01:00
parent 64af425227
commit 0909077094

View File

@@ -49,7 +49,8 @@ impl ColliderFlags {
pub struct Collider { pub struct Collider {
shape: SharedShape, shape: SharedShape,
density: Real, density: Real,
mass_properties: MassProperties, /// If None, use [`Self::density`] and [`SharedShape::mass_properties`].
mass_properties: Option<Box<MassProperties>>,
pub(crate) flags: ColliderFlags, pub(crate) flags: ColliderFlags,
pub(crate) solver_flags: SolverFlags, pub(crate) solver_flags: SolverFlags,
pub(crate) parent: RigidBodyHandle, pub(crate) parent: RigidBodyHandle,
@@ -135,9 +136,12 @@ impl Collider {
// aabb1.merged(&aabb2) // aabb1.merged(&aabb2)
// } // }
/// Read the local-space mass properties of this collider. /// Compute the local-space mass properties of this collider.
pub fn mass_properties(&self) -> &MassProperties { pub fn mass_properties(&self) -> MassProperties {
&self.mass_properties match &self.mass_properties {
Some(mass_properties) => **mass_properties,
None => self.shape.mass_properties(self.density),
}
} }
} }
@@ -559,7 +563,7 @@ impl ColliderBuilder {
pub fn build(&self) -> Collider { pub fn build(&self) -> Collider {
let (density, mass_properties); let (density, mass_properties);
if let Some(mp) = self.mass_properties { if let Some(mp) = self.mass_properties {
mass_properties = mp; mass_properties = Some(Box::new(mp));
let volume = volume(&self.shape); let volume = volume(&self.shape);
density = if volume == 0.0 || mp.inv_mass == 0.0 { density = if volume == 0.0 || mp.inv_mass == 0.0 {
@@ -569,7 +573,7 @@ impl ColliderBuilder {
}; };
} else { } else {
density = self.get_density(); density = self.get_density();
mass_properties = self.shape.mass_properties(density); mass_properties = None;
} }
let mut flags = ColliderFlags::empty(); let mut flags = ColliderFlags::empty();