aboutsummaryrefslogtreecommitdiff
path: root/src/dynamics/solver/velocity_constraint_wide.rs
diff options
context:
space:
mode:
authorCrozet Sébastien <developer@crozet.re>2020-11-03 11:21:06 +0100
committerCrozet Sébastien <developer@crozet.re>2020-11-03 11:22:30 +0100
commit502be0245c10eeaf5e30ed25653c5a76287e72be (patch)
tree4e1bad46a42dc90b782410d9396ca731d94a596c /src/dynamics/solver/velocity_constraint_wide.rs
parenta38fdc101dc74473c45a8b4f5d770f2bc43f30c2 (diff)
downloadrapier-502be0245c10eeaf5e30ed25653c5a76287e72be.tar.gz
rapier-502be0245c10eeaf5e30ed25653c5a76287e72be.tar.bz2
rapier-502be0245c10eeaf5e30ed25653c5a76287e72be.zip
Add restitution.
Diffstat (limited to 'src/dynamics/solver/velocity_constraint_wide.rs')
-rw-r--r--src/dynamics/solver/velocity_constraint_wide.rs11
1 files changed, 9 insertions, 2 deletions
diff --git a/src/dynamics/solver/velocity_constraint_wide.rs b/src/dynamics/solver/velocity_constraint_wide.rs
index f515d5e..5d8078a 100644
--- a/src/dynamics/solver/velocity_constraint_wide.rs
+++ b/src/dynamics/solver/velocity_constraint_wide.rs
@@ -104,6 +104,10 @@ impl WVelocityConstraint {
let mj_lambda2 = array![|ii| rbs2[ii].active_set_offset; SIMD_WIDTH];
let friction = SimdFloat::from(array![|ii| manifolds[ii].friction; SIMD_WIDTH]);
+ let restitution = SimdFloat::from(array![|ii| manifolds[ii].restitution; SIMD_WIDTH]);
+ let restitution_velocity_threshold =
+ SimdFloat::splat(params.restitution_velocity_threshold);
+
let warmstart_multiplier =
SimdFloat::from(array![|ii| manifolds[ii].warmstart_multiplier; SIMD_WIDTH]);
let warmstart_coeff = warmstart_multiplier * SimdFloat::splat(params.warmstart_coeff);
@@ -151,8 +155,11 @@ impl WVelocityConstraint {
let r = SimdFloat::splat(1.0)
/ (im1 + im2 + gcross1.gdot(gcross1) + gcross2.gdot(gcross2));
- let rhs =
- (vel1 - vel2).dot(&force_dir1) + dist.simd_max(SimdFloat::zero()) * inv_dt;
+ let mut rhs = (vel1 - vel2).dot(&force_dir1);
+ let use_restitution = rhs.simd_le(-restitution_velocity_threshold);
+ let rhs_with_restitution = rhs + rhs * restitution;
+ rhs = rhs_with_restitution.select(use_restitution, rhs);
+ rhs += dist.simd_max(SimdFloat::zero()) * inv_dt;
constraint.elements[k].normal_part = WVelocityConstraintElementPart {
gcross1,