aboutsummaryrefslogtreecommitdiff
path: root/src/dynamics/solver/solver_constraints.rs
diff options
context:
space:
mode:
authorCrozet Sébastien <developer@crozet.re>2021-04-26 17:59:25 +0200
committerCrozet Sébastien <developer@crozet.re>2021-04-26 18:00:50 +0200
commitc32da78f2a6014c491aa3e975fb83ddb7c80610e (patch)
treeedd20f23270baee1577c486f78d825eb93ea0de0 /src/dynamics/solver/solver_constraints.rs
parentaaf80bfa872c6f29b248cab8eb5658ab0d73cb4a (diff)
downloadrapier-c32da78f2a6014c491aa3e975fb83ddb7c80610e.tar.gz
rapier-c32da78f2a6014c491aa3e975fb83ddb7c80610e.tar.bz2
rapier-c32da78f2a6014c491aa3e975fb83ddb7c80610e.zip
Split rigid-bodies and colliders into multiple components
Diffstat (limited to 'src/dynamics/solver/solver_constraints.rs')
-rw-r--r--src/dynamics/solver/solver_constraints.rs152
1 files changed, 109 insertions, 43 deletions
diff --git a/src/dynamics/solver/solver_constraints.rs b/src/dynamics/solver/solver_constraints.rs
index 3a4ecb7..a9aa780 100644
--- a/src/dynamics/solver/solver_constraints.rs
+++ b/src/dynamics/solver/solver_constraints.rs
@@ -5,13 +5,16 @@ use super::{
use super::{
WPositionConstraint, WPositionGroundConstraint, WVelocityConstraint, WVelocityGroundConstraint,
};
+use crate::data::ComponentSet;
use crate::dynamics::solver::categorization::{categorize_contacts, categorize_joints};
use crate::dynamics::solver::{
AnyJointPositionConstraint, AnyPositionConstraint, PositionConstraint, PositionGroundConstraint,
};
use crate::dynamics::{
- solver::AnyVelocityConstraint, IntegrationParameters, JointGraphEdge, JointIndex, RigidBodySet,
+ solver::AnyVelocityConstraint, IntegrationParameters, JointGraphEdge, JointIndex, RigidBodyIds,
+ RigidBodyMassProps, RigidBodyPosition, RigidBodyType,
};
+use crate::dynamics::{IslandManager, RigidBodyVelocity};
use crate::geometry::{ContactManifold, ContactManifoldIndex};
#[cfg(feature = "simd-is-enabled")]
use crate::math::SIMD_WIDTH;
@@ -50,13 +53,16 @@ impl<VelocityConstraint, PositionConstraint>
}
impl SolverConstraints<AnyVelocityConstraint, AnyPositionConstraint> {
- pub fn init_constraint_groups(
+ pub fn init_constraint_groups<Bodies>(
&mut self,
island_id: usize,
- bodies: &RigidBodySet,
+ islands: &IslandManager,
+ bodies: &Bodies,
manifolds: &[&mut ContactManifold],
manifold_indices: &[ContactManifoldIndex],
- ) {
+ ) where
+ Bodies: ComponentSet<RigidBodyType> + ComponentSet<RigidBodyIds>,
+ {
self.not_ground_interactions.clear();
self.ground_interactions.clear();
categorize_contacts(
@@ -70,6 +76,7 @@ impl SolverConstraints<AnyVelocityConstraint, AnyPositionConstraint> {
self.interaction_groups.clear_groups();
self.interaction_groups.group_manifolds(
island_id,
+ islands,
bodies,
manifolds,
&self.not_ground_interactions,
@@ -78,6 +85,7 @@ impl SolverConstraints<AnyVelocityConstraint, AnyPositionConstraint> {
self.ground_interaction_groups.clear_groups();
self.ground_interaction_groups.group_manifolds(
island_id,
+ islands,
bodies,
manifolds,
&self.ground_interactions,
@@ -92,18 +100,25 @@ impl SolverConstraints<AnyVelocityConstraint, AnyPositionConstraint> {
// .append(&mut self.ground_interaction_groups.grouped_interactions);
}
- pub fn init(
+ pub fn init<Bodies>(
&mut self,
island_id: usize,
params: &IntegrationParameters,
- bodies: &RigidBodySet,
+ islands: &IslandManager,
+ bodies: &Bodies,
manifolds: &[&mut ContactManifold],
manifold_indices: &[ContactManifoldIndex],
- ) {
+ ) where
+ Bodies: ComponentSet<RigidBodyPosition>
+ + ComponentSet<RigidBodyVelocity>
+ + ComponentSet<RigidBodyMassProps>
+ + ComponentSet<RigidBodyIds>
+ + ComponentSet<RigidBodyType>,
+ {
self.velocity_constraints.clear();
self.position_constraints.clear();
- self.init_constraint_groups(island_id, bodies, manifolds, manifold_indices);
+ self.init_constraint_groups(island_id, islands, bodies, manifolds, manifold_indices);
#[cfg(feature = "simd-is-enabled")]
{
@@ -118,19 +133,24 @@ impl SolverConstraints<AnyVelocityConstraint, AnyPositionConstraint> {
}
#[cfg(feature = "simd-is-enabled")]
- fn compute_grouped_constraints(
+ fn compute_grouped_constraints<Bodies>(
&mut self,
params: &IntegrationParameters,
- bodies: &RigidBodySet,
+ bodies: &Bodies,
manifolds_all: &[&mut ContactManifold],
- ) {
+ ) where
+ Bodies: ComponentSet<RigidBodyVelocity>
+ + ComponentSet<RigidBodyPosition>
+ + ComponentSet<RigidBodyMassProps>
+ + ComponentSet<RigidBodyIds>,
+ {
for manifolds_i in self
.interaction_groups
.grouped_interactions
.chunks_exact(SIMD_WIDTH)
{
- let manifold_id = array![|ii| manifolds_i[ii]; SIMD_WIDTH];
- let manifolds = array![|ii| &*manifolds_all[manifolds_i[ii]]; SIMD_WIDTH];
+ let manifold_id = gather![|ii| manifolds_i[ii]];
+ let manifolds = gather![|ii| &*manifolds_all[manifolds_i[ii]]];
WVelocityConstraint::generate(
params,
manifold_id,
@@ -149,12 +169,17 @@ impl SolverConstraints<AnyVelocityConstraint, AnyPositionConstraint> {
}
}
- fn compute_nongrouped_constraints(
+ fn compute_nongrouped_constraints<Bodies>(
&mut self,
params: &IntegrationParameters,
- bodies: &RigidBodySet,
+ bodies: &Bodies,
manifolds_all: &[&mut ContactManifold],
- ) {
+ ) where
+ Bodies: ComponentSet<RigidBodyVelocity>
+ + ComponentSet<RigidBodyPosition>
+ + ComponentSet<RigidBodyMassProps>
+ + ComponentSet<RigidBodyIds>,
+ {
for manifold_i in &self.interaction_groups.nongrouped_interactions {
let manifold = &manifolds_all[*manifold_i];
VelocityConstraint::generate(
@@ -176,19 +201,24 @@ impl SolverConstraints<AnyVelocityConstraint, AnyPositionConstraint> {
}
#[cfg(feature = "simd-is-enabled")]
- fn compute_grouped_ground_constraints(
+ fn compute_grouped_ground_constraints<Bodies>(
&mut self,
params: &IntegrationParameters,
- bodies: &RigidBodySet,
+ bodies: &Bodies,
manifolds_all: &[&mut ContactManifold],
- ) {
+ ) where
+ Bodies: ComponentSet<RigidBodyIds>
+ + ComponentSet<RigidBodyPosition>
+ + ComponentSet<RigidBodyVelocity>
+ + ComponentSet<RigidBodyMassProps>,
+ {
for manifolds_i in self
.ground_interaction_groups
.grouped_interactions
.chunks_exact(SIMD_WIDTH)
{
- let manifold_id = array![|ii| manifolds_i[ii]; SIMD_WIDTH];
- let manifolds = array![|ii| &*manifolds_all[manifolds_i[ii]]; SIMD_WIDTH];
+ let manifold_id = gather![|ii| manifolds_i[ii]];
+ let manifolds = gather![|ii| &*manifolds_all[manifolds_i[ii]]];
WVelocityGroundConstraint::generate(
params,
manifold_id,
@@ -207,12 +237,17 @@ impl SolverConstraints<AnyVelocityConstraint, AnyPositionConstraint> {
}
}
- fn compute_nongrouped_ground_constraints(
+ fn compute_nongrouped_ground_constraints<Bodies>(
&mut self,
params: &IntegrationParameters,
- bodies: &RigidBodySet,
+ bodies: &Bodies,
manifolds_all: &[&mut ContactManifold],
- ) {
+ ) where
+ Bodies: ComponentSet<RigidBodyIds>
+ + ComponentSet<RigidBodyPosition>
+ + ComponentSet<RigidBodyVelocity>
+ + ComponentSet<RigidBodyMassProps>,
+ {
for manifold_i in &self.ground_interaction_groups.nongrouped_interactions {
let manifold = &manifolds_all[*manifold_i];
VelocityGroundConstraint::generate(
@@ -235,14 +270,21 @@ impl SolverConstraints<AnyVelocityConstraint, AnyPositionConstraint> {
}
impl SolverConstraints<AnyJointVelocityConstraint, AnyJointPositionConstraint> {
- pub fn init(
+ pub fn init<Bodies>(
&mut self,
island_id: usize,
params: &IntegrationParameters,
- bodies: &RigidBodySet,
+ islands: &IslandManager,
+ bodies: &Bodies,
joints: &[JointGraphEdge],
joint_constraint_indices: &[JointIndex],
- ) {
+ ) where
+ Bodies: ComponentSet<RigidBodyType>
+ + ComponentSet<RigidBodyIds>
+ + ComponentSet<RigidBodyVelocity>
+ + ComponentSet<RigidBodyPosition>
+ + ComponentSet<RigidBodyMassProps>,
+ {
// Generate constraints for joints.
self.not_ground_interactions.clear();
self.ground_interactions.clear();
@@ -260,6 +302,7 @@ impl SolverConstraints<AnyJointVelocityConstraint, AnyJointPositionConstraint> {
self.interaction_groups.clear_groups();
self.interaction_groups.group_joints(
island_id,
+ islands,
bodies,
joints,
&self.not_ground_interactions,
@@ -268,6 +311,7 @@ impl SolverConstraints<AnyJointVelocityConstraint, AnyJointPositionConstraint> {
self.ground_interaction_groups.clear_groups();
self.ground_interaction_groups.group_joints(
island_id,
+ islands,
bodies,
joints,
&self.ground_interactions,
@@ -292,12 +336,18 @@ impl SolverConstraints<AnyJointVelocityConstraint, AnyJointPositionConstraint> {
}
}
- fn compute_nongrouped_joint_ground_constraints(
+ fn compute_nongrouped_joint_ground_constraints<Bodies>(
&mut self,
params: &IntegrationParameters,
- bodies: &RigidBodySet,
+ bodies: &Bodies,
joints_all: &[JointGraphEdge],
- ) {
+ ) where
+ Bodies: ComponentSet<RigidBodyType>
+ + ComponentSet<RigidBodyPosition>
+ + ComponentSet<RigidBodyMassProps>
+ + ComponentSet<RigidBodyVelocity>
+ + ComponentSet<RigidBodyIds>,
+ {
for joint_i in &self.ground_interaction_groups.nongrouped_interactions {
let joint = &joints_all[*joint_i].weight;
let vel_constraint =
@@ -309,19 +359,25 @@ impl SolverConstraints<AnyJointVelocityConstraint, AnyJointPositionConstraint> {
}
#[cfg(feature = "simd-is-enabled")]
- fn compute_grouped_joint_ground_constraints(
+ fn compute_grouped_joint_ground_constraints<Bodies>(
&mut self,
params: &IntegrationParameters,
- bodies: &RigidBodySet,
+ bodies: &Bodies,
joints_all: &[JointGraphEdge],
- ) {
+ ) where
+ Bodies: ComponentSet<RigidBodyType>
+ + ComponentSet<RigidBodyVelocity>
+ + ComponentSet<RigidBodyPosition>
+ + ComponentSet<RigidBodyMassProps>
+ + ComponentSet<RigidBodyIds>,
+ {
for joints_i in self
.ground_interaction_groups
.grouped_interactions
.chunks_exact(SIMD_WIDTH)
{
- let joints_id = array![|ii| joints_i[ii]; SIMD_WIDTH];
- let joints = array![|ii| &joints_all[joints_i[ii]].weight; SIMD_WIDTH];
+ let joints_id = gather![|ii| joints_i[ii]];
+ let joints = gather![|ii| &joints_all[joints_i[ii]].weight];
let vel_constraint = AnyJointVelocityConstraint::from_wide_joint_ground(
params, joints_id, joints, bodies,
);
@@ -332,12 +388,17 @@ impl SolverConstraints<AnyJointVelocityConstraint, AnyJointPositionConstraint> {
}
}
- fn compute_nongrouped_joint_constraints(
+ fn compute_nongrouped_joint_constraints<Bodies>(
&mut self,
params: &IntegrationParameters,
- bodies: &RigidBodySet,
+ bodies: &Bodies,
joints_all: &[JointGraphEdge],
- ) {
+ ) where
+ Bodies: ComponentSet<RigidBodyPosition>
+ + ComponentSet<RigidBodyVelocity>
+ + ComponentSet<RigidBodyMassProps>
+ + ComponentSet<RigidBodyIds>,
+ {
for joint_i in &self.interaction_groups.nongrouped_interactions {
let joint = &joints_all[*joint_i].weight;
let vel_constraint =
@@ -349,19 +410,24 @@ impl SolverConstraints<AnyJointVelocityConstraint, AnyJointPositionConstraint> {
}
#[cfg(feature = "simd-is-enabled")]
- fn compute_grouped_joint_constraints(
+ fn compute_grouped_joint_constraints<Bodies>(
&mut self,
params: &IntegrationParameters,
- bodies: &RigidBodySet,
+ bodies: &Bodies,
joints_all: &[JointGraphEdge],
- ) {
+ ) where
+ Bodies: ComponentSet<RigidBodyPosition>
+ + ComponentSet<RigidBodyVelocity>
+ + ComponentSet<RigidBodyMassProps>
+ + ComponentSet<RigidBodyIds>,
+ {
for joints_i in self
.interaction_groups
.grouped_interactions
.chunks_exact(SIMD_WIDTH)
{
- let joints_id = array![|ii| joints_i[ii]; SIMD_WIDTH];
- let joints = array![|ii| &joints_all[joints_i[ii]].weight; SIMD_WIDTH];
+ let joints_id = gather![|ii| joints_i[ii]];
+ let joints = gather![|ii| &joints_all[joints_i[ii]].weight];
let vel_constraint =
AnyJointVelocityConstraint::from_wide_joint(params, joints_id, joints, bodies);
self.velocity_constraints.push(vel_constraint);