diff options
| author | Crozet Sébastien <developer@crozet.re> | 2021-04-26 17:59:25 +0200 |
|---|---|---|
| committer | Crozet Sébastien <developer@crozet.re> | 2021-04-26 18:00:50 +0200 |
| commit | c32da78f2a6014c491aa3e975fb83ddb7c80610e (patch) | |
| tree | edd20f23270baee1577c486f78d825eb93ea0de0 /src/pipeline/physics_hooks.rs | |
| parent | aaf80bfa872c6f29b248cab8eb5658ab0d73cb4a (diff) | |
| download | rapier-c32da78f2a6014c491aa3e975fb83ddb7c80610e.tar.gz rapier-c32da78f2a6014c491aa3e975fb83ddb7c80610e.tar.bz2 rapier-c32da78f2a6014c491aa3e975fb83ddb7c80610e.zip | |
Split rigid-bodies and colliders into multiple components
Diffstat (limited to 'src/pipeline/physics_hooks.rs')
| -rw-r--r-- | src/pipeline/physics_hooks.rs | 83 |
1 files changed, 46 insertions, 37 deletions
diff --git a/src/pipeline/physics_hooks.rs b/src/pipeline/physics_hooks.rs index 72b635f..c4ef245 100644 --- a/src/pipeline/physics_hooks.rs +++ b/src/pipeline/physics_hooks.rs @@ -1,38 +1,38 @@ -use crate::dynamics::RigidBody; -use crate::geometry::{Collider, ColliderHandle, ContactManifold, SolverContact, SolverFlags}; +use crate::dynamics::RigidBodyHandle; +use crate::geometry::{ColliderHandle, ContactManifold, SolverContact, SolverFlags}; use crate::math::{Real, Vector}; use na::ComplexField; /// Context given to custom collision filters to filter-out collisions. -pub struct PairFilterContext<'a> { - /// The first collider involved in the potential collision. - pub rigid_body1: &'a RigidBody, - /// The first collider involved in the potential collision. - pub rigid_body2: &'a RigidBody, - /// The first collider involved in the potential collision. - pub collider_handle1: ColliderHandle, - /// The first collider involved in the potential collision. - pub collider_handle2: ColliderHandle, - /// The first collider involved in the potential collision. - pub collider1: &'a Collider, - /// The first collider involved in the potential collision. - pub collider2: &'a Collider, +pub struct PairFilterContext<'a, Bodies, Colliders> { + /// The set of rigid-bodies. + pub bodies: &'a Bodies, + /// The set of colliders. + pub colliders: &'a Colliders, + /// The handle of the first collider involved in the potential collision. + pub collider1: ColliderHandle, + /// The handle of the first collider involved in the potential collision. + pub collider2: ColliderHandle, + /// The handle of the first body involved in the potential collision. + pub rigid_body1: Option<RigidBodyHandle>, + /// The handle of the first body involved in the potential collision. + pub rigid_body2: Option<RigidBodyHandle>, } /// Context given to custom contact modifiers to modify the contacts seen by the constraints solver. -pub struct ContactModificationContext<'a> { - /// The first collider involved in the potential collision. - pub rigid_body1: &'a RigidBody, - /// The first collider involved in the potential collision. - pub rigid_body2: &'a RigidBody, - /// The first collider involved in the potential collision. - pub collider_handle1: ColliderHandle, - /// The first collider involved in the potential collision. - pub collider_handle2: ColliderHandle, - /// The first collider involved in the potential collision. - pub collider1: &'a Collider, - /// The first collider involved in the potential collision. - pub collider2: &'a Collider, +pub struct ContactModificationContext<'a, Bodies, Colliders> { + /// The set of rigid-bodies. + pub bodies: &'a Bodies, + /// The set of colliders. + pub colliders: &'a Colliders, + /// The handle of the first collider involved in the potential collision. + pub collider1: ColliderHandle, + /// The handle of the first collider involved in the potential collision. + pub collider2: ColliderHandle, + /// The handle of the first body involved in the potential collision. + pub rigid_body1: Option<RigidBodyHandle>, + /// The handle of the first body involved in the potential collision. + pub rigid_body2: Option<RigidBodyHandle>, /// The contact manifold. pub manifold: &'a ContactManifold, /// The solver contacts that can be modified. @@ -45,7 +45,7 @@ pub struct ContactModificationContext<'a> { pub user_data: &'a mut u32, } -impl<'a> ContactModificationContext<'a> { +impl<'a, Bodies, Colliders> ContactModificationContext<'a, Bodies, Colliders> { /// Helper function to update `self` to emulate a oneway-platform. /// /// The "oneway" behavior will only allow contacts between two colliders @@ -127,9 +127,14 @@ bitflags::bitflags! { const MODIFY_SOLVER_CONTACTS = 0b0100; } } +impl Default for PhysicsHooksFlags { + fn default() -> Self { + PhysicsHooksFlags::empty() + } +} /// User-defined functions called by the physics engines during one timestep in order to customize its behavior. -pub trait PhysicsHooks: Send + Sync { +pub trait PhysicsHooks<Bodies, Colliders>: Send + Sync { /// The sets of hooks that must be taken into account. fn active_hooks(&self) -> PhysicsHooksFlags; @@ -156,7 +161,10 @@ pub trait PhysicsHooks: Send + Sync { /// will be taken into account by the constraints solver. If this returns /// `Some(SolverFlags::empty())` then the constraints solver will ignore these /// contacts. - fn filter_contact_pair(&self, _context: &PairFilterContext) -> Option<SolverFlags> { + fn filter_contact_pair( + &self, + _context: &PairFilterContext<Bodies, Colliders>, + ) -> Option<SolverFlags> { None } @@ -179,7 +187,7 @@ pub trait PhysicsHooks: Send + Sync { /// not compute any intersection information for it. /// If this return `true` then the narrow-phase will compute intersection /// information for this pair. - fn filter_intersection_pair(&self, _context: &PairFilterContext) -> bool { + fn filter_intersection_pair(&self, _context: &PairFilterContext<Bodies, Colliders>) -> bool { false } @@ -207,21 +215,22 @@ pub trait PhysicsHooks: Send + Sync { /// as 0 and can be modified in `context.user_data`. /// /// The world-space contact normal can be modified in `context.normal`. - fn modify_solver_contacts(&self, _context: &mut ContactModificationContext) {} + fn modify_solver_contacts(&self, _context: &mut ContactModificationContext<Bodies, Colliders>) { + } } -impl PhysicsHooks for () { +impl<Bodies, Colliders> PhysicsHooks<Bodies, Colliders> for () { fn active_hooks(&self) -> PhysicsHooksFlags { PhysicsHooksFlags::empty() } - fn filter_contact_pair(&self, _: &PairFilterContext) -> Option<SolverFlags> { + fn filter_contact_pair(&self, _: &PairFilterContext<Bodies, Colliders>) -> Option<SolverFlags> { None } - fn filter_intersection_pair(&self, _: &PairFilterContext) -> bool { + fn filter_intersection_pair(&self, _: &PairFilterContext<Bodies, Colliders>) -> bool { false } - fn modify_solver_contacts(&self, _: &mut ContactModificationContext) {} + fn modify_solver_contacts(&self, _: &mut ContactModificationContext<Bodies, Colliders>) {} } |
