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 =
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user