use std::marker::PhantomData; use bounding_volume::BoundingVolume; /// Visitor of Bounding Volume Trees. pub trait BVTVisitor { /// Visits an internal node. Returns `true` if the internal node children have to be visited /// too. fn visit_internal(&mut self, &BV) -> bool; /// Visits a leaf. fn visit_leaf(&mut self, &B, &BV); } /// Bounding Volume Tree visitor collecting interferences with a given bounding volume. pub struct BoundingVolumeInterferencesCollector<'a, N: 'a, B: 'a, BV: 'a> { bv: &'a BV, collector: &'a mut Vec, _scalar: PhantomData } impl<'a, N, B, BV> BoundingVolumeInterferencesCollector<'a, N, B, BV> where BV: BoundingVolume { /// Creates a new `BoundingVolumeInterferencesCollector`. #[inline] pub fn new(bv: &'a BV, buffer: &'a mut Vec) -> BoundingVolumeInterferencesCollector<'a, N, B, BV> { BoundingVolumeInterferencesCollector { bv: bv, collector: buffer, _scalar: PhantomData } } } impl<'a, N, B, BV> BVTVisitor for BoundingVolumeInterferencesCollector<'a, N, B, BV> where B: Clone, BV: BoundingVolume { #[inline] fn visit_internal(&mut self, bv: &BV) -> bool { bv.intersects(self.bv) } #[inline] fn visit_leaf(&mut self, b: &B, bv: &BV) { if (self.bv as *const BV) != (bv as *const BV) && bv.intersects(self.bv) { self.collector.push(b.clone()) } } }