diff --git a/src/dynamics/coefficient_combine_rule.rs b/src/dynamics/coefficient_combine_rule.rs index 9f99b7daf..565223d35 100644 --- a/src/dynamics/coefficient_combine_rule.rs +++ b/src/dynamics/coefficient_combine_rule.rs @@ -17,6 +17,8 @@ pub enum CoefficientCombineRule { Min, /// The two coefficients are multiplied. Multiply, + /// The sum of the two coefficients. + Sum, /// The greatest coefficient is chosen. Max, } @@ -27,8 +29,9 @@ impl CoefficientCombineRule { match effective_rule { 0 => (coeff1 + coeff2) / 2.0, - 1 => coeff1.min(coeff2), + 1 => coeff1.min(coeff2).abs(), 2 => coeff1 * coeff2, + 3 => (coeff1 + coeff2).clamp(0.0, 1.0), _ => coeff1.max(coeff2), } } diff --git a/src/geometry/collider.rs b/src/geometry/collider.rs index 1ceab439e..10d19a6a2 100644 --- a/src/geometry/collider.rs +++ b/src/geometry/collider.rs @@ -686,7 +686,7 @@ impl ColliderBuilder { /// Initializes a collider builder with a triangle mesh shape defined by its vertex and index buffers. pub fn trimesh(vertices: Vec>, indices: Vec<[u32; 3]>) -> Self { - Self::new(SharedShape::trimesh(vertices, indices)) + Self::new(SharedShape::trimesh(vertices, indices).unwrap()) } /// Initializes a collider builder with a triangle mesh shape defined by its vertex and index buffers and @@ -696,7 +696,7 @@ impl ColliderBuilder { indices: Vec<[u32; 3]>, flags: TriMeshFlags, ) -> Self { - Self::new(SharedShape::trimesh_with_flags(vertices, indices, flags)) + Self::new(SharedShape::trimesh_with_flags(vertices, indices, flags).unwrap()) } /// Initializes a collider builder with a shape converted from the given triangle mesh index diff --git a/src/geometry/interaction_groups.rs b/src/geometry/interaction_groups.rs index d8941f752..672366897 100644 --- a/src/geometry/interaction_groups.rs +++ b/src/geometry/interaction_groups.rs @@ -13,7 +13,7 @@ /// /// In other words, interactions are allowed between two filter iff. the following condition is met: /// ```ignore -/// (self.memberships & rhs.filter) != 0 && (rhs.memberships & self.filter) != 0 +/// (self.memberships & rhs.filter) != 0 || (rhs.memberships & self.filter) != 0 /// ``` #[cfg_attr(feature = "serde-serialize", derive(Serialize, Deserialize))] #[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)] @@ -65,7 +65,7 @@ impl InteractionGroups { // NOTE: since const ops is not stable, we have to convert `Group` into u32 // to use & operator in const context. (self.memberships.bits() & rhs.filter.bits()) != 0 - && (rhs.memberships.bits() & self.filter.bits()) != 0 + || (rhs.memberships.bits() & self.filter.bits()) != 0 } } diff --git a/src/geometry/mesh_converter.rs b/src/geometry/mesh_converter.rs index a4c886149..e5d5b833a 100644 --- a/src/geometry/mesh_converter.rs +++ b/src/geometry/mesh_converter.rs @@ -60,9 +60,9 @@ impl MeshConverter { ) -> Result<(SharedShape, Isometry), MeshConverterError> { let mut transform = Isometry::identity(); let shape = match self { - MeshConverter::TriMesh => SharedShape::trimesh(vertices, indices), + MeshConverter::TriMesh => SharedShape::trimesh(vertices, indices).unwrap(), MeshConverter::TriMeshWithFlags(flags) => { - SharedShape::trimesh_with_flags(vertices, indices, *flags) + SharedShape::trimesh_with_flags(vertices, indices, *flags).unwrap() } MeshConverter::Obb => { let (pose, cuboid) = parry::utils::obb(&vertices); diff --git a/src/pipeline/physics_pipeline.rs b/src/pipeline/physics_pipeline.rs index 8505618f0..ebc177bd0 100644 --- a/src/pipeline/physics_pipeline.rs +++ b/src/pipeline/physics_pipeline.rs @@ -499,7 +499,7 @@ impl PhysicsPipeline { if let Some(queries) = query_pipeline.as_deref_mut() { self.counters.stages.query_pipeline_time.start(); - queries.update_incremental(colliders, &modified_colliders, &removed_colliders, false); + queries.update_incremental(colliders, &modified_colliders, &removed_colliders, true); self.counters.stages.query_pipeline_time.pause(); }