Merge pull request #124 from dimforge/modify_contact_normal
Contact modification: make the contact normal modifiable too.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user