aboutsummaryrefslogtreecommitdiff
path: root/src/pipeline/physics_hooks.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/pipeline/physics_hooks.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/pipeline/physics_hooks.rs')
-rw-r--r--src/pipeline/physics_hooks.rs83
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>) {}
}