}
}
+
+
+
+
+/*
+ * BVH implementation
+ * ----------------------------------------------------------------------------
+ */
+
+VG_STATIC void trigger_bh_expand_bound( void *user, boxf bound, u32 item_index )
+{
+ world_instance *world = user;
+ struct trigger_zone *trigger = &world->triggers[ item_index ];
+
+ m4x3_expand_aabb_point( trigger->transform, bound, (v3f){ 1.0f, 1.0f, 1.0f} );
+ m4x3_expand_aabb_point( trigger->transform, bound, (v3f){ 1.0f, 1.0f,-1.0f} );
+ m4x3_expand_aabb_point( trigger->transform, bound, (v3f){ 1.0f,-1.0f, 1.0f} );
+ m4x3_expand_aabb_point( trigger->transform, bound, (v3f){ 1.0f,-1.0f,-1.0f} );
+ m4x3_expand_aabb_point( trigger->transform, bound, (v3f){-1.0f, 1.0f, 1.0f} );
+ m4x3_expand_aabb_point( trigger->transform, bound, (v3f){-1.0f, 1.0f,-1.0f} );
+ m4x3_expand_aabb_point( trigger->transform, bound, (v3f){-1.0f,-1.0f, 1.0f} );
+ m4x3_expand_aabb_point( trigger->transform, bound, (v3f){-1.0f,-1.0f,-1.0f} );
+}
+
+VG_STATIC float trigger_bh_centroid( void *user, u32 item_index, int axis )
+{
+ world_instance *world = user;
+ struct trigger_zone *trigger = &world->triggers[ item_index ];
+
+ return trigger->transform[3][axis];
+}
+
+VG_STATIC void trigger_bh_swap( void *user, u32 ia, u32 ib )
+{
+ world_instance *world = user;
+ struct trigger_zone *a = &world->triggers[ ia ],
+ *b = &world->triggers[ ib ],
+ temp;
+
+ temp = *a;
+ *a = *b;
+ *b = temp;
+}
+
+VG_STATIC void trigger_bh_debug( void *user, u32 item_index )
+{
+ world_instance *world = user;
+ struct trigger_zone *zone = &world->triggers[ item_index ];
+
+ vg_line_boxf_transformed( zone->transform, (boxf){{-1.0f,-1.0f,-1.0f},
+ { 1.0f, 1.0f, 1.0f}},
+ 0xff00ff00 );
+}
+
+VG_STATIC bh_system bh_system_triggers =
+{
+ .expand_bound = trigger_bh_expand_bound,
+ .item_centroid = trigger_bh_centroid,
+ .item_closest = NULL,
+ .item_swap = trigger_bh_swap,
+ .item_debug = trigger_bh_debug,
+ .cast_ray = NULL
+};
+
#endif /* WORLD_LOGIC_BRICKS_H */