a[2] = v;
}
+// Vector 4
+void v4_copy( v4f a, v4f b )
+{
+ b[0] = a[0]; b[1] = a[1]; b[2] = a[2]; b[3] = a[3];
+}
+
// Matrix 3x3
//======================================================================================================
m4x3_mul( m, t, m );
}
+// Warning: These functions are unoptimized..
+void m4x3_expand_aabb_point( m4x3f m, boxf box, v3f point )
+{
+ v3f v;
+ m4x3_mulv( m, point, v );
+
+ v3_minv( box[0], v, box[0] );
+ v3_maxv( box[1], v, box[1] );
+}
+
+void box_concat( boxf a, boxf b )
+{
+ v3_minv( a[0], b[0], a[0] );
+ v3_maxv( a[1], b[1], a[1] );
+}
+
+void box_copy( boxf a, boxf b )
+{
+ v3_copy( a[0], b[0] );
+ v3_copy( a[1], b[1] );
+}
+
+void m4x3_transform_aabb( m4x3f m, boxf box )
+{
+ v3f a; v3f b;
+
+ v3_copy( box[0], a );
+ v3_copy( box[1], b );
+
+ m4x3_expand_aabb_point( m, box, a );
+ m4x3_expand_aabb_point( m, box, (v3f){ a[0], b[1], a[2] } );
+ m4x3_expand_aabb_point( m, box, (v3f){ b[0], a[1], a[2] } );
+ m4x3_expand_aabb_point( m, box, (v3f){ b[0], b[1], a[2] } );
+ m4x3_expand_aabb_point( m, box, b );
+ m4x3_expand_aabb_point( m, box, (v3f){ a[0], b[1], b[2] } );
+ m4x3_expand_aabb_point( m, box, (v3f){ b[0], a[1], b[2] } );
+ m4x3_expand_aabb_point( m, box, (v3f){ b[0], b[1], b[2] } );
+}
+
// Planes (double precision)
// ==================================================================================================================