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.
This commit is contained in:
Emil Ernerfeldt
2021-02-15 21:18:26 +01:00
parent 9a15838ad5
commit f9e3d382d2
5 changed files with 49 additions and 35 deletions

View File

@@ -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(