diff options
| author | Sébastien Crozet <developer@crozet.re> | 2021-02-25 15:53:06 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-02-25 15:53:06 +0100 |
| commit | 1c5601c84bf5ca3b7fd611cc4b4fd7030526f71f (patch) | |
| tree | 11f2e197a7dfd16e7d527e198c4460df435a2cdd /src | |
| parent | f41a6fb76d2a762e7d0680dec25e2a48b701606e (diff) | |
| parent | f53d0438ed63417684c961ece307f8dc57ac7a5c (diff) | |
| download | rapier-1c5601c84bf5ca3b7fd611cc4b4fd7030526f71f.tar.gz rapier-1c5601c84bf5ca3b7fd611cc4b4fd7030526f71f.tar.bz2 rapier-1c5601c84bf5ca3b7fd611cc4b4fd7030526f71f.zip | |
Merge pull request #124 from dimforge/modify_contact_normal
Contact modification: make the contact normal modifiable too.
Diffstat (limited to 'src')
| -rw-r--r-- | src/geometry/narrow_phase.rs | 3 | ||||
| -rw-r--r-- | src/pipeline/physics_hooks.rs | 6 |
2 files changed, 8 insertions, 1 deletions
diff --git a/src/geometry/narrow_phase.rs b/src/geometry/narrow_phase.rs index 28c53f1..9c635dc 100644 --- a/src/geometry/narrow_phase.rs +++ b/src/geometry/narrow_phase.rs @@ -594,6 +594,7 @@ impl NarrowPhase { let mut modifiable_solver_contacts = std::mem::replace(&mut manifold.data.solver_contacts, Vec::new()); let mut modifiable_user_data = manifold.data.user_data; + let mut modifiable_normal = manifold.data.normal; let mut context = ContactModificationContext { rigid_body1: rb1, @@ -604,12 +605,14 @@ impl NarrowPhase { collider2: co2, manifold, solver_contacts: &mut modifiable_solver_contacts, + normal: &mut modifiable_normal, user_data: &mut modifiable_user_data, }; hooks.modify_solver_contacts(&mut context); manifold.data.solver_contacts = modifiable_solver_contacts; + manifold.data.normal = modifiable_normal; manifold.data.user_data = modifiable_user_data; } } diff --git a/src/pipeline/physics_hooks.rs b/src/pipeline/physics_hooks.rs index 11ca485..c3621ea 100644 --- a/src/pipeline/physics_hooks.rs +++ b/src/pipeline/physics_hooks.rs @@ -19,7 +19,7 @@ pub struct PairFilterContext<'a> { pub collider2: &'a Collider, } -/// Context given to custom contact modifiers to modify the contacts seen by the constrainst solver. +/// 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, @@ -37,6 +37,8 @@ pub struct ContactModificationContext<'a> { pub manifold: &'a ContactManifold, /// The solver contacts that can be modified. pub solver_contacts: &'a mut Vec<SolverContact>, + /// The contact normal that can be modified. + pub normal: &'a mut Vector<Real>, /// User-defined data attached to the manifold. // NOTE: we keep this a &'a mut u32 to emphasize the // fact that this can be modified. @@ -195,6 +197,8 @@ pub trait PhysicsHooks: Send + Sync { /// Each contact manifold is given a `u32` user-defined data that is persistent between /// timesteps (as long as the contact manifold exists). This user-defined data is initialized /// 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) {} } |
