feat: add Collider::heightfield_with_flags

This commit is contained in:
Sébastien Crozet
2024-04-07 22:17:35 +02:00
committed by Sébastien Crozet
parent 9964007269
commit 7cbbb8e87b
3 changed files with 25 additions and 5 deletions

View File

@@ -12,6 +12,9 @@ use na::Unit;
use parry::bounding_volume::Aabb; use parry::bounding_volume::Aabb;
use parry::shape::{Shape, TriMeshFlags}; use parry::shape::{Shape, TriMeshFlags};
#[cfg(feature = "dim3")]
use crate::geometry::HeightFieldFlags;
#[cfg_attr(feature = "serde-serialize", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde-serialize", derive(Serialize, Deserialize))]
#[derive(Clone)] #[derive(Clone)]
/// A geometric entity that can be attached to a body so it can be affected by contacts and proximity queries. /// A geometric entity that can be attached to a body so it can be affected by contacts and proximity queries.
@@ -760,6 +763,17 @@ impl ColliderBuilder {
Self::new(SharedShape::heightfield(heights, scale)) Self::new(SharedShape::heightfield(heights, scale))
} }
/// Initializes a collider builder with a heightfield shape defined by its set of height and a scale
/// factor along each coordinate axis.
#[cfg(feature = "dim3")]
pub fn heightfield_with_flags(
heights: na::DMatrix<Real>,
scale: Vector<Real>,
flags: HeightFieldFlags,
) -> Self {
Self::new(SharedShape::heightfield_with_flags(heights, scale, flags))
}
/// The default friction coefficient used by the collider builder. /// The default friction coefficient used by the collider builder.
pub fn default_friction() -> Real { pub fn default_friction() -> Real {
0.5 0.5

View File

@@ -80,6 +80,7 @@ impl CollisionPipeline {
narrow_phase.register_pairs(None, colliders, bodies, &self.broad_phase_events, events); narrow_phase.register_pairs(None, colliders, bodies, &self.broad_phase_events, events);
narrow_phase.compute_contacts( narrow_phase.compute_contacts(
prediction_distance, prediction_distance,
0.0,
bodies, bodies,
colliders, colliders,
&ImpulseJointSet::new(), &ImpulseJointSet::new(),

View File

@@ -6,8 +6,8 @@ use crate::math::{Isometry, Point, Real, Vector};
use crate::{dynamics::RigidBodySet, geometry::ColliderSet}; use crate::{dynamics::RigidBodySet, geometry::ColliderSet};
use parry::partitioning::{QbvhDataGenerator, QbvhUpdateWorkspace}; use parry::partitioning::{QbvhDataGenerator, QbvhUpdateWorkspace};
use parry::query::details::{ use parry::query::details::{
NonlinearTOICompositeShapeShapeBestFirstVisitor, PointCompositeShapeProjBestFirstVisitor, NonlinearTOICompositeShapeShapeBestFirstVisitor, NormalConstraints,
PointCompositeShapeProjWithFeatureBestFirstVisitor, PointCompositeShapeProjBestFirstVisitor, PointCompositeShapeProjWithFeatureBestFirstVisitor,
RayCompositeShapeToiAndNormalBestFirstVisitor, RayCompositeShapeToiBestFirstVisitor, RayCompositeShapeToiAndNormalBestFirstVisitor, RayCompositeShapeToiBestFirstVisitor,
TOICompositeShapeShapeBestFirstVisitor, TOICompositeShapeShapeBestFirstVisitor,
}; };
@@ -246,17 +246,22 @@ pub enum QueryPipelineMode {
impl<'a> TypedSimdCompositeShape for QueryPipelineAsCompositeShape<'a> { impl<'a> TypedSimdCompositeShape for QueryPipelineAsCompositeShape<'a> {
type PartShape = dyn Shape; type PartShape = dyn Shape;
type PartNormalConstraints = dyn NormalConstraints;
type PartId = ColliderHandle; type PartId = ColliderHandle;
type QbvhStorage = DefaultStorage; type QbvhStorage = DefaultStorage;
fn map_typed_part_at( fn map_typed_part_at(
&self, &self,
shape_id: Self::PartId, shape_id: Self::PartId,
mut f: impl FnMut(Option<&Isometry<Real>>, &Self::PartShape), mut f: impl FnMut(
Option<&Isometry<Real>>,
&Self::PartShape,
Option<&Self::PartNormalConstraints>,
),
) { ) {
if let Some(co) = self.colliders.get(shape_id) { if let Some(co) = self.colliders.get(shape_id) {
if self.filter.test(self.bodies, shape_id, co) { if self.filter.test(self.bodies, shape_id, co) {
f(Some(&co.pos), &*co.shape) f(Some(&co.pos), &*co.shape, None)
} }
} }
} }
@@ -264,7 +269,7 @@ impl<'a> TypedSimdCompositeShape for QueryPipelineAsCompositeShape<'a> {
fn map_untyped_part_at( fn map_untyped_part_at(
&self, &self,
shape_id: Self::PartId, shape_id: Self::PartId,
f: impl FnMut(Option<&Isometry<Real>>, &Self::PartShape), f: impl FnMut(Option<&Isometry<Real>>, &Self::PartShape, Option<&dyn NormalConstraints>),
) { ) {
self.map_typed_part_at(shape_id, f); self.map_typed_part_at(shape_id, f);
} }