X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=bvh.h;h=8b6b0784785973f1adf89ddbbb01636d656f1d64;hb=0de25596501d8aba67b08c92bdab417d6947cd13;hp=41a4108c908ff345a06978c39c313b06a06bc27a;hpb=a6708cef5099c83ff14816442de0954934f10276;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/bvh.h b/bvh.h index 41a4108..8b6b078 100644 --- a/bvh.h +++ b/bvh.h @@ -5,7 +5,6 @@ #ifndef BVH_H #define BVH_H #include "common.h" -#include "distq.h" /* * Usage: @@ -178,7 +177,28 @@ VG_STATIC bh_tree *bh_create( void *lin_alloc, bh_system *system, return bh; } -VG_STATIC void bh_debug_node( bh_tree *bh, u32 inode, v3f pos, u32 colour ) +/* + * Draw items in this leaf node. + * *item_debug() must be set! + */ +VG_STATIC void bh_debug_leaf( bh_tree *bh, bh_node *node ) +{ + vg_line_boxf( node->bbx, 0xff00ff00 ); + + if( bh->system->item_debug ) + { + for( u32 i=0; icount; i++ ) + { + u32 idx = node->start+i; + bh->system->item_debug( bh->user, idx ); + } + } +} + +/* + * Trace the bh tree all the way down to the leaf nodes where pos is inside + */ +VG_STATIC void bh_debug_trace( bh_tree *bh, u32 inode, v3f pos, u32 colour ) { bh_node *node = &bh->nodes[ inode ]; @@ -189,21 +209,13 @@ VG_STATIC void bh_debug_node( bh_tree *bh, u32 inode, v3f pos, u32 colour ) { vg_line_boxf( node->bbx, colour ); - bh_debug_node( bh, node->il, pos, colour ); - bh_debug_node( bh, node->ir, pos, colour ); + bh_debug_trace( bh, node->il, pos, colour ); + bh_debug_trace( bh, node->ir, pos, colour ); } else { - vg_line_boxf( node->bbx, 0xff00ff00 ); - if( bh->system->item_debug ) - { - for( u32 i=0; icount; i++ ) - { - u32 idx = node->start+i; - bh->system->item_debug( bh->user, idx ); - } - } + bh_debug_leaf( bh, node ); } } } @@ -220,11 +232,16 @@ VG_STATIC int bh_ray( bh_tree *bh, v3f co, v3f dir, ray_hit *hit ) stack[0] = 0; stack[1] = bh->nodes[0].il; stack[2] = bh->nodes[0].ir; + + v3f dir_inv; + dir_inv[0] = 1.0f/dir[0]; + dir_inv[1] = 1.0f/dir[1]; + dir_inv[2] = 1.0f/dir[2]; while(depth) { bh_node *inode = &bh->nodes[ stack[depth] ]; - if( ray_aabb( inode->bbx, co, dir, hit->dist ) ) + if( ray_aabb1( inode->bbx, co, dir_inv, hit->dist ) ) { if( inode->count ) { @@ -288,39 +305,39 @@ VG_STATIC int bh_next( bh_tree *bh, bh_iter *it, boxf box, int *em ) { bh_node *inode = &bh->nodes[ it->stack[it->depth].id ]; - if( box_overlap( inode->bbx, box ) ) + /* Only process overlapping nodes */ + if( !box_overlap( inode->bbx, box ) ) { - if( inode->count ) + it->depth --; + continue; + } + + if( inode->count ) + { + if( it->i < inode->count ) { - if( it->i < inode->count ) - { - *em = inode->start+it->i; - it->i ++; - return 1; - } - else - { - it->depth --; - it->i = 0; - } + *em = inode->start+it->i; + it->i ++; + return 1; } else { - if( it->depth+1 >= vg_list_size(it->stack) ) - { - vg_error( "Maximum stack reached!\n" ); - return 0; - } - - it->stack[it->depth ].id = inode->il; - it->stack[it->depth+1].id = inode->ir; - it->depth ++; + it->depth --; it->i = 0; } } else { - it->depth --; + if( it->depth+1 >= vg_list_size(it->stack) ) + { + vg_error( "Maximum stack reached!\n" ); + return 0; + } + + it->stack[it->depth ].id = inode->il; + it->stack[it->depth+1].id = inode->ir; + it->depth ++; + it->i = 0; } }