diff options
| author | Robert Hrusecky <robert.hrusecky@utexas.edu> | 2020-10-29 18:09:41 -0500 |
|---|---|---|
| committer | Robert Hrusecky <robert.hrusecky@utexas.edu> | 2020-10-29 18:09:41 -0500 |
| commit | bcec54ef31d987cf20b493628a20777183a95f65 (patch) | |
| tree | cee40c0467c04f1f02861342e20ce8223ca6d99b /src/pipeline/query_pipeline.rs | |
| parent | dd8e25bc4756b8bd01d283b5d7e7c5daa9a1af3f (diff) | |
| parent | 4b8242b9c267a9412c88793575db37f79c544ca2 (diff) | |
| download | rapier-bcec54ef31d987cf20b493628a20777183a95f65.tar.gz rapier-bcec54ef31d987cf20b493628a20777183a95f65.tar.bz2 rapier-bcec54ef31d987cf20b493628a20777183a95f65.zip | |
Merge branch 'master' into infinite_fall_memory
Fix merge conflict resulting from "axii" spelling correction
Diffstat (limited to 'src/pipeline/query_pipeline.rs')
| -rw-r--r-- | src/pipeline/query_pipeline.rs | 35 |
1 files changed, 27 insertions, 8 deletions
diff --git a/src/pipeline/query_pipeline.rs b/src/pipeline/query_pipeline.rs index 32f59fc..00d4396 100644 --- a/src/pipeline/query_pipeline.rs +++ b/src/pipeline/query_pipeline.rs @@ -1,5 +1,7 @@ use crate::dynamics::RigidBodySet; -use crate::geometry::{Collider, ColliderHandle, ColliderSet, Ray, RayIntersection, WQuadtree}; +use crate::geometry::{ + Collider, ColliderHandle, ColliderSet, InteractionGroups, Ray, RayIntersection, WQuadtree, +}; /// A pipeline for performing queries on all the colliders of a scene. #[cfg_attr(feature = "serde-serialize", derive(Serialize, Deserialize))] @@ -59,6 +61,7 @@ impl QueryPipeline { colliders: &'a ColliderSet, ray: &Ray, max_toi: f32, + groups: InteractionGroups, ) -> Option<(ColliderHandle, &'a Collider, RayIntersection)> { // TODO: avoid allocation? let mut inter = Vec::new(); @@ -69,10 +72,17 @@ impl QueryPipeline { for handle in inter { let collider = &colliders[handle]; - if let Some(inter) = collider.shape().cast_ray(collider.position(), ray, max_toi) { - if inter.toi < best { - best = inter.toi; - result = Some((handle, collider, inter)); + if collider.collision_groups.test(groups) { + if let Some(inter) = collider.shape().toi_and_normal_with_ray( + collider.position(), + ray, + max_toi, + true, + ) { + if inter.toi < best { + best = inter.toi; + result = Some((handle, collider, inter)); + } } } } @@ -95,6 +105,7 @@ impl QueryPipeline { colliders: &'a ColliderSet, ray: &Ray, max_toi: f32, + groups: InteractionGroups, mut callback: impl FnMut(ColliderHandle, &'a Collider, RayIntersection) -> bool, ) { // TODO: avoid allocation? @@ -103,9 +114,17 @@ impl QueryPipeline { for handle in inter { let collider = &colliders[handle]; - if let Some(inter) = collider.shape().cast_ray(collider.position(), ray, max_toi) { - if !callback(handle, collider, inter) { - return; + + if collider.collision_groups.test(groups) { + if let Some(inter) = collider.shape().toi_and_normal_with_ray( + collider.position(), + ray, + max_toi, + true, + ) { + if !callback(handle, collider, inter) { + return; + } } } } |
