+int aabb_oriented_intersect_plane( const aabb_t *aabb, const m4x4_t transform, const vec_t* plane ){
+ vec_t fDist, fIntersect;
+
+ // calc distance of origin from plane
+ fDist = DotProduct( plane, aabb->origin ) + plane[3];
+
+ // calc extents distance relative to plane normal
+ fIntersect = (vec_t)( fabs( aabb->extents[0] * DotProduct( plane, transform ) )
+ + fabs( aabb->extents[1] * DotProduct( plane, transform + 4 ) )
+ + fabs( aabb->extents[2] * DotProduct( plane, transform + 8 ) ) );
+ // accept if origin is less than this distance
+ if ( fabs( fDist ) < fIntersect ) {
+ return 1; // partially inside
+ }
+ else if ( fDist < 0 ) {
+ return 2; // totally inside
+ }
+ return 0; // totally outside
+}
+
+void aabb_corners( const aabb_t* aabb, vec3_t corners[8] ){
+ vec3_t min, max;
+ VectorSubtract( aabb->origin, aabb->extents, min );
+ VectorAdd( aabb->origin, aabb->extents, max );
+ VectorSet( corners[0], min[0], max[1], max[2] );
+ VectorSet( corners[1], max[0], max[1], max[2] );
+ VectorSet( corners[2], max[0], min[1], max[2] );
+ VectorSet( corners[3], min[0], min[1], max[2] );
+ VectorSet( corners[4], min[0], max[1], min[2] );
+ VectorSet( corners[5], max[0], max[1], min[2] );
+ VectorSet( corners[6], max[0], min[1], min[2] );
+ VectorSet( corners[7], min[0], min[1], min[2] );
+}
+
+
+void bbox_update_radius( bbox_t *bbox ){
+ bbox->radius = VectorLength( bbox->aabb.extents );
+}
+