diff options
| author | Sébastien Crozet <developer@crozet.re> | 2024-01-22 21:45:40 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-01-22 21:45:40 +0100 |
| commit | aef85ec2554476485dbf3de5f01257ced22bfe2f (patch) | |
| tree | 0fbfae9a523835079c9a362a93a69f2e78ccca25 /src/pipeline | |
| parent | 9ac3503b879f95fcdf5414470ba5aedf195b9a97 (diff) | |
| parent | 6cb727390a6172e539b3f0ef91c2861457495258 (diff) | |
| download | rapier-aef85ec2554476485dbf3de5f01257ced22bfe2f.tar.gz rapier-aef85ec2554476485dbf3de5f01257ced22bfe2f.tar.bz2 rapier-aef85ec2554476485dbf3de5f01257ced22bfe2f.zip | |
Merge pull request #579 from dimforge/joints-improvements
Feat: implement a "small-steps" velocity-based constraints solver + joint improvements
Diffstat (limited to 'src/pipeline')
| -rw-r--r-- | src/pipeline/debug_render_pipeline/debug_render_pipeline.rs | 4 | ||||
| -rw-r--r-- | src/pipeline/physics_pipeline.rs | 29 |
2 files changed, 17 insertions, 16 deletions
diff --git a/src/pipeline/debug_render_pipeline/debug_render_pipeline.rs b/src/pipeline/debug_render_pipeline/debug_render_pipeline.rs index f214b8c..706c810 100644 --- a/src/pipeline/debug_render_pipeline/debug_render_pipeline.rs +++ b/src/pipeline/debug_render_pipeline/debug_render_pipeline.rs @@ -8,7 +8,7 @@ use crate::geometry::{Cone, Cylinder}; use crate::math::{Isometry, Point, Real, Vector, DIM}; use crate::pipeline::debug_render_pipeline::debug_render_backend::DebugRenderObject; use crate::pipeline::debug_render_pipeline::DebugRenderStyle; -use crate::utils::WBasis; +use crate::utils::SimdBasis; use std::any::TypeId; use std::collections::HashMap; @@ -221,7 +221,7 @@ impl DebugRenderPipeline { } if self.mode.contains(DebugRenderMode::MULTIBODY_JOINTS) { - for (handle, multibody, link) in multibody_joints.iter() { + for (handle, _, multibody, link) in multibody_joints.iter() { let anc_color = self.style.multibody_joint_anchor_color; let sep_color = self.style.multibody_joint_separation_color; let parent = multibody.link(link.parent_id().unwrap()).unwrap(); diff --git a/src/pipeline/physics_pipeline.rs b/src/pipeline/physics_pipeline.rs index 7423296..5ff78fd 100644 --- a/src/pipeline/physics_pipeline.rs +++ b/src/pipeline/physics_pipeline.rs @@ -1,14 +1,14 @@ //! Physics pipeline structures. use crate::counters::Counters; -#[cfg(not(feature = "parallel"))] +// #[cfg(not(feature = "parallel"))] use crate::dynamics::IslandSolver; +#[cfg(feature = "parallel")] +use crate::dynamics::JointGraphEdge; use crate::dynamics::{ CCDSolver, ImpulseJointSet, IntegrationParameters, IslandManager, MultibodyJointSet, RigidBodyChanges, RigidBodyHandle, RigidBodyPosition, RigidBodyType, }; -#[cfg(feature = "parallel")] -use crate::dynamics::{JointGraphEdge, ParallelIslandSolver as IslandSolver}; use crate::geometry::{ BroadPhase, BroadPhasePairEvent, ColliderChanges, ColliderHandle, ColliderPair, ContactManifoldIndex, NarrowPhase, TemporaryInteractionIndex, @@ -206,19 +206,14 @@ impl PhysicsPipeline { self.counters.stages.update_time.resume(); for handle in islands.active_dynamic_bodies() { + // TODO: should that be moved to the solver (just like we moved + // the multibody dynamics update) since it depends on dt? let rb = bodies.index_mut_internal(*handle); rb.mprops.update_world_mass_properties(&rb.pos.position); let effective_mass = rb.mprops.effective_mass(); rb.forces .compute_effective_force_and_torque(&gravity, &effective_mass); } - - for multibody in &mut multibody_joints.multibodies { - multibody - .1 - .update_dynamics(integration_parameters.dt, bodies); - multibody.1.update_acceleration(bodies); - } self.counters.stages.update_time.pause(); self.counters.stages.solver_time.resume(); @@ -263,7 +258,11 @@ impl PhysicsPipeline { let manifold_indices = &self.manifold_indices[..]; let joint_constraint_indices = &self.joint_constraint_indices[..]; - rayon::scope(|scope| { + // PERF: right now, we are only doing islands-based parallelism. + // Intra-island parallelism (that hasn’t been ported to the new + // solver yet) will be supported in the future. + self.counters.solver.velocity_resolution_time.resume(); + rayon::scope(|_scope| { enable_flush_to_zero!(); solvers @@ -280,13 +279,14 @@ impl PhysicsPipeline { std::mem::transmute(multibody_joints.load(Ordering::Relaxed)) }; + let mut counters = Counters::new(false); solver.init_and_solve( - scope, island_id, - islands, + &mut counters, integration_parameters, + islands, bodies, - manifolds, + &mut manifolds[..], &manifold_indices[island_id], impulse_joints, &joint_constraint_indices[island_id], @@ -294,6 +294,7 @@ impl PhysicsPipeline { ) }); }); + self.counters.solver.velocity_resolution_time.pause(); } // Generate contact force events if needed. |
