aboutsummaryrefslogtreecommitdiff
path: root/src/dynamics/solver/velocity_constraint.rs
diff options
context:
space:
mode:
authorSébastien Crozet <developer@crozet.re>2022-03-06 10:59:29 +0100
committerSébastien Crozet <sebastien@crozet.re>2022-03-20 21:49:16 +0100
commit815de4beff2ca31255c7fb937337602eb784ed67 (patch)
tree82b93d1fcad98f9a9a6732e2cc0208f8a44fe67b /src/dynamics/solver/velocity_constraint.rs
parent2e6f133b95b614f13445722e54f28105d9664841 (diff)
downloadrapier-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.rs18
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));
}
}
}