diff --git a/lib/common/src/bvh.rs b/lib/common/src/bvh.rs index e82d44f..8717817 100644 --- a/lib/common/src/bvh.rs +++ b/lib/common/src/bvh.rs @@ -59,28 +59,31 @@ impl<L> BvhNode<L>{ }, } } - fn populate_nodes<T>(&self,ray:&Ray,start_time:T,nodes:&mut BTreeMap<T,&BvhNode<L>>){ - // Am I an upcoming superstar? - if let Some(t)=self.aabb.intersect_ray(ray){ - if start_time<t{ - nodes.insert(t,self); - } - } + fn populate_nodes<T:Ord>(&self,nodes:&mut BTreeMap<T,&BvhNode<L>>,ray:&Ray,start_time:T,f:&F)->Option<(T,&L)>{ match &self.content{ - RecursiveContent::Leaf(_)=>(), + RecursiveContent::Leaf(leaf)=>Some((f(leaf),leaf)), RecursiveContent::Branch(children)=>for child in children{ - if child.aabb.contains(point){ - child.populate_nodes(point,f); + let mut collector=InstructionCollector::new(time_limit); + if child.aabb.contains(ray.origin){ + collector.collect(child.populate_nodes(nodes,ray,start_time,f)); }else{ - // check if child will + // Am I an upcoming superstar? + if let Some(t)=child.aabb.intersect_ray(ray){ + if start_time<t{ + nodes.insert(t,child); + } + } } + collector.take() }, } } - pub fn sample_ray<F:FnMut(&L)>(&self,ray:&Ray,f:&mut F){ + pub fn sample_ray<T:Ord,F:Fn(&L)->T>(&self,ray:&Ray,start_time:T,mut time_limit:Option<T>,f:&F)->Option<(T,&L)>{ let mut nodes=BTreeMap::new(); // perform a normal sample aabb at point ray.origin - self.populate_nodes(point,f); + self.populate_nodes(&mut nodes,ray,start_time); + + // swim through nodes one at a time } pub fn into_inner(self)->(RecursiveContent<BvhNode<L>,L>,Aabb){ (self.content,self.aabb)