static inline float v2_cross( v2f a, v2f b )
{
- return a[0] * b[1] - a[1] * b[0];
+ return a[0]*b[1] - a[1]*b[0];
}
static inline void v2_add( v2f a, v2f b, v2f d )
return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
}
-static inline void v3_cross( v3f a, v3f b, v3f d )
+static inline void v3_cross( v3f a, v3f b, v3f dest )
{
- d[0] = a[1] * b[2] - a[2] * b[1];
- d[1] = a[2] * b[0] - a[0] * b[2];
- d[2] = a[0] * b[1] - a[1] * b[0];
+ v3f d;
+ d[0] = a[1]*b[2] - a[2]*b[1];
+ d[1] = a[2]*b[0] - a[0]*b[2];
+ d[2] = a[0]*b[1] - a[1]*b[0];
+ v3_copy( d, dest );
}
static inline float v3_length2( v3f a )
v3_maxv( box[1], v, box[1] );
}
+static inline void box_addpt( boxf a, v3f pt )
+{
+ v3_minv( a[0], pt, a[0] );
+ v3_maxv( a[1], pt, a[1] );
+}
+
static inline void box_concat( boxf a, boxf b )
{
v3_minv( a[0], b[0], a[0] );
v3_copy( a[1], b[1] );
}
+static inline void box_init_inf( boxf box )
+{
+ v3_fill( box[0], INFINITY );
+ v3_fill( box[1], -INFINITY );
+}
+
static inline void m4x3_transform_aabb( m4x3f m, boxf box )
{
v3f a; v3f b;
v3_sub( target, pos, dir );
v3_normalize( dir );
- v3_negate( dir, m[2] );
+ v3_copy( dir, m[2] );
v3_cross( up, m[2], m[0] );
v3_normalize( m[0] );
d[2][1] = yz - wx;
d[0][2] = xz - wy;
}
+
+static void m3x3_q( m3x3f m, v4f q )
+{
+ float diag, r, rinv;
+
+ diag = m[0][0] + m[1][1] + m[2][2];
+ if( diag >= 0.0f )
+ {
+ r = sqrtf( 1.0f + diag );
+ rinv = 0.5f / r;
+ q[0] = rinv * (m[1][2] - m[2][1]);
+ q[1] = rinv * (m[2][0] - m[0][2]);
+ q[2] = rinv * (m[0][1] - m[1][0]);
+ q[3] = r * 0.5f;
+ }
+ else if( m[0][0] >= m[1][1] && m[0][0] >= m[2][2] )
+ {
+ r = sqrtf( 1.0f - m[1][1] - m[2][2] + m[0][0] );
+ rinv = 0.5f / r;
+ q[0] = r * 0.5f;
+ q[1] = rinv * (m[0][1] + m[1][0]);
+ q[2] = rinv * (m[0][2] + m[2][0]);
+ q[3] = rinv * (m[1][2] - m[2][1]);
+ }
+ else if( m[1][1] >= m[2][2] )
+ {
+ r = sqrtf( 1.0f - m[0][0] - m[2][2] + m[1][1] );
+ rinv = 0.5f / r;
+ q[0] = rinv * (m[0][1] + m[1][0]);
+ q[1] = r * 0.5f;
+ q[2] = rinv * (m[1][2] + m[2][1]);
+ q[3] = rinv * (m[2][0] - m[0][2]);
+ }
+ else
+ {
+ r = sqrtf( 1.0f - m[0][0] - m[1][1] + m[2][2] );
+ rinv = 0.5f / r;
+ q[0] = rinv * (m[0][2] + m[2][0]);
+ q[1] = rinv * (m[1][2] + m[2][1]);
+ q[2] = r * 0.5f;
+ q[3] = rinv * (m[0][1] - m[1][0]);
+ }
+}