relax bvh trait bounds using enumerate
This commit is contained in:
parent
ba00fed9b8
commit
f337c71c5b
24
src/bvh.rs
24
src/bvh.rs
@ -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{
|
||||||
|
Loading…
Reference in New Issue
Block a user