aboutsummaryrefslogtreecommitdiff
path: root/src/geometry/collider.rs
diff options
context:
space:
mode:
authorCrozet Sébastien <developer@crozet.re>2021-05-25 11:00:13 +0200
committerCrozet Sébastien <developer@crozet.re>2021-05-25 11:00:13 +0200
commit1bef66fea941307a7305ddaebdb0abe3d0cb281f (patch)
tree450bc3cd2fd611f91cb7d7809edcc4260f043b0b /src/geometry/collider.rs
parent47139323e01f978a94ed7aa2c33bbf63b00f4c30 (diff)
downloadrapier-1bef66fea941307a7305ddaebdb0abe3d0cb281f.tar.gz
rapier-1bef66fea941307a7305ddaebdb0abe3d0cb281f.tar.bz2
rapier-1bef66fea941307a7305ddaebdb0abe3d0cb281f.zip
Add prelude + use vectors for setting linvel/translation in builders
Diffstat (limited to 'src/geometry/collider.rs')
-rw-r--r--src/geometry/collider.rs179
1 files changed, 110 insertions, 69 deletions
diff --git a/src/geometry/collider.rs b/src/geometry/collider.rs
index 08295c1..e73c518 100644
--- a/src/geometry/collider.rs
+++ b/src/geometry/collider.rs
@@ -2,10 +2,11 @@ use crate::dynamics::{CoefficientCombineRule, MassProperties, RigidBodyHandle};
use crate::geometry::{
ColliderBroadPhaseData, ColliderChanges, ColliderGroups, ColliderMassProperties,
ColliderMaterial, ColliderParent, ColliderPosition, ColliderShape, ColliderType,
- InteractionGroups, SharedShape, SolverFlags,
+ InteractionGroups, SharedShape,
};
use crate::math::{AngVector, Isometry, Point, Real, Rotation, Vector, DIM};
use crate::parry::transformation::vhacd::VHACDParameters;
+use crate::pipeline::PhysicsHooksFlags;
use na::Unit;
use parry::bounding_volume::AABB;
use parry::shape::Shape;
@@ -20,7 +21,7 @@ pub struct Collider {
pub(crate) co_shape: ColliderShape,
pub(crate) co_mprops: ColliderMassProperties,
pub(crate) co_changes: ColliderChanges,
- pub(crate) co_parent: ColliderParent,
+ pub(crate) co_parent: Option<ColliderParent>,
pub(crate) co_pos: ColliderPosition,
pub(crate) co_material: ColliderMaterial,
pub(crate) co_groups: ColliderGroups,
@@ -31,14 +32,14 @@ pub struct Collider {
impl Collider {
pub(crate) fn reset_internal_references(&mut self) {
- self.co_parent.handle = RigidBodyHandle::invalid();
+ self.co_parent = None;
self.co_bf_data.proxy_index = crate::INVALID_U32;
self.co_changes = ColliderChanges::all();
}
/// The rigid body this collider is attached to.
- pub fn parent(&self) -> RigidBodyHandle {
- self.co_parent.handle
+ pub fn parent(&self) -> Option<RigidBodyHandle> {
+ self.co_parent.map(|parent| parent.handle)
}
/// Is this collider a sensor?
@@ -46,6 +47,26 @@ impl Collider {
self.co_type.is_sensor()
}
+ /// The physics hooks enabled for this collider.
+ pub fn active_hooks(&self) -> PhysicsHooksFlags {
+ self.co_material.active_hooks
+ }
+
+ /// Sets the physics hooks enabled for this collider.
+ pub fn set_active_hooks(&mut self, active_hooks: PhysicsHooksFlags) {
+ self.co_material.active_hooks = active_hooks;
+ }
+
+ /// The friction coefficient of this collider.
+ pub fn friction(&self) -> Real {
+ self.co_material.friction
+ }
+
+ /// Sets the friction coefficient of this collider.
+ pub fn set_friction(&mut self, coefficient: Real) {
+ self.co_material.friction = coefficient
+ }
+
/// The combine rule used by this collider to combine its friction
/// coefficient with the friction coefficient of the other collider it
/// is in contact with.
@@ -60,6 +81,16 @@ impl Collider {
self.co_material.friction_combine_rule = rule;
}
+ /// The restitution coefficient of this collider.
+ pub fn restitution(&self) -> Real {
+ self.co_material.restitution
+ }
+
+ /// Sets the restitution coefficient of this collider.
+ pub fn set_restitution(&mut self, coefficient: Real) {
+ self.co_material.restitution = coefficient
+ }
+
/// The combine rule used by this collider to combine its restitution
/// coefficient with the restitution coefficient of the other collider it
/// is in contact with.
@@ -86,15 +117,22 @@ impl Collider {
}
}
- #[doc(hidden)]
- pub fn set_position_debug(&mut self, position: Isometry<Real>) {
- self.co_pos.0 = position;
+ /// Sets the translational part of this collider's position.
+ pub fn set_translation(&mut self, translation: Vector<Real>) {
+ self.co_changes.insert(ColliderChanges::POSITION);
+ self.co_pos.0.translation.vector = translation;
}
- /// The position of this collider expressed in the local-space of the rigid-body it is attached to.
- #[deprecated(note = "use `.position_wrt_parent()` instead.")]
- pub fn delta(&self) -> &Isometry<Real> {
- &self.co_parent.pos_wrt_parent
+ /// Sets the rotational part of this collider's position.
+ pub fn set_rotation(&mut self, rotation: AngVector<Real>) {
+ self.co_changes.insert(ColliderChanges::POSITION);
+ self.co_pos.0.rotation = Rotation::new(rotation);
+ }
+
+ /// Sets the position of this collider.
+ pub fn set_position(&mut self, position: Isometry<Real>) {
+ self.co_changes.insert(ColliderChanges::POSITION);
+ self.co_pos.0 = position;
}
/// The world-space position of this collider.
@@ -102,15 +140,31 @@ impl Collider {
&self.co_pos
}
+ /// The translational part of this rigid-body's position.
+ pub fn translation(&self) -> &Vector<Real> {
+ &self.co_pos.0.translation.vector
+ }
+
+ /// The rotational part of this rigid-body's position.
+ pub fn rotation(&self) -> &Rotation<Real> {
+ &self.co_pos.0.rotation
+ }
+
/// The position of this collider wrt the body it is attached to.
- pub fn position_wrt_parent(&self) -> &Isometry<Real> {
- &self.co_parent.pos_wrt_parent
+ pub fn position_wrt_parent(&self) -> Option<&Isometry<Real>> {
+ self.co_parent.as_ref().map(|p| &p.pos_wrt_parent)
}
/// Sets the position of this collider wrt. its parent rigid-body.
- pub fn set_position_wrt_parent(&mut self, position: Isometry<Real>) {
+ ///
+ /// Panics if the collider is not attached to a rigid-body.
+ pub fn set_position_wrt_parent(&mut self, pos_wrt_parent: Isometry<Real>) {
self.co_changes.insert(ColliderChanges::PARENT);
- self.co_parent.pos_wrt_parent = position;
+ let co_parent = self
+ .co_parent
+ .as_mut()
+ .expect("This collider has no parent.");
+ co_parent.pos_wrt_parent = pos_wrt_parent;
}
/// The collision groups used by this collider.
@@ -213,13 +267,12 @@ pub struct ColliderBuilder {
pub restitution: Real,
/// The rule used to combine two restitution coefficients.
pub restitution_combine_rule: CoefficientCombineRule,
- /// The position of this collider relative to the local frame of the rigid-body it is attached to.
- pub pos_wrt_parent: Isometry<Real>,
+ /// The position of this collider.
+ pub position: Isometry<Real>,
/// Is this collider a sensor?
pub is_sensor: bool,
- /// Do we have to always call the contact modifier
- /// on this collider?
- pub modify_solver_contacts: bool,
+ /// Physics hooks enabled for this collider.
+ pub active_hooks: PhysicsHooksFlags,
/// The user-data of the collider being built.
pub user_data: u128,
/// The collision groups for the collider being built.
@@ -237,14 +290,14 @@ impl ColliderBuilder {
mass_properties: None,
friction: Self::default_friction(),
restitution: 0.0,
- pos_wrt_parent: Isometry::identity(),
+ position: Isometry::identity(),
is_sensor: false,
user_data: 0,
collision_groups: InteractionGroups::all(),
solver_groups: InteractionGroups::all(),
friction_combine_rule: CoefficientCombineRule::Average,
restitution_combine_rule: CoefficientCombineRule::Average,
- modify_solver_contacts: false,
+ active_hooks: PhysicsHooksFlags::empty(),
}
}
@@ -489,6 +542,11 @@ impl ColliderBuilder {
0.5
}
+ /// The default density used by the collider builder.
+ pub fn default_density() -> Real {
+ 1.0
+ }
+
/// Sets an arbitrary user-defined 128-bit integer associated to the colliders built by this builder.
pub fn user_data(mut self, data: u128) -> Self {
self.user_data = data;
@@ -522,10 +580,9 @@ impl ColliderBuilder {
self
}
- /// If set to `true` then the physics hooks will always run to modify
- /// contacts involving this collider.
- pub fn modify_solver_contacts(mut self, modify_solver_contacts: bool) -> Self {
- self.modify_solver_contacts = modify_solver_contacts;
+ /// The set of physics hooks enabled for this collider.
+ pub fn active_hooks(mut self, active_hooks: PhysicsHooksFlags) -> Self {
+ self.active_hooks = active_hooks;
self
}
@@ -571,51 +628,45 @@ impl ColliderBuilder {
self
}
- /// Sets the initial translation of the collider to be created,
- /// relative to the rigid-body it is attached to.
- #[cfg(feature = "dim2")]
- pub fn translation(mut self, x: Real, y: Real) -> Self {
- self.pos_wrt_parent.translation.x = x;
- self.pos_wrt_parent.translation.y = y;
- self
- }
-
- /// Sets the initial translation of the collider to be created,
- /// relative to the rigid-body it is attached to.
- #[cfg(feature = "dim3")]
- pub fn translation(mut self, x: Real, y: Real, z: Real) -> Self {
- self.pos_wrt_parent.translation.x = x;
- self.pos_wrt_parent.translation.y = y;
- self.pos_wrt_parent.translation.z = z;
+ /// 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
+ /// rigid-body it will be attached to.
+ pub fn translation(mut self, translation: Vector<Real>) -> Self {
+ self.position.translation.vector = translation;
self
}
- /// Sets the initial orientation of the collider to be created,
- /// relative to the rigid-body it is attached to.
+ /// Sets the initial orientation of the collider to be created.
+ ///
+ /// If the collider will be attached to a rigid-body, this sets the orientation relative to the
+ /// rigid-body it will be attached to.
pub fn rotation(mut self, angle: AngVector<Real>) -> Self {
- self.pos_wrt_parent.rotation = Rotation::new(angle);
+ self.position.rotation = Rotation::new(angle);
self
}
- /// Sets the initial position (translation and orientation) of the collider to be created,
- /// relative to the rigid-body it is attached to.
- pub fn position_wrt_parent(mut self, pos: Isometry<Real>) -> Self {
- self.pos_wrt_parent = pos;
+ /// Sets the initial position (translation and orientation) of the collider to be created.
+ ///
+ /// If the collider will be attached to a rigid-body, this sets the position relative
+ /// to the rigid-body it will be attached to.
+ pub fn position(mut self, pos: Isometry<Real>) -> Self {
+ self.position = pos;
self
}
/// Sets the initial position (translation and orientation) of the collider to be created,
/// relative to the rigid-body it is attached to.
- #[deprecated(note = "Use `.position_wrt_parent` instead.")]
- pub fn position(mut self, pos: Isometry<Real>) -> Self {
- self.pos_wrt_parent = pos;
+ #[deprecated(note = "Use `.position` instead.")]
+ pub fn position_wrt_parent(mut self, pos: Isometry<Real>) -> Self {
+ self.position = pos;
self
}
/// Set the position of this collider in the local-space of the rigid-body it is attached to.
- #[deprecated(note = "Use `.position_wrt_parent` instead.")]
+ #[deprecated(note = "Use `.position` instead.")]
pub fn delta(mut self, delta: Isometry<Real>) -> Self {
- self.pos_wrt_parent = delta;
+ self.position = delta;
self
}
@@ -623,15 +674,11 @@ impl ColliderBuilder {
pub fn build(&self) -> Collider {
let (co_changes, co_pos, co_bf_data, co_shape, co_type, co_groups, co_material, co_mprops) =
self.components();
- let co_parent = ColliderParent {
- pos_wrt_parent: co_pos.0,
- handle: RigidBodyHandle::invalid(),
- };
Collider {
co_shape,
co_mprops,
co_material,
- co_parent,
+ co_parent: None,
co_changes,
co_pos,
co_bf_data,
@@ -657,17 +704,11 @@ impl ColliderBuilder {
let mass_info = if let Some(mp) = self.mass_properties {
ColliderMassProperties::MassProperties(Box::new(mp))
} else {
- let default_density = if self.is_sensor { 0.0 } else { 1.0 };
+ let default_density = Self::default_density();
let density = self.density.unwrap_or(default_density);
ColliderMassProperties::Density(density)
};
- let mut solver_flags = SolverFlags::default();
- solver_flags.set(
- SolverFlags::MODIFY_SOLVER_CONTACTS,
- self.modify_solver_contacts,
- );
-
let co_shape = self.shape.clone();
let co_mprops = mass_info;
let co_material = ColliderMaterial {
@@ -675,10 +716,10 @@ impl ColliderBuilder {
restitution: self.restitution,
friction_combine_rule: self.friction_combine_rule,
restitution_combine_rule: self.restitution_combine_rule,
- solver_flags,
+ active_hooks: self.active_hooks,
};
let co_changes = ColliderChanges::all();
- let co_pos = ColliderPosition(self.pos_wrt_parent);
+ let co_pos = ColliderPosition(self.position);
let co_bf_data = ColliderBroadPhaseData::default();
let co_groups = ColliderGroups {
collision_groups: self.collision_groups,