X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=bvh.h;h=23f8a564d54cd7ce1b7830457da97ce15ad790d7;hb=9d5997f1e611b66c7220f7eb388f427032d8da79;hp=8b6b0784785973f1adf89ddbbb01636d656f1d64;hpb=6c1541ad6a2915912e7439661820a786cb145af4;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/bvh.h b/bvh.h index 8b6b078..23f8a56 100644 --- a/bvh.h +++ b/bvh.h @@ -90,7 +90,6 @@ VG_STATIC void bh_subdivide( bh_tree *bh, u32 inode ) if( extent[2] > extent[axis] ) axis = 2; float split = node->bbx[0][axis] + extent[axis]*0.5f; - float avg = 0.0; for( u32 t=0; tcount; t++ ) { @@ -98,9 +97,9 @@ VG_STATIC void bh_subdivide( bh_tree *bh, u32 inode ) avg += bh->system->item_centroid( bh->user, idx, axis ); } avg /= (float)node->count; - split = avg; + i32 i = node->start, j = i + node->count-1; @@ -144,16 +143,9 @@ VG_STATIC bh_tree *bh_create( void *lin_alloc, bh_system *system, { assert( max_per_leaf > 0 ); - if( item_count == 0 ) - { - bh_tree *bh = vg_linear_alloc( lin_alloc, sizeof(bh_tree) ); - bh->node_count = 0; - bh->system = system; - bh->user = user; - return bh; - } + u32 alloc_count = VG_MAX( 1, item_count ); - u32 totsize = sizeof(bh_tree) + sizeof(bh_node)*(item_count*2-1); + u32 totsize = sizeof(bh_tree) + sizeof(bh_node)*(alloc_count*2-1); bh_tree *bh = vg_linear_alloc( lin_alloc, vg_align8(totsize) ); bh->system = system; bh->user = user; @@ -168,12 +160,14 @@ VG_STATIC bh_tree *bh_create( void *lin_alloc, bh_system *system, root->start = 0; bh_update_bounds( bh, 0 ); - bh_subdivide( bh, 0 ); + + if( item_count > 2 ) + bh_subdivide( bh, 0 ); totsize = sizeof(bh_tree) + sizeof(bh_node) * bh->node_count; bh = vg_linear_resize( lin_alloc, bh, totsize ); - vg_success( "BVH done, size: %u/%u\n", bh->node_count, (item_count*2-1) ); + vg_success( "BVH done, size: %u/%u\n", bh->node_count, (alloc_count*2-1) ); return bh; }