aboutsummaryrefslogtreecommitdiff
path: root/src/geometry/collider.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/geometry/collider.rs')
-rw-r--r--src/geometry/collider.rs64
1 files changed, 33 insertions, 31 deletions
diff --git a/src/geometry/collider.rs b/src/geometry/collider.rs
index 8d9b005..2f2e4ac 100644
--- a/src/geometry/collider.rs
+++ b/src/geometry/collider.rs
@@ -26,6 +26,7 @@ pub struct Collider {
pub(crate) material: ColliderMaterial,
pub(crate) flags: ColliderFlags,
pub(crate) bf_data: ColliderBroadPhaseData,
+ pub(crate) contact_force_event_threshold: Real,
/// User-defined data associated to this collider.
pub user_data: u128,
}
@@ -124,6 +125,11 @@ impl Collider {
self.material.restitution_combine_rule = rule;
}
+ /// Sets the total force magnitude beyond which a contact force event can be emitted.
+ pub fn set_contact_force_event_threshold(&mut self, threshold: Real) {
+ self.contact_force_event_threshold = threshold;
+ }
+
/// Sets whether or not this is a sensor collider.
pub fn set_sensor(&mut self, is_sensor: bool) {
if is_sensor != self.is_sensor() {
@@ -283,6 +289,11 @@ impl Collider {
ColliderMassProps::MassProperties(mass_properties) => **mass_properties,
}
}
+
+ /// The total force magnitude beyond which a contact force event can be emitted.
+ pub fn contact_force_event_threshold(&self) -> Real {
+ self.contact_force_event_threshold
+ }
}
/// A structure responsible for building a new collider.
@@ -321,6 +332,8 @@ pub struct ColliderBuilder {
pub collision_groups: InteractionGroups,
/// The solver groups for the collider being built.
pub solver_groups: InteractionGroups,
+ /// The total force magnitude beyond which a contact force event can be emitted.
+ pub contact_force_event_threshold: Real,
}
impl ColliderBuilder {
@@ -342,6 +355,7 @@ impl ColliderBuilder {
active_collision_types: ActiveCollisionTypes::default(),
active_hooks: ActiveHooks::empty(),
active_events: ActiveEvents::empty(),
+ contact_force_event_threshold: Real::MAX,
}
}
@@ -681,6 +695,12 @@ impl ColliderBuilder {
self
}
+ /// Sets the total force magnitude beyond which a contact force event can be emitted.
+ pub fn contact_force_event_threshold(mut self, threshold: Real) -> Self {
+ self.contact_force_event_threshold = threshold;
+ self
+ }
+
/// Sets the initial translation of the collider to be created.
///
/// If the collider will be attached to a rigid-body, this sets the translation relative to the
@@ -725,34 +745,6 @@ impl ColliderBuilder {
/// Builds a new collider attached to the given rigid-body.
pub fn build(&self) -> Collider {
- let (changes, pos, bf_data, shape, coll_type, material, flags, mprops) = self.components();
- Collider {
- shape,
- mprops,
- material,
- parent: None,
- changes,
- pos,
- bf_data,
- flags,
- coll_type,
- user_data: self.user_data,
- }
- }
-
- /// Builds all the components required by a collider.
- pub fn components(
- &self,
- ) -> (
- ColliderChanges,
- ColliderPosition,
- ColliderBroadPhaseData,
- ColliderShape,
- ColliderType,
- ColliderMaterial,
- ColliderFlags,
- ColliderMassProps,
- ) {
let mass_info = if let Some(mp) = self.mass_properties {
ColliderMassProps::MassProperties(Box::new(mp))
} else {
@@ -785,9 +777,19 @@ impl ColliderBuilder {
ColliderType::Solid
};
- (
- changes, pos, bf_data, shape, coll_type, material, flags, mprops,
- )
+ Collider {
+ shape,
+ mprops,
+ material,
+ parent: None,
+ changes,
+ pos,
+ bf_data,
+ flags,
+ coll_type,
+ contact_force_event_threshold: self.contact_force_event_threshold,
+ user_data: self.user_data,
+ }
}
}