aboutsummaryrefslogtreecommitdiff
path: root/src/geometry/proximity_detector
diff options
context:
space:
mode:
authorCrozet Sébastien <developer@crozet.re>2020-10-20 11:55:33 +0200
committerCrozet Sébastien <developer@crozet.re>2020-10-20 11:56:09 +0200
commit865ce8a8e5301b23ca474adaaffe8b43e725803e (patch)
tree67b57d0c63d11a6d5e4a23c6f1242f72efc721b9 /src/geometry/proximity_detector
parent947c4813c9666fd8215743de298fe17780fa3ef2 (diff)
downloadrapier-865ce8a8e5301b23ca474adaaffe8b43e725803e.tar.gz
rapier-865ce8a8e5301b23ca474adaaffe8b43e725803e.tar.bz2
rapier-865ce8a8e5301b23ca474adaaffe8b43e725803e.zip
Collider shape: use a trait-object instead of an enum.
Diffstat (limited to 'src/geometry/proximity_detector')
-rw-r--r--src/geometry/proximity_detector/ball_convex_proximity_detector.rs18
-rw-r--r--src/geometry/proximity_detector/cuboid_cuboid_proximity_detector.rs2
-rw-r--r--src/geometry/proximity_detector/cuboid_triangle_proximity_detector.rs6
-rw-r--r--src/geometry/proximity_detector/polygon_polygon_proximity_detector.rs23
-rw-r--r--src/geometry/proximity_detector/proximity_dispatcher.rs40
-rw-r--r--src/geometry/proximity_detector/trimesh_shape_proximity_detector.rs11
6 files changed, 48 insertions, 52 deletions
diff --git a/src/geometry/proximity_detector/ball_convex_proximity_detector.rs b/src/geometry/proximity_detector/ball_convex_proximity_detector.rs
index b00337d..d7c5d02 100644
--- a/src/geometry/proximity_detector/ball_convex_proximity_detector.rs
+++ b/src/geometry/proximity_detector/ball_convex_proximity_detector.rs
@@ -4,24 +4,16 @@ use crate::math::Isometry;
use ncollide::query::PointQuery;
pub fn detect_proximity_ball_convex(ctxt: &mut PrimitiveProximityDetectionContext) -> Proximity {
- if let Shape::Ball(ball1) = ctxt.shape1 {
- match ctxt.shape2 {
- Shape::Triangle(tri2) => do_detect_proximity(tri2, ball1, &ctxt),
- Shape::Cuboid(cube2) => do_detect_proximity(cube2, ball1, &ctxt),
- _ => unimplemented!(),
- }
- } else if let Shape::Ball(ball2) = ctxt.shape2 {
- match ctxt.shape1 {
- Shape::Triangle(tri1) => do_detect_proximity(tri1, ball2, &ctxt),
- Shape::Cuboid(cube1) => do_detect_proximity(cube1, ball2, &ctxt),
- _ => unimplemented!(),
- }
+ if let Some(ball1) = ctxt.shape1.as_ball() {
+ do_detect_proximity(ctxt.shape2, ball1, &ctxt)
+ } else if let Some(ball2) = ctxt.shape2.as_ball() {
+ do_detect_proximity(ctxt.shape1, ball2, &ctxt)
} else {
panic!("Invalid shape types provide.")
}
}
-fn do_detect_proximity<P: PointQuery<f32>>(
+fn do_detect_proximity<P: ?Sized + PointQuery<f32>>(
point_query1: &P,
ball2: &Ball,
ctxt: &PrimitiveProximityDetectionContext,
diff --git a/src/geometry/proximity_detector/cuboid_cuboid_proximity_detector.rs b/src/geometry/proximity_detector/cuboid_cuboid_proximity_detector.rs
index b68ebf9..2462fc9 100644
--- a/src/geometry/proximity_detector/cuboid_cuboid_proximity_detector.rs
+++ b/src/geometry/proximity_detector/cuboid_cuboid_proximity_detector.rs
@@ -4,7 +4,7 @@ use crate::math::Isometry;
use ncollide::shape::Cuboid;
pub fn detect_proximity_cuboid_cuboid(ctxt: &mut PrimitiveProximityDetectionContext) -> Proximity {
- if let (Shape::Cuboid(cube1), Shape::Cuboid(cube2)) = (ctxt.shape1, ctxt.shape2) {
+ if let (Some(cube1), Some(cube2)) = (ctxt.shape1.as_cuboid(), ctxt.shape2.as_cuboid()) {
detect_proximity(
ctxt.prediction_distance,
cube1,
diff --git a/src/geometry/proximity_detector/cuboid_triangle_proximity_detector.rs b/src/geometry/proximity_detector/cuboid_triangle_proximity_detector.rs
index 12f3b4a..45991c7 100644
--- a/src/geometry/proximity_detector/cuboid_triangle_proximity_detector.rs
+++ b/src/geometry/proximity_detector/cuboid_triangle_proximity_detector.rs
@@ -5,7 +5,7 @@ use crate::math::Isometry;
pub fn detect_proximity_cuboid_triangle(
ctxt: &mut PrimitiveProximityDetectionContext,
) -> Proximity {
- if let (Shape::Cuboid(cube1), Shape::Triangle(triangle2)) = (ctxt.shape1, ctxt.shape2) {
+ if let (Some(cube1), Some(triangle2)) = (ctxt.shape1.as_cuboid(), ctxt.shape2.as_triangle()) {
detect_proximity(
ctxt.prediction_distance,
cube1,
@@ -13,7 +13,9 @@ pub fn detect_proximity_cuboid_triangle(
triangle2,
ctxt.position2,
)
- } else if let (Shape::Triangle(triangle1), Shape::Cuboid(cube2)) = (ctxt.shape1, ctxt.shape2) {
+ } else if let (Some(triangle1), Some(cube2)) =
+ (ctxt.shape1.as_triangle(), ctxt.shape2.as_cuboid())
+ {
detect_proximity(
ctxt.prediction_distance,
cube2,
diff --git a/src/geometry/proximity_detector/polygon_polygon_proximity_detector.rs b/src/geometry/proximity_detector/polygon_polygon_proximity_detector.rs
index f0e049f..5b89dc5 100644
--- a/src/geometry/proximity_detector/polygon_polygon_proximity_detector.rs
+++ b/src/geometry/proximity_detector/polygon_polygon_proximity_detector.rs
@@ -5,17 +5,18 @@ use crate::math::Isometry;
pub fn detect_proximity_polygon_polygon(
ctxt: &mut PrimitiveProximityDetectionContext,
) -> Proximity {
- if let (Shape::Polygon(polygon1), Shape::Polygon(polygon2)) = (ctxt.shape1, ctxt.shape2) {
- detect_proximity(
- ctxt.prediction_distance,
- polygon1,
- &ctxt.position1,
- polygon2,
- &ctxt.position2,
- )
- } else {
- unreachable!()
- }
+ unimplemented!()
+ // if let (Some(polygon1), Some(polygon2)) = (ctxt.shape1.as_polygon(), ctxt.shape2.as_polygon()) {
+ // detect_proximity(
+ // ctxt.prediction_distance,
+ // polygon1,
+ // &ctxt.position1,
+ // polygon2,
+ // &ctxt.position2,
+ // )
+ // } else {
+ // unreachable!()
+ // }
}
fn detect_proximity<'a>(
diff --git a/src/geometry/proximity_detector/proximity_dispatcher.rs b/src/geometry/proximity_detector/proximity_dispatcher.rs
index 6d6b4c5..62f50f7 100644
--- a/src/geometry/proximity_detector/proximity_dispatcher.rs
+++ b/src/geometry/proximity_detector/proximity_dispatcher.rs
@@ -2,7 +2,7 @@ use crate::geometry::proximity_detector::{
PrimitiveProximityDetector, ProximityDetector, ProximityPhase,
TrimeshShapeProximityDetectorWorkspace,
};
-use crate::geometry::Shape;
+use crate::geometry::{Shape, ShapeType};
use std::any::Any;
/// Trait implemented by structures responsible for selecting a collision-detection algorithm
@@ -11,8 +11,8 @@ pub trait ProximityDispatcher {
/// Select the proximity detection algorithm for the given pair of primitive shapes.
fn dispatch_primitives(
&self,
- shape1: &Shape,
- shape2: &Shape,
+ shape1: ShapeType,
+ shape2: ShapeType,
) -> (
PrimitiveProximityDetector,
Option<Box<dyn Any + Send + Sync>>,
@@ -20,8 +20,8 @@ pub trait ProximityDispatcher {
/// Select the proximity detection algorithm for the given pair of non-primitive shapes.
fn dispatch(
&self,
- shape1: &Shape,
- shape2: &Shape,
+ shape1: ShapeType,
+ shape2: ShapeType,
) -> (ProximityPhase, Option<Box<dyn Any + Send + Sync>>);
}
@@ -31,14 +31,14 @@ pub struct DefaultProximityDispatcher;
impl ProximityDispatcher for DefaultProximityDispatcher {
fn dispatch_primitives(
&self,
- shape1: &Shape,
- shape2: &Shape,
+ shape1: ShapeType,
+ shape2: ShapeType,
) -> (
PrimitiveProximityDetector,
Option<Box<dyn Any + Send + Sync>>,
) {
match (shape1, shape2) {
- (Shape::Ball(_), Shape::Ball(_)) => (
+ (ShapeType::Ball, ShapeType::Ball) => (
PrimitiveProximityDetector {
#[cfg(feature = "simd-is-enabled")]
detect_proximity_simd: super::detect_proximity_ball_ball_simd,
@@ -47,56 +47,56 @@ impl ProximityDispatcher for DefaultProximityDispatcher {
},
None,
),
- (Shape::Cuboid(_), Shape::Cuboid(_)) => (
+ (ShapeType::Cuboid, ShapeType::Cuboid) => (
PrimitiveProximityDetector {
detect_proximity: super::detect_proximity_cuboid_cuboid,
..PrimitiveProximityDetector::default()
},
None,
),
- (Shape::Polygon(_), Shape::Polygon(_)) => (
+ (ShapeType::Polygon, ShapeType::Polygon) => (
PrimitiveProximityDetector {
detect_proximity: super::detect_proximity_polygon_polygon,
..PrimitiveProximityDetector::default()
},
None,
),
- (Shape::Triangle(_), Shape::Ball(_)) => (
+ (ShapeType::Triangle, ShapeType::Ball) => (
PrimitiveProximityDetector {
detect_proximity: super::detect_proximity_ball_convex,
..PrimitiveProximityDetector::default()
},
None,
),
- (Shape::Ball(_), Shape::Triangle(_)) => (
+ (ShapeType::Ball, ShapeType::Triangle) => (
PrimitiveProximityDetector {
detect_proximity: super::detect_proximity_ball_convex,
..PrimitiveProximityDetector::default()
},
None,
),
- (Shape::Cuboid(_), Shape::Ball(_)) => (
+ (ShapeType::Cuboid, ShapeType::Ball) => (
PrimitiveProximityDetector {
detect_proximity: super::detect_proximity_ball_convex,
..PrimitiveProximityDetector::default()
},
None,
),
- (Shape::Ball(_), Shape::Cuboid(_)) => (
+ (ShapeType::Ball, ShapeType::Cuboid) => (
PrimitiveProximityDetector {
detect_proximity: super::detect_proximity_ball_convex,
..PrimitiveProximityDetector::default()
},
None,
),
- (Shape::Triangle(_), Shape::Cuboid(_)) => (
+ (ShapeType::Triangle, ShapeType::Cuboid) => (
PrimitiveProximityDetector {
detect_proximity: super::detect_proximity_cuboid_triangle,
..PrimitiveProximityDetector::default()
},
None,
),
- (Shape::Cuboid(_), Shape::Triangle(_)) => (
+ (ShapeType::Cuboid, ShapeType::Triangle) => (
PrimitiveProximityDetector {
detect_proximity: super::detect_proximity_cuboid_triangle,
..PrimitiveProximityDetector::default()
@@ -109,18 +109,18 @@ impl ProximityDispatcher for DefaultProximityDispatcher {
fn dispatch(
&self,
- shape1: &Shape,
- shape2: &Shape,
+ shape1: ShapeType,
+ shape2: ShapeType,
) -> (ProximityPhase, Option<Box<dyn Any + Send + Sync>>) {
match (shape1, shape2) {
- (Shape::Trimesh(_), _) => (
+ (ShapeType::Trimesh, _) => (
ProximityPhase::NearPhase(ProximityDetector {
detect_proximity: super::detect_proximity_trimesh_shape,
..ProximityDetector::default()
}),
Some(Box::new(TrimeshShapeProximityDetectorWorkspace::new())),
),
- (_, Shape::Trimesh(_)) => (
+ (_, ShapeType::Trimesh) => (
ProximityPhase::NearPhase(ProximityDetector {
detect_proximity: super::detect_proximity_trimesh_shape,
..ProximityDetector::default()
diff --git a/src/geometry/proximity_detector/trimesh_shape_proximity_detector.rs b/src/geometry/proximity_detector/trimesh_shape_proximity_detector.rs
index edf3085..cce46d2 100644
--- a/src/geometry/proximity_detector/trimesh_shape_proximity_detector.rs
+++ b/src/geometry/proximity_detector/trimesh_shape_proximity_detector.rs
@@ -1,7 +1,7 @@
use crate::geometry::proximity_detector::{
PrimitiveProximityDetectionContext, ProximityDetectionContext,
};
-use crate::geometry::{Collider, Proximity, Shape, Trimesh};
+use crate::geometry::{Collider, Proximity, Shape, ShapeType, Trimesh};
use crate::ncollide::bounding_volume::{BoundingVolume, AABB};
pub struct TrimeshShapeProximityDetectorWorkspace {
@@ -24,9 +24,9 @@ pub fn detect_proximity_trimesh_shape(ctxt: &mut ProximityDetectionContext) -> P
let collider1 = &ctxt.colliders[ctxt.pair.pair.collider1];
let collider2 = &ctxt.colliders[ctxt.pair.pair.collider2];
- if let Shape::Trimesh(trimesh1) = collider1.shape() {
+ if let Some(trimesh1) = collider1.shape().as_trimesh() {
do_detect_proximity(trimesh1, collider1, collider2, ctxt)
- } else if let Shape::Trimesh(trimesh2) = collider2.shape() {
+ } else if let Some(trimesh2) = collider2.shape().as_trimesh() {
do_detect_proximity(trimesh2, collider2, collider1, ctxt)
} else {
panic!("Invalid shape types provided.")
@@ -83,6 +83,7 @@ fn do_detect_proximity(
let new_interferences = &workspace.interferences;
let mut old_inter_it = workspace.old_interferences.drain(..).peekable();
let mut best_proximity = Proximity::Disjoint;
+ let shape_type2 = collider2.shape().shape_type();
for triangle_id in new_interferences.iter() {
if *triangle_id >= trimesh1.num_triangles() {
@@ -107,10 +108,10 @@ fn do_detect_proximity(
};
}
- let triangle1 = Shape::Triangle(trimesh1.triangle(*triangle_id));
+ let triangle1 = trimesh1.triangle(*triangle_id);
let (proximity_detector, mut workspace2) = ctxt
.dispatcher
- .dispatch_primitives(&triangle1, collider2.shape());
+ .dispatch_primitives(ShapeType::Triangle, shape_type2);
let mut ctxt2 = PrimitiveProximityDetectionContext {
prediction_distance: ctxt.prediction_distance,