diff options
| author | Crozet Sébastien <developer@crozet.re> | 2021-02-22 17:51:40 +0100 |
|---|---|---|
| committer | Crozet Sébastien <developer@crozet.re> | 2021-02-22 17:52:03 +0100 |
| commit | ad5c10672e36f47fbdb0667bccd79c59ff3a97cc (patch) | |
| tree | 37607ad9ca3133f6e43466d0edcc8bc6529aca9e /src/dynamics/solver/velocity_constraint_wide.rs | |
| parent | d31a327b45118a77bd9676f350f110683a235acf (diff) | |
| download | rapier-ad5c10672e36f47fbdb0667bccd79c59ff3a97cc.tar.gz rapier-ad5c10672e36f47fbdb0667bccd79c59ff3a97cc.tar.bz2 rapier-ad5c10672e36f47fbdb0667bccd79c59ff3a97cc.zip | |
Use contact ids instead of contact reordering in order to identify the impulse writeback location.
Diffstat (limited to 'src/dynamics/solver/velocity_constraint_wide.rs')
| -rw-r--r-- | src/dynamics/solver/velocity_constraint_wide.rs | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/src/dynamics/solver/velocity_constraint_wide.rs b/src/dynamics/solver/velocity_constraint_wide.rs index 3e068e7..8838011 100644 --- a/src/dynamics/solver/velocity_constraint_wide.rs +++ b/src/dynamics/solver/velocity_constraint_wide.rs @@ -55,7 +55,7 @@ pub(crate) struct WVelocityConstraint { pub mj_lambda1: [usize; SIMD_WIDTH], pub mj_lambda2: [usize; SIMD_WIDTH], pub manifold_id: [ContactManifoldIndex; SIMD_WIDTH], - pub manifold_contact_id: usize, + pub manifold_contact_id: [[u8; SIMD_WIDTH]; MAX_MANIFOLD_POINTS], } impl WVelocityConstraint { @@ -116,7 +116,7 @@ impl WVelocityConstraint { mj_lambda1, mj_lambda2, manifold_id, - manifold_contact_id: l, + manifold_contact_id: [[0; SIMD_WIDTH]; MAX_MANIFOLD_POINTS], num_contacts: num_points as u8, }; @@ -141,6 +141,8 @@ impl WVelocityConstraint { let vel2 = linvel2 + angvel2.gcross(dp2); constraint.limit = friction; + constraint.manifold_contact_id[k] = + array![|ii| manifold_points[ii][k].contact_id; SIMD_WIDTH]; // Normal part. { @@ -332,17 +334,17 @@ impl WVelocityConstraint { for ii in 0..SIMD_WIDTH { let manifold = &mut manifolds_all[self.manifold_id[ii]]; - let k_base = self.manifold_contact_id; - let active_contacts = &mut manifold.points[..manifold.data.num_active_contacts()]; - active_contacts[k_base + k].data.impulse = impulses[ii]; + let contact_id = self.manifold_contact_id[k][ii]; + let active_contact = &mut manifold.points[contact_id as usize]; + active_contact.data.impulse = impulses[ii]; #[cfg(feature = "dim2")] { - active_contacts[k_base + k].data.tangent_impulse = tangent_impulses[ii]; + active_contact.data.tangent_impulse = tangent_impulses[ii]; } #[cfg(feature = "dim3")] { - active_contacts[k_base + k].data.tangent_impulse = + active_contact.data.tangent_impulse = [tangent_impulses[ii], bitangent_impulses[ii]]; } } |
