Merge pull request #124 from dimforge/modify_contact_normal

Contact modification: make the contact normal modifiable too.
This commit is contained in:
Sébastien Crozet
2021-02-25 15:53:06 +01:00
committed by GitHub
2 changed files with 8 additions and 1 deletions

View File

@@ -594,6 +594,7 @@ impl NarrowPhase {
let mut modifiable_solver_contacts = let mut modifiable_solver_contacts =
std::mem::replace(&mut manifold.data.solver_contacts, Vec::new()); std::mem::replace(&mut manifold.data.solver_contacts, Vec::new());
let mut modifiable_user_data = manifold.data.user_data; let mut modifiable_user_data = manifold.data.user_data;
let mut modifiable_normal = manifold.data.normal;
let mut context = ContactModificationContext { let mut context = ContactModificationContext {
rigid_body1: rb1, rigid_body1: rb1,
@@ -604,12 +605,14 @@ impl NarrowPhase {
collider2: co2, collider2: co2,
manifold, manifold,
solver_contacts: &mut modifiable_solver_contacts, solver_contacts: &mut modifiable_solver_contacts,
normal: &mut modifiable_normal,
user_data: &mut modifiable_user_data, user_data: &mut modifiable_user_data,
}; };
hooks.modify_solver_contacts(&mut context); hooks.modify_solver_contacts(&mut context);
manifold.data.solver_contacts = modifiable_solver_contacts; manifold.data.solver_contacts = modifiable_solver_contacts;
manifold.data.normal = modifiable_normal;
manifold.data.user_data = modifiable_user_data; manifold.data.user_data = modifiable_user_data;
} }
} }

View File

@@ -19,7 +19,7 @@ pub struct PairFilterContext<'a> {
pub collider2: &'a Collider, 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> { pub struct ContactModificationContext<'a> {
/// The first collider involved in the potential collision. /// The first collider involved in the potential collision.
pub rigid_body1: &'a RigidBody, pub rigid_body1: &'a RigidBody,
@@ -37,6 +37,8 @@ pub struct ContactModificationContext<'a> {
pub manifold: &'a ContactManifold, pub manifold: &'a ContactManifold,
/// The solver contacts that can be modified. /// The solver contacts that can be modified.
pub solver_contacts: &'a mut Vec<SolverContact>, 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. /// User-defined data attached to the manifold.
// NOTE: we keep this a &'a mut u32 to emphasize the // NOTE: we keep this a &'a mut u32 to emphasize the
// fact that this can be modified. // 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 /// 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 /// timesteps (as long as the contact manifold exists). This user-defined data is initialized
/// as 0 and can be modified in `context.user_data`. /// 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) {}
} }