the luxuries of a modern C compiler
[carveJwlIkooP6JGAAIwe30JlM.git] / world_volumes.c
diff --git a/world_volumes.c b/world_volumes.c
new file mode 100644 (file)
index 0000000..c08fe43
--- /dev/null
@@ -0,0 +1,55 @@
+#ifndef WORLD_VOLUMES_C
+#define WORLD_VOLUMES_C
+
+#include "world_volumes.h"
+
+/*
+ * BVH implementation
+ * ----------------------------------------------------------------------------
+ */
+
+VG_STATIC void volume_vg_expand_bound( void *user, boxf bound, u32 item_index )
+{
+   world_instance *world = user;
+
+   ent_volume *volume = mdl_arritm( &world->ent_volume, item_index );
+
+   m4x3_expand_aabb_point( volume->to_world, bound, (v3f){ 1.0f, 1.0f, 1.0f} );
+   m4x3_expand_aabb_point( volume->to_world, bound, (v3f){ 1.0f, 1.0f,-1.0f} );
+   m4x3_expand_aabb_point( volume->to_world, bound, (v3f){ 1.0f,-1.0f, 1.0f} );
+   m4x3_expand_aabb_point( volume->to_world, bound, (v3f){ 1.0f,-1.0f,-1.0f} );
+   m4x3_expand_aabb_point( volume->to_world, bound, (v3f){-1.0f, 1.0f, 1.0f} );
+   m4x3_expand_aabb_point( volume->to_world, bound, (v3f){-1.0f, 1.0f,-1.0f} );
+   m4x3_expand_aabb_point( volume->to_world, bound, (v3f){-1.0f,-1.0f, 1.0f} );
+   m4x3_expand_aabb_point( volume->to_world, bound, (v3f){-1.0f,-1.0f,-1.0f} );
+}
+
+VG_STATIC float volume_vg_centroid( void *user, u32 item_index, int axis )
+{
+   world_instance *world = user;
+   ent_volume *volume = mdl_arritm( &world->ent_volume, item_index );
+   return volume->to_world[3][axis];
+}
+
+VG_STATIC void volume_vg_swap( void *user, u32 ia, u32 ib )
+{
+   world_instance *world = user;
+   ent_volume *a = mdl_arritm( &world->ent_volume, ia ),
+              *b = mdl_arritm( &world->ent_volume, ib ),
+              temp;
+
+   temp = *a;
+   *a = *b;
+   *b = temp;
+}
+
+VG_STATIC void volume_vg_debug( void *user, u32 item_index )
+{
+   world_instance *world = user;
+   ent_volume *volume = mdl_arritm( &world->ent_volume, item_index );
+   vg_line_boxf_transformed( volume->to_world, (boxf){{-1.0f,-1.0f,-1.0f},
+                                                      { 1.0f, 1.0f, 1.0f}}, 
+                                                      0xff00ff00 );
+}
+
+#endif /* WORLD_VOLUMES_H */