bh_node *node = &bh->nodes[ inode ];
box_init_inf( node->bbx );
- for( u32 i=0; i<node->count; i++ )
- {
+ for( u32 i=0; i<node->count; i++ ){
u32 idx = node->start+i;
bh->system->expand_bound( bh->user, node->bbx, idx );
}
i32 i = node->start,
j = i + node->count-1;
- while( i <= j )
- {
+ while( i <= j ){
if( bh->system->item_centroid( bh->user, i, axis ) < split )
i ++;
- else
- {
+ else{
bh->system->item_swap( bh->user, i, j );
j --;
}
if( item_count > 2 )
bh_subdivide( bh, 0 );
- totsize = sizeof(bh_tree) + sizeof(bh_node) * bh->node_count;
+ totsize = vg_align8(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, (alloc_count*2-1) );
{
vg_line_boxf( node->bbx, 0xff00ff00 );
- if( bh->system->item_debug )
- {
- for( u32 i=0; i<node->count; i++ )
- {
+ if( bh->system->item_debug ){
+ for( u32 i=0; i<node->count; i++ ){
u32 idx = node->start+i;
bh->system->item_debug( bh->user, idx );
}
if( (pos[0] >= node->bbx[0][0] && pos[0] <= node->bbx[1][0]) &&
(pos[2] >= node->bbx[0][2] && pos[2] <= node->bbx[1][2]) )
{
- if( !node->count )
- {
+ if( !node->count ){
vg_line_boxf( node->bbx, colour );
bh_debug_trace( bh, node->il, pos, colour );
bh_debug_trace( bh, node->ir, pos, colour );
}
- else
- {
+ else{
if( bh->system->item_debug )
bh_debug_leaf( bh, node );
}
dir_inv[1] = 1.0f/dir[1];
dir_inv[2] = 1.0f/dir[2];
- while(depth)
- {
+ while(depth){
bh_node *inode = &bh->nodes[ stack[depth] ];
- if( ray_aabb1( inode->bbx, co, dir_inv, hit->dist ) )
- {
- if( inode->count )
- {
- for( u32 i=0; i<inode->count; i++ )
- {
+ if( ray_aabb1( inode->bbx, co, dir_inv, hit->dist ) ){
+ if( inode->count ){
+ for( u32 i=0; i<inode->count; i++ ){
u32 idx = inode->start+i;
if( bh->system->cast_ray )
depth --;
}
- else
- {
- if( depth+1 >= vg_list_size(stack) )
- {
+ else{
+ if( depth+1 >= vg_list_size(stack) ){
vg_error( "Maximum stack reached!\n" );
return count;
}
depth ++;
}
}
- else
- {
+ else{
depth --;
}
}
VG_STATIC int bh_next( bh_tree *bh, bh_iter *it, boxf box, int *em )
{
- while( it->depth >= 0 )
- {
+ while( it->depth >= 0 ){
bh_node *inode = &bh->nodes[ it->stack[it->depth].id ];
/* Only process overlapping nodes */
- if( !box_overlap( inode->bbx, box ) )
- {
+ if( !box_overlap( inode->bbx, box ) ){
it->depth --;
continue;
}
- if( inode->count )
- {
- if( it->i < inode->count )
- {
+ if( inode->count ){
+ if( it->i < inode->count ){
*em = inode->start+it->i;
it->i ++;
return 1;
}
- else
- {
+ else{
it->depth --;
it->i = 0;
}
}
- else
- {
- if( it->depth+1 >= vg_list_size(it->stack) )
- {
+ else{
+ if( it->depth+1 >= vg_list_size(it->stack) ){
vg_error( "Maximum stack reached!\n" );
return 0;
}
queue[0] = 0;
- while( depth >= 0 )
- {
+ while( depth >= 0 ){
bh_node *inode = &bh->nodes[ queue[depth] ];
v3f p1;
/* branch into node if its closer than current best */
float node_dist = v3_dist2( pos, p1 );
- if( node_dist < max_dist )
- {
- if( inode->count )
- {
- for( int i=0; i<inode->count; i++ )
- {
+ if( node_dist < max_dist ){
+ if( inode->count ){
+ for( int i=0; i<inode->count; i++ ){
v3f p2;
bh->system->item_closest( bh->user, inode->start+i, pos, p2 );
float item_dist = v3_dist2( pos, p2 );
- if( item_dist < max_dist )
- {
+ if( item_dist < max_dist ){
max_dist = item_dist;
v3_copy( p2, closest );
best_item = inode->start+i;
depth --;
}
- else
- {
+ else{
queue[depth] = inode->il;
queue[depth+1] = inode->ir;