dont remember
[carveJwlIkooP6JGAAIwe30JlM.git] / bvh.h
diff --git a/bvh.h b/bvh.h
index 8b6b0784785973f1adf89ddbbb01636d656f1d64..23f8a564d54cd7ce1b7830457da97ce15ad790d7 100644 (file)
--- 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; t<node->count; 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;
 }