large reduction, redoing things
[carveJwlIkooP6JGAAIwe30JlM.git] / world_volumes.h
1 #ifndef WORLD_VOLUMES_H
2 #define WORLD_VOLUMES_H
3
4 #include "world.h"
5
6 /*
7 * BVH implementation
8 * ----------------------------------------------------------------------------
9 */
10
11 VG_STATIC void volume_vg_expand_bound( void *user, boxf bound, u32 item_index )
12 {
13 world_instance *world = user;
14 struct world_volume *volume = &world->volumes[ item_index ];
15
16 m4x3_expand_aabb_point( volume->transform, bound, (v3f){ 1.0f, 1.0f, 1.0f} );
17 m4x3_expand_aabb_point( volume->transform, bound, (v3f){ 1.0f, 1.0f,-1.0f} );
18 m4x3_expand_aabb_point( volume->transform, bound, (v3f){ 1.0f,-1.0f, 1.0f} );
19 m4x3_expand_aabb_point( volume->transform, bound, (v3f){ 1.0f,-1.0f,-1.0f} );
20 m4x3_expand_aabb_point( volume->transform, bound, (v3f){-1.0f, 1.0f, 1.0f} );
21 m4x3_expand_aabb_point( volume->transform, bound, (v3f){-1.0f, 1.0f,-1.0f} );
22 m4x3_expand_aabb_point( volume->transform, bound, (v3f){-1.0f,-1.0f, 1.0f} );
23 m4x3_expand_aabb_point( volume->transform, bound, (v3f){-1.0f,-1.0f,-1.0f} );
24 }
25
26 VG_STATIC float volume_vg_centroid( void *user, u32 item_index, int axis )
27 {
28 world_instance *world = user;
29 struct world_volume *volume = &world->volumes[ item_index ];
30
31 return volume->transform[3][axis];
32 }
33
34 VG_STATIC void volume_vg_swap( void *user, u32 ia, u32 ib )
35 {
36 world_instance *world = user;
37 struct world_volume *a = &world->volumes[ ia ],
38 *b = &world->volumes[ ib ],
39 temp;
40
41 temp = *a;
42 *a = *b;
43 *b = temp;
44 }
45
46 VG_STATIC void volume_vg_debug( void *user, u32 item_index )
47 {
48 world_instance *world = user;
49 struct world_volume *zone = &world->volumes[ item_index ];
50
51 vg_line_boxf_transformed( zone->transform, (boxf){{-1.0f,-1.0f,-1.0f},
52 { 1.0f, 1.0f, 1.0f}},
53 0xff00ff00 );
54 }
55
56 VG_STATIC bh_system bh_system_volumes =
57 {
58 .expand_bound = volume_vg_expand_bound,
59 .item_centroid = volume_vg_centroid,
60 .item_closest = NULL,
61 .item_swap = volume_vg_swap,
62 .item_debug = volume_vg_debug,
63 .cast_ray = NULL
64 };
65
66 #endif /* WORLD_VOLUMES_H */