rapier3d/dynamics/solver/
categorization.rs1use crate::dynamics::{JointGraphEdge, JointIndex, MultibodyJointSet, RigidBodySet};
2use crate::geometry::{ContactManifold, ContactManifoldIndex};
3
4pub(crate) fn categorize_contacts(
5 _bodies: &RigidBodySet, 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}