aboutsummaryrefslogtreecommitdiff
path: root/src/geometry
diff options
context:
space:
mode:
authorEmil Ernerfeldt <emil.ernerfeldt@gmail.com>2021-02-15 21:18:26 +0100
committerEmil Ernerfeldt <emil.ernerfeldt@gmail.com>2021-02-18 15:41:46 +0100
commitf9e3d382d2ee097dce05997735982f5e120cca03 (patch)
tree6f85b071c8a4faf1d548950e250d36195f0d5ace /src/geometry
parent9a15838ad568958273218b678ac22e53bb0a0842 (diff)
downloadrapier-f9e3d382d2ee097dce05997735982f5e120cca03.tar.gz
rapier-f9e3d382d2ee097dce05997735982f5e120cca03.tar.bz2
rapier-f9e3d382d2ee097dce05997735982f5e120cca03.zip
New contacts are bouncy, old are resting
If a contact is new (previous impluse = 0), then we treat it as bouncy (respecting restitution). If the contact is old we treat it as resting. Exceptions for restitutions <=0 and >= 1.
Diffstat (limited to 'src/geometry')
-rw-r--r--src/geometry/contact_pair.rs16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/geometry/contact_pair.rs b/src/geometry/contact_pair.rs
index 47f6678..462d3ef 100644
--- a/src/geometry/contact_pair.rs
+++ b/src/geometry/contact_pair.rs
@@ -128,6 +128,22 @@ pub struct SolverContact {
pub data: ContactData,
}
+impl SolverContact {
+ /// Should we treat this contact as a bouncy contact?
+ /// If `true`, use [`Self::restitution`].
+ pub fn is_bouncy(&self) -> bool {
+ let is_new = self.data.impulse == 0.0;
+ if is_new {
+ // Treat new collisions as bouncing at first, unless we have zero restitution.
+ self.restitution > 0.0
+ } else {
+ // If the contact is still here one step later, it is now a resting contact.
+ // The exception is very high restitutions, which can never rest
+ self.restitution >= 1.0
+ }
+ }
+}
+
impl Default for ContactManifoldData {
fn default() -> Self {
Self::new(