aboutsummaryrefslogtreecommitdiff
path: root/src/geometry/collider.rs
diff options
context:
space:
mode:
authorCrozet Sébastien <developer@crozet.re>2021-06-01 17:59:07 +0200
committerCrozet Sébastien <developer@crozet.re>2021-06-01 17:59:07 +0200
commit7153eb7779a29853289df90f28efaac738620386 (patch)
tree561a81b65609b60c4429c134ea474a160d70d80e /src/geometry/collider.rs
parent1839f61d816af37c95889caf592b5a7cf8d89412 (diff)
downloadrapier-7153eb7779a29853289df90f28efaac738620386.tar.gz
rapier-7153eb7779a29853289df90f28efaac738620386.tar.bz2
rapier-7153eb7779a29853289df90f28efaac738620386.zip
Add ActiveCollisionTypes to easily enable collision-detection between two non-static rigid-body.
Diffstat (limited to 'src/geometry/collider.rs')
-rw-r--r--src/geometry/collider.rs67
1 files changed, 36 insertions, 31 deletions
diff --git a/src/geometry/collider.rs b/src/geometry/collider.rs
index b9007bf..0101a09 100644
--- a/src/geometry/collider.rs
+++ b/src/geometry/collider.rs
@@ -1,8 +1,8 @@
use crate::dynamics::{CoefficientCombineRule, MassProperties, RigidBodyHandle};
use crate::geometry::{
- ColliderBroadPhaseData, ColliderChanges, ColliderFlags, ColliderGroups, ColliderMassProps,
- ColliderMaterial, ColliderParent, ColliderPosition, ColliderShape, ColliderType,
- InteractionGroups, SharedShape,
+ ActiveCollisionTypes, ColliderBroadPhaseData, ColliderChanges, ColliderFlags,
+ ColliderMassProps, ColliderMaterial, ColliderParent, ColliderPosition, ColliderShape,
+ ColliderType, InteractionGroups, SharedShape,
};
use crate::math::{AngVector, Isometry, Point, Real, Rotation, Vector, DIM};
use crate::parry::transformation::vhacd::VHACDParameters;
@@ -25,7 +25,6 @@ pub struct Collider {
pub(crate) co_pos: ColliderPosition,
pub(crate) co_material: ColliderMaterial,
pub(crate) co_flags: ColliderFlags,
- pub(crate) co_groups: ColliderGroups,
pub(crate) co_bf_data: ColliderBroadPhaseData,
/// User-defined data associated to this rigid-body.
pub user_data: u128,
@@ -57,16 +56,26 @@ impl Collider {
self.co_flags.active_hooks = active_hooks;
}
- /// The physics hooks enabled for this collider.
+ /// The events enabled for this collider.
pub fn active_events(&self) -> ActiveEvents {
self.co_flags.active_events
}
- /// Sets the physics hooks enabled for this collider.
+ /// Sets the events enabled for this collider.
pub fn set_active_events(&mut self, active_events: ActiveEvents) {
self.co_flags.active_events = active_events;
}
+ /// The collision types enabled for this collider.
+ pub fn active_collision_types(&self) -> ActiveCollisionTypes {
+ self.co_flags.active_collision_types
+ }
+
+ /// Sets the collision types enabled for this collider.
+ pub fn set_active_collision_types(&mut self, active_collision_types: ActiveCollisionTypes) {
+ self.co_flags.active_collision_types = active_collision_types;
+ }
+
/// The friction coefficient of this collider.
pub fn friction(&self) -> Real {
self.co_material.friction
@@ -179,27 +188,27 @@ impl Collider {
/// The collision groups used by this collider.
pub fn collision_groups(&self) -> InteractionGroups {
- self.co_groups.collision_groups
+ self.co_flags.collision_groups
}
/// Sets the collision groups of this collider.
pub fn set_collision_groups(&mut self, groups: InteractionGroups) {
- if self.co_groups.collision_groups != groups {
+ if self.co_flags.collision_groups != groups {
self.co_changes.insert(ColliderChanges::GROUPS);
- self.co_groups.collision_groups = groups;
+ self.co_flags.collision_groups = groups;
}
}
/// The solver groups used by this collider.
pub fn solver_groups(&self) -> InteractionGroups {
- self.co_groups.solver_groups
+ self.co_flags.solver_groups
}
/// Sets the solver groups of this collider.
pub fn set_solver_groups(&mut self, groups: InteractionGroups) {
- if self.co_groups.solver_groups != groups {
+ if self.co_flags.solver_groups != groups {
self.co_changes.insert(ColliderChanges::GROUPS);
- self.co_groups.solver_groups = groups;
+ self.co_flags.solver_groups = groups;
}
}
@@ -281,6 +290,8 @@ pub struct ColliderBuilder {
pub position: Isometry<Real>,
/// Is this collider a sensor?
pub is_sensor: bool,
+ /// Contact pairs enabled for this collider.
+ pub active_collision_types: ActiveCollisionTypes,
/// Physics hooks enabled for this collider.
pub active_hooks: ActiveHooks,
/// Events enabled for this collider.
@@ -309,6 +320,7 @@ impl ColliderBuilder {
solver_groups: InteractionGroups::all(),
friction_combine_rule: CoefficientCombineRule::Average,
restitution_combine_rule: CoefficientCombineRule::Average,
+ active_collision_types: ActiveCollisionTypes::default(),
active_hooks: ActiveHooks::empty(),
active_events: ActiveEvents::empty(),
}
@@ -605,6 +617,12 @@ impl ColliderBuilder {
self
}
+ /// The set of active collision types for this collider.
+ pub fn active_collision_types(mut self, active_collision_types: ActiveCollisionTypes) -> Self {
+ self.active_collision_types = active_collision_types;
+ self
+ }
+
/// Sets the friction coefficient of the collider this builder will build.
pub fn friction(mut self, friction: Real) -> Self {
self.friction = friction;
@@ -691,27 +709,17 @@ impl ColliderBuilder {
/// Builds a new collider attached to the given rigid-body.
pub fn build(&self) -> Collider {
- let (
- co_changes,
- co_pos,
- co_bf_data,
- co_shape,
- co_type,
- co_groups,
- co_material,
- co_flags,
- co_mprops,
- ) = self.components();
+ let (co_changes, co_pos, co_bf_data, co_shape, co_type, co_material, co_flags, co_mprops) =
+ self.components();
Collider {
co_shape,
co_mprops,
co_material,
- co_flags,
co_parent: None,
co_changes,
co_pos,
co_bf_data,
- co_groups,
+ co_flags,
co_type,
user_data: self.user_data,
}
@@ -726,7 +734,6 @@ impl ColliderBuilder {
ColliderBroadPhaseData,
ColliderShape,
ColliderType,
- ColliderGroups,
ColliderMaterial,
ColliderFlags,
ColliderMassProps,
@@ -748,16 +755,15 @@ impl ColliderBuilder {
restitution_combine_rule: self.restitution_combine_rule,
};
let co_flags = ColliderFlags {
+ collision_groups: self.collision_groups,
+ solver_groups: self.solver_groups,
+ active_collision_types: self.active_collision_types,
active_hooks: self.active_hooks,
active_events: self.active_events,
};
let co_changes = ColliderChanges::all();
let co_pos = ColliderPosition(self.position);
let co_bf_data = ColliderBroadPhaseData::default();
- let co_groups = ColliderGroups {
- collision_groups: self.collision_groups,
- solver_groups: self.solver_groups,
- };
let co_type = if self.is_sensor {
ColliderType::Sensor
} else {
@@ -770,7 +776,6 @@ impl ColliderBuilder {
co_bf_data,
co_shape,
co_type,
- co_groups,
co_material,
co_flags,
co_mprops,