relax bvh trait bounds using enumerate

This commit is contained in:
Quaternions 2024-07-25 13:51:29 -07:00
parent ba00fed9b8
commit f337c71c5b

View File

@ -25,10 +25,10 @@ pub struct BvhNode<T>{
aabb:Aabb, aabb:Aabb,
} }
impl<T:Copy+Eq+std::hash::Hash> BvhNode<T>{ impl<T> BvhNode<T>{
pub fn the_tester<F:FnMut(T)>(&self,aabb:&Aabb,f:&mut F){ pub fn the_tester<F:FnMut(&T)>(&self,aabb:&Aabb,f:&mut F){
match &self.content{ match &self.content{
&BvhNodeContent::Leaf(model)=>f(model), BvhNodeContent::Leaf(model)=>f(model),
BvhNodeContent::Branch(children)=>for child in children{ BvhNodeContent::Branch(children)=>for child in children{
//this test could be moved outside the match statement //this test could be moved outside the match statement
//but that would test the root node aabb //but that would test the root node aabb
@ -50,11 +50,11 @@ impl<T:Copy+Eq+std::hash::Hash> BvhNode<T>{
} }
} }
pub fn generate_bvh<T:Copy+Eq+std::hash::Hash>(boxen:Vec<(T,Aabb)>)->BvhNode<T>{ pub fn generate_bvh<T>(boxen:Vec<(T,Aabb)>)->BvhNode<T>{
generate_bvh_node(boxen,false) generate_bvh_node(boxen,false)
} }
fn generate_bvh_node<T:Copy+Eq+std::hash::Hash>(boxen:Vec<(T,Aabb)>,force:bool)->BvhNode<T>{ fn generate_bvh_node<T>(boxen:Vec<(T,Aabb)>,force:bool)->BvhNode<T>{
let n=boxen.len(); let n=boxen.len();
if force||n<20{ if force||n<20{
let mut aabb=Aabb::default(); let mut aabb=Aabb::default();
@ -74,12 +74,12 @@ fn generate_bvh_node<T:Copy+Eq+std::hash::Hash>(boxen:Vec<(T,Aabb)>,force:bool)-
let mut sort_x=Vec::with_capacity(n); let mut sort_x=Vec::with_capacity(n);
let mut sort_y=Vec::with_capacity(n); let mut sort_y=Vec::with_capacity(n);
let mut sort_z=Vec::with_capacity(n); let mut sort_z=Vec::with_capacity(n);
for (i,aabb) in boxen.iter(){ for (i,(_,aabb)) in boxen.iter().enumerate(){
let center=aabb.center(); let center=aabb.center();
octant.insert(*i,0); octant.insert(i,0);
sort_x.push((*i,center.x())); sort_x.push((i,center.x()));
sort_y.push((*i,center.y())); sort_y.push((i,center.y()));
sort_z.push((*i,center.z())); sort_z.push((i,center.z()));
} }
sort_x.sort_by(|tup0,tup1|tup0.1.cmp(&tup1.1)); sort_x.sort_by(|tup0,tup1|tup0.1.cmp(&tup1.1));
sort_y.sort_by(|tup0,tup1|tup0.1.cmp(&tup1.1)); sort_y.sort_by(|tup0,tup1|tup0.1.cmp(&tup1.1));
@ -106,7 +106,7 @@ fn generate_bvh_node<T:Copy+Eq+std::hash::Hash>(boxen:Vec<(T,Aabb)>,force:bool)-
//generate lists for unique octant values //generate lists for unique octant values
let mut list_list=Vec::with_capacity(8); let mut list_list=Vec::with_capacity(8);
let mut octant_list=Vec::with_capacity(8); let mut octant_list=Vec::with_capacity(8);
for (i,aabb) in boxen.into_iter(){ for (i,(data,aabb)) in boxen.into_iter().enumerate(){
let octant_id=octant[&i]; let octant_id=octant[&i];
let list_id=if let Some(list_id)=octant_list.iter().position(|&id|id==octant_id){ let list_id=if let Some(list_id)=octant_list.iter().position(|&id|id==octant_id){
list_id list_id
@ -116,7 +116,7 @@ fn generate_bvh_node<T:Copy+Eq+std::hash::Hash>(boxen:Vec<(T,Aabb)>,force:bool)-
list_list.push(Vec::new()); list_list.push(Vec::new());
list_id list_id
}; };
list_list[list_id].push((i,aabb)); list_list[list_id].push((data,aabb));
} }
let mut aabb=Aabb::default(); let mut aabb=Aabb::default();
if list_list.len()==1{ if list_list.len()==1{