X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=bvh.h;h=c18bb3052d9ffa532231ae9bcfcba797dbad4814;hb=a98ce96041b248580c0447bf87d4c6106483cade;hp=c841939d0cab9d40f7c0741bc637eac5711d8314;hpb=1656d58a7bd17df4a1edcc9677ade4dbafc82229;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/bvh.h b/bvh.h index c841939..c18bb30 100644 --- a/bvh.h +++ b/bvh.h @@ -1,3 +1,7 @@ +/* + * Copyright (C) 2021-2022 Mt.ZERO Software, Harry Godden - All Rights Reserved + */ + #ifndef BVH_H #define BVH_H #include "common.h" @@ -13,7 +17,9 @@ * user: a pointer back the base of the data you are ordering * system: the system we created above which will deal with the data * - * call bh_create( bh_tree *bh, u32 item_count, u32 item_size ) + * call bh_create( bh_tree *bh, u32 item_count ) + * static int bh_ray( bh_tree *bh, u32 inode, v3f co, v3f dir, ray_hit *hit ) + * static int bh_select( bh_tree *bh, boxf box, u32 *buffer, int len ) */ typedef struct bh_node bh_node; @@ -43,7 +49,6 @@ struct bh_system void (*expand_bound)( void *user, boxf bound, u32 item_index ); float (*item_centroid)( void *user, u32 item_index, int axis ); void (*item_swap)( void *user, u32 ia, u32 ib ); - u32 item_size; /* * Optional: @@ -53,7 +58,7 @@ struct bh_system */ void (*item_debug)( void *user, u32 item_index ); - int (*cast_ray)( void *user, v3f co, v3f dir, ray_hit *hit ); + int (*cast_ray)( void *user, u32 index, v3f co, v3f dir, ray_hit *hit ); }; static void bh_update_bounds( bh_tree *bh, u32 inode ) @@ -130,10 +135,11 @@ static void bh_subdivide( bh_tree *bh, u32 inode ) bh_subdivide( bh, ir ); } -static void bh_create( bh_tree *bh, bh_system *sys, u32 item_count ) +static void bh_create( bh_tree *bh, bh_system *sys, void *user, u32 item_count ) { bh->system = sys; - bh->nodes = malloc( sys->item_size * (item_count*2-1) ); + bh->user = user; + bh->nodes = vg_alloc( sizeof(bh_node) * (item_count*2-1) ); bh_node *root = &bh->nodes[0]; bh->node_count = 1; @@ -146,8 +152,17 @@ static void bh_create( bh_tree *bh, bh_system *sys, u32 item_count ) bh_update_bounds( bh, 0 ); bh_subdivide( bh, 0 ); - bh->nodes = realloc( bh->nodes, sys->item_size * bh->node_count ); + bh->nodes = vg_realloc( bh->nodes, sizeof(bh_node) * bh->node_count ); vg_success( "BVH done, size: %u/%u\n", bh->node_count, (item_count*2-1) ); + +#if 0 + vg_fatal_exit_loop( "Test crash from loader" ); +#endif +} + +static void bh_free( bh_tree *bh ) +{ + vg_free( bh->nodes ); } static void bh_debug_node( bh_tree *bh, u32 inode, v3f pos, u32 colour ) @@ -202,7 +217,7 @@ static int bh_ray( bh_tree *bh, u32 inode, v3f co, v3f dir, ray_hit *hit ) u32 idx = inode->start+i; if( bh->system->cast_ray ) - count += bh->system->cast_ray( bh->user, co, dir, hit ); + count += bh->system->cast_ray( bh->user, idx, co, dir, hit ); else count ++; } @@ -249,10 +264,7 @@ static int bh_select( bh_tree *bh, boxf box, u32 *buffer, int len ) if( inode->count ) { if( count + inode->count >= len ) - { - vg_error( "Maximum buffer reached!\n" ); return count; - } for( u32 i=0; icount; i++ ) buffer[ count ++ ] = inode->start+i;