feat: add Collider::heightfield_with_flags
This commit is contained in:
committed by
Sébastien Crozet
parent
9964007269
commit
7cbbb8e87b
@@ -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
|
||||||
|
|||||||
@@ -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(),
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user