diff options
| author | Sébastien Crozet <developer@crozet.re> | 2022-03-06 10:59:29 +0100 |
|---|---|---|
| committer | Sébastien Crozet <sebastien@crozet.re> | 2022-03-20 21:49:16 +0100 |
| commit | 815de4beff2ca31255c7fb937337602eb784ed67 (patch) | |
| tree | 82b93d1fcad98f9a9a6732e2cc0208f8a44fe67b /src/dynamics/solver/velocity_constraint.rs | |
| parent | 2e6f133b95b614f13445722e54f28105d9664841 (diff) | |
| download | rapier-815de4beff2ca31255c7fb937337602eb784ed67.tar.gz rapier-815de4beff2ca31255c7fb937337602eb784ed67.tar.bz2 rapier-815de4beff2ca31255c7fb937337602eb784ed67.zip | |
Complete the parallel solver fix
Diffstat (limited to 'src/dynamics/solver/velocity_constraint.rs')
| -rw-r--r-- | src/dynamics/solver/velocity_constraint.rs | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/src/dynamics/solver/velocity_constraint.rs b/src/dynamics/solver/velocity_constraint.rs index 186498a..f1c213d 100644 --- a/src/dynamics/solver/velocity_constraint.rs +++ b/src/dynamics/solver/velocity_constraint.rs @@ -136,9 +136,12 @@ pub(crate) struct VelocityConstraint { impl VelocityConstraint { #[cfg(feature = "parallel")] - pub fn num_active_constraints(manifold: &ContactManifold) -> usize { + pub fn num_active_constraints_and_jacobian_lines(manifold: &ContactManifold) -> (usize, usize) { let rest = manifold.data.solver_contacts.len() % MAX_MANIFOLD_POINTS != 0; - manifold.data.solver_contacts.len() / MAX_MANIFOLD_POINTS + rest as usize + ( + manifold.data.solver_contacts.len() / MAX_MANIFOLD_POINTS + rest as usize, + manifold.data.solver_contacts.len() * DIM, + ) } pub fn generate<Bodies>( @@ -147,7 +150,7 @@ impl VelocityConstraint { manifold: &ContactManifold, bodies: &Bodies, out_constraints: &mut Vec<AnyVelocityConstraint>, - push: bool, + insert_at: Option<usize>, ) where Bodies: ComponentSet<RigidBodyIds> + ComponentSet<RigidBodyVelocity> @@ -209,7 +212,7 @@ impl VelocityConstraint { // NOTE: impulse_joints have the same problem, but it is not easy to refactor the code that way // for the moment. #[cfg(target_arch = "wasm32")] - let constraint = if push { + let constraint = if insert_at.is_none() { let new_len = out_constraints.len() + 1; unsafe { out_constraints.resize_with(new_len, || { @@ -331,11 +334,10 @@ impl VelocityConstraint { } #[cfg(not(target_arch = "wasm32"))] - if push { - out_constraints.push(AnyVelocityConstraint::Nongrouped(constraint)); + if let Some(at) = insert_at { + out_constraints[at + _l] = AnyVelocityConstraint::Nongrouped(constraint); } else { - out_constraints[manifold.data.constraint_index + _l] = - AnyVelocityConstraint::Nongrouped(constraint); + out_constraints.push(AnyVelocityConstraint::Nongrouped(constraint)); } } } |
