diff --git a/CHANGELOG.md b/CHANGELOG.md index 74219da5..835117b8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## v0.13.7 +### Unreleased + +- Added new visitor logic to QBVH to allow parent nodes to pass a context to their children. + ### Modified - The `point_in_poly2d` now handles arbitrary (convex and non-convex) polygons. The previous implementation diff --git a/src/partitioning/qbvh/traversal.rs b/src/partitioning/qbvh/traversal.rs index 62b02ca2..49d12010 100644 --- a/src/partitioning/qbvh/traversal.rs +++ b/src/partitioning/qbvh/traversal.rs @@ -2,7 +2,7 @@ use crate::bounding_volume::{Aabb, SimdAabb}; use crate::math::Real; -use crate::partitioning::visitor::{SimdSimultaneousVisitStatus, SimdVisitorContext}; +use crate::partitioning::visitor::{SimdSimultaneousVisitStatus, SimdVisitorWithContext}; use crate::partitioning::{ GenericQbvh, QbvhStorage, SimdBestFirstVisitStatus, SimdBestFirstVisitor, SimdSimultaneousVisitor, SimdVisitStatus, SimdVisitor, @@ -115,12 +115,12 @@ impl> GenericQbvh( + pub fn traverse_depth_first_with_context( &self, - visitor: &mut impl SimdVisitorContext, + visitor: &mut impl SimdVisitorWithContext, context: Context, ) -> bool { - self.traverse_depth_first_node_with_stack_context(visitor, &mut Vec::new(), 0, context) + self.traverse_depth_first_node_with_stack_and_context(visitor, &mut Vec::new(), 0, context) } /// Performs a depth-first traversal on the BVH and propagates a context down, @@ -130,9 +130,9 @@ impl> GenericQbvh( + pub fn traverse_depth_first_node_with_stack_and_context( &self, - visitor: &mut impl SimdVisitorContext, + visitor: &mut impl SimdVisitorWithContext, stack: &mut Vec<(u32, Context)>, start_node: u32, context: Context, @@ -152,7 +152,7 @@ impl> GenericQbvh { return false; @@ -166,7 +166,7 @@ impl> GenericQbvh { +pub trait SimdVisitorWithContext { /// Execute an operation on the content of a node of the spatial partitioning structure. /// /// Returns whether the traversal should continue on the node's children, if it should not continue @@ -91,26 +91,24 @@ pub trait SimdVisitorContext { bv: &SimdBV, data: Option<[Option<&LeafData>; SIMD_WIDTH]>, context: Context, - ) -> (SimdVisitStatus, Context); + ) -> (SimdVisitStatus, [Context; SIMD_WIDTH]); } -impl SimdVisitorContext for F +impl SimdVisitorWithContext for T where - F: FnMut( - &SimdBV, - Option<[Option<&LeafData>; SIMD_WIDTH]>, - Context, - ) -> (SimdVisitStatus, Context), + T: SimdVisitor, { fn visit( &mut self, bv: &SimdBV, data: Option<[Option<&LeafData>; SIMD_WIDTH]>, context: Context, - ) -> (SimdVisitStatus, Context) { - (self)(bv, data, context) + ) -> (SimdVisitStatus, [Context; SIMD_WIDTH]) { + let contexts = std::array::from_fn(|_| context.clone()); + (self.visit(bv, data), contexts) } } + /// Trait implemented by visitor called during a simultaneous spatial partitioning data structure tarversal. pub trait SimdSimultaneousVisitor { /// Execute an operation on the content of two nodes, one from each structure. diff --git a/src/utils/weighted_value.rs b/src/utils/weighted_value.rs index 2e54258e..b4619332 100644 --- a/src/utils/weighted_value.rs +++ b/src/utils/weighted_value.rs @@ -1,5 +1,5 @@ use crate::math::Real; -use std::cmp::{Eq, Ord, Ordering, PartialEq, PartialOrd}; +use std::cmp::Ordering; #[derive(Copy, Clone)] pub struct WeightedValue {