rapier3d/dynamics/solver/
categorization.rs

1use crate::dynamics::{JointGraphEdge, JointIndex, MultibodyJointSet, RigidBodySet};
2use crate::geometry::{ContactManifold, ContactManifoldIndex};
3
4pub(crate) fn categorize_contacts(
5    _bodies: &RigidBodySet, // Unused but useful to simplify the parallel code.
6    multibody_joints: &MultibodyJointSet,
7    manifolds: &[&mut ContactManifold],
8    manifold_indices: &[ContactManifoldIndex],
9    out_two_body: &mut Vec<ContactManifoldIndex>,
10    out_generic_two_body: &mut Vec<ContactManifoldIndex>,
11) {
12    for manifold_i in manifold_indices {
13        let manifold = &manifolds[*manifold_i];
14
15        if manifold
16            .data
17            .rigid_body1
18            .and_then(|h| multibody_joints.rigid_body_link(h))
19            .is_some()
20            || manifold
21                .data
22                .rigid_body2
23                .and_then(|h| multibody_joints.rigid_body_link(h))
24                .is_some()
25        {
26            out_generic_two_body.push(*manifold_i);
27        } else {
28            out_two_body.push(*manifold_i)
29        }
30    }
31}
32
33pub(crate) fn categorize_joints(
34    multibody_joints: &MultibodyJointSet,
35    impulse_joints: &[JointGraphEdge],
36    joint_indices: &[JointIndex],
37    two_body_joints: &mut Vec<JointIndex>,
38    generic_two_body_joints: &mut Vec<JointIndex>,
39) {
40    for joint_i in joint_indices {
41        let joint = &impulse_joints[*joint_i].weight;
42
43        if multibody_joints.rigid_body_link(joint.body1).is_some()
44            || multibody_joints.rigid_body_link(joint.body2).is_some()
45        {
46            generic_two_body_joints.push(*joint_i);
47        } else {
48            two_body_joints.push(*joint_i);
49        }
50    }
51}