* 5.c Closest points
* 5.d Raycast & Spherecasts
* 5.e Curves
+ * 5.f Volumes
* 6. Statistics
* 6.a Random numbers
**/
return ((vg_ftu32(a)) & 0x7F800000U) != 0x7F800000U;
}
+static int v3_valid( v3f a ){
+ for( u32 i=0; i<3; i++ )
+ if( !vg_validf(a[i]) ) return 0;
+ return 1;
+}
+
/*
* -----------------------------------------------------------------------------
* Section 1. Scalar Operations
v3_add( v1, v2, d );
}
+static void v3_tangent_basis( v3f n, v3f tx, v3f ty ){
+ /* Compute tangent basis (box2d) */
+ if( fabsf( n[0] ) >= 0.57735027f ){
+ tx[0] = n[1];
+ tx[1] = -n[0];
+ tx[2] = 0.0f;
+ }
+ else{
+ tx[0] = 0.0f;
+ tx[1] = n[2];
+ tx[2] = -n[1];
+ }
+
+ v3_normalize( tx );
+ v3_cross( n, tx, ty );
+}
+
+
/*
* -----------------------------------------------------------------------------
* Section 2.c 4D Vectors
static inline void q_normalize( v4f q )
{
- f32 s = 1.0f/ sqrtf(v4_dot(q,q));
- q[0] *= s;
- q[1] *= s;
- q[2] *= s;
- q[3] *= s;
+ f32 l2 = v4_dot(q,q);
+ if( l2 < 0.00001f ) q_identity( q );
+ else {
+ f32 s = 1.0f/sqrtf(l2);
+ q[0] *= s;
+ q[1] *= s;
+ q[2] *= s;
+ q[3] *= s;
+ }
}
static inline void q_inv( v4f q, v4f d )
v3_muladds( p, p2, t*t, p );
}
+/*
+ * -----------------------------------------------------------------------------
+ * Section 5.f Volumes
+ * -----------------------------------------------------------------------------
+ */
+
+static float vg_sphere_volume( float radius ){
+ float r3 = radius*radius*radius;
+ return (4.0f/3.0f) * VG_PIf * r3;
+}
+
/*
* -----------------------------------------------------------------------------
* Section 6.a PSRNG and some distributions
* Programming," Vol. 2 (2nd Ed.) pp.102.
*/
vg_rand.mt[0] = seed & 0xffffffff;
- for( vg_rand.index=1; vg_rand.index<MT_STATE_VECTOR_LENGTH; vg_rand.index++ ){
+ for( vg_rand.index=1; vg_rand.index<MT_STATE_VECTOR_LENGTH; vg_rand.index++){
vg_rand.mt[vg_rand.index] =
(6069 * vg_rand.mt[vg_rand.index-1]) & 0xffffffff;
}