From a3340143dbe361015408463b748c7f5c63f12dd3 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 30 Oct 2023 18:48:51 -0700 Subject: [PATCH] use enum for bvh node content + wrap every model in aabb --- src/bvh.rs | 40 ++++++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/src/bvh.rs b/src/bvh.rs index 1f26a81..6166c35 100644 --- a/src/bvh.rs +++ b/src/bvh.rs @@ -9,22 +9,30 @@ use crate::aabb::Aabb; //start with bisection into octrees because a bad bvh is still 1000x better than no bvh //sort the centerpoints on each axis (3 lists) //bv is put into octant based on whether it is upper or lower in each list +enum BvhNodeContent{ + Branch(Vec), + Leaf(usize), +} +impl Default for BvhNodeContent{ + fn default()->Self{ + Self::Branch(Vec::new()) + } +} #[derive(Default)] pub struct BvhNode{ - children:Vec, - models:Vec, + content:BvhNodeContent, aabb:Aabb, } impl BvhNode{ pub fn the_tester(&self,aabb:&Aabb,f:&mut F){ - for &model in &self.models{ - f(model); - } - for child in &self.children{ - if aabb.intersects(&child.aabb){ - child.the_tester(aabb,f); - } + match &self.content{ + &BvhNodeContent::Leaf(model)=>f(model), + BvhNodeContent::Branch(children)=>for child in children{ + if aabb.intersects(&child.aabb){ + child.the_tester(aabb,f); + } + }, } } } @@ -37,10 +45,15 @@ fn generate_bvh_node(boxen:Vec<(usize,Aabb)>)->BvhNode{ let n=boxen.len(); if n<20{ let mut aabb=Aabb::default(); - let models=boxen.into_iter().map(|b|{aabb.join(&b.1);b.0}).collect(); + let nodes=boxen.into_iter().map(|b|{ + aabb.join(&b.1); + BvhNode{ + content:BvhNodeContent::Leaf(b.0), + aabb:b.1, + } + }).collect(); BvhNode{ - children:Vec::new(), - models, + content:BvhNodeContent::Branch(nodes), aabb, } }else{ @@ -99,8 +112,7 @@ fn generate_bvh_node(boxen:Vec<(usize,Aabb)>)->BvhNode{ node }).collect(); BvhNode{ - children, - models:Vec::new(), + content:BvhNodeContent::Branch(children), aabb, } }