well yeah i guess
[carveJwlIkooP6JGAAIwe30JlM.git] / bvh.h
diff --git a/bvh.h b/bvh.h
index c18bb3052d9ffa532231ae9bcfcba797dbad4814..9fdbe985040f51e0cadfd0a183b921240c82a036 100644 (file)
--- a/bvh.h
+++ b/bvh.h
  *   system: the system we created above which will deal with the data
  *
  * 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 )
+ * VG_STATIC int bh_ray( bh_tree *bh, u32 inode, v3f co, v3f dir, ray_hit *hit )
+ * VG_STATIC int bh_select( bh_tree *bh, boxf box, u32 *buffer, int len )
  */
 
 typedef struct bh_node bh_node;
 typedef struct bh_tree bh_tree;
 typedef struct bh_system bh_system;
 
-struct bh_node
-{
-   boxf bbx;
-
-   /* if il is 0, this is a leaf */
-   u32 il, count;
-   union{ u32 ir, start; };
-};
-
 struct bh_tree
 {
-   bh_node *nodes;
    u32 node_count;
 
    bh_system *system;
    void *user;
+
+   struct bh_node
+   {
+      boxf bbx;
+
+      /* if il is 0, this is a leaf */
+      u32 il, count;
+      union{ u32 ir, start; };
+   } 
+   nodes[];
 };
 
 struct bh_system
@@ -61,7 +61,7 @@ struct bh_system
    int   (*cast_ray)( void *user, u32 index, v3f co, v3f dir, ray_hit *hit );
 };
 
-static void bh_update_bounds( bh_tree *bh, u32 inode )
+VG_STATIC void bh_update_bounds( bh_tree *bh, u32 inode )
 {
    bh_node *node = &bh->nodes[ inode ];
 
@@ -73,7 +73,7 @@ static void bh_update_bounds( bh_tree *bh, u32 inode )
    }
 }
 
-static void bh_subdivide( bh_tree *bh, u32 inode )
+VG_STATIC void bh_subdivide( bh_tree *bh, u32 inode )
 {
    bh_node *node = &bh->nodes[ inode ];
 
@@ -128,18 +128,19 @@ static void bh_subdivide( bh_tree *bh, u32 inode )
    node->ir = ir;
    node->count = 0;
 
-   /* TODO: Implement max depth, or stack */
    bh_update_bounds( bh, il );
    bh_update_bounds( bh, ir );
    bh_subdivide( bh, il );
    bh_subdivide( bh, ir );
 }
 
-static void bh_create( bh_tree *bh, bh_system *sys, void *user, u32 item_count )
+VG_STATIC bh_tree *bh_create( void *lin_alloc, bh_system *system, 
+                              void *user, u32 item_count )
 {
-   bh->system = sys;
+   u32 totsize = sizeof(bh_tree) + sizeof(bh_node)*(item_count*2-1);
+   bh_tree *bh = vg_linear_alloc( lin_alloc, totsize );
+   bh->system = system;
    bh->user = user;
-   bh->nodes = vg_alloc( sizeof(bh_node) * (item_count*2-1) );
 
    bh_node *root = &bh->nodes[0];
    bh->node_count = 1;
@@ -152,20 +153,14 @@ static void bh_create( bh_tree *bh, bh_system *sys, void *user, u32 item_count )
    bh_update_bounds( bh, 0 );
    bh_subdivide( bh, 0 );
 
-   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
-}
+   totsize = sizeof(bh_tree) + sizeof(bh_node) * bh->node_count;
+   bh = vg_linear_resize( lin_alloc, bh, totsize );
 
-static void bh_free( bh_tree *bh )
-{
-   vg_free( bh->nodes );
+   vg_success( "BVH done, size: %u/%u\n", bh->node_count, (item_count*2-1) );
+   return bh;
 }
 
-static void bh_debug_node( bh_tree *bh, u32 inode, v3f pos, u32 colour )
+VG_STATIC void bh_debug_node( bh_tree *bh, u32 inode, v3f pos, u32 colour )
 {
    bh_node *node = &bh->nodes[ inode ];
 
@@ -195,7 +190,7 @@ static void bh_debug_node( bh_tree *bh, u32 inode, v3f pos, u32 colour )
    }
 }
 
-static int bh_ray( bh_tree *bh, u32 inode, v3f co, v3f dir, ray_hit *hit )
+VG_STATIC int bh_ray( bh_tree *bh, v3f co, v3f dir, ray_hit *hit )
 {
    int count = 0;
    u32 stack[100];
@@ -246,7 +241,7 @@ static int bh_ray( bh_tree *bh, u32 inode, v3f co, v3f dir, ray_hit *hit )
    return count;
 }
 
-static int bh_select( bh_tree *bh, boxf box, u32 *buffer, int len )
+VG_STATIC int bh_select( bh_tree *bh, boxf box, u32 *buffer, int len )
 {
    int count = 0;
    u32 stack[100];