diff options
| author | Crozet Sébastien <developer@crozet.re> | 2020-10-20 11:55:33 +0200 |
|---|---|---|
| committer | Crozet Sébastien <developer@crozet.re> | 2020-10-20 11:56:09 +0200 |
| commit | 865ce8a8e5301b23ca474adaaffe8b43e725803e (patch) | |
| tree | 67b57d0c63d11a6d5e4a23c6f1242f72efc721b9 /src/geometry/proximity_detector | |
| parent | 947c4813c9666fd8215743de298fe17780fa3ef2 (diff) | |
| download | rapier-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')
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, |
