Merging r40265 through r40492 from trunk into soc-2011-tomato
[blender.git] / source / blender / blenlib / intern / math_rotation.c
index 98209603e47d6b95da2323fe95492bdb95ea13b7..59e732182335a1df78663844f7d12d165629db1f 100644 (file)
@@ -213,7 +213,7 @@ void quat_to_mat4(float m[][4], const float q[4])
        double q0, q1, q2, q3, qda,qdb,qdc,qaa,qab,qac,qbb,qbc,qcc;
 
 #ifdef DEBUG
-       if(!((q0=dot_qtqt(q, q))==0.0f || (fabsf(q0-1.0f) < (float)QUAT_EPSILON))) {
+       if(!((q0=dot_qtqt(q, q))==0.0f || (fabs(q0-1.0) < QUAT_EPSILON))) {
                fprintf(stderr, "Warning! quat_to_mat4() called with non-normalized: size %.8f *** report a bug ***\n", (float)q0);
        }
 #endif
@@ -492,8 +492,8 @@ void vec_to_quat(float q[4], const float vec[3], short axis, const short upflag)
                        else angle= (float)(-0.5*atan2(-fp[0], -fp[1]));
                }
                                
-               co= (float)cos(angle);
-               si= (float)(sin(angle)/len1);
+               co= cosf(angle);
+               si= sinf(angle)/len1;
                q2[0]= co;
                q2[1]= x2*si;
                q2[2]= y2*si;
@@ -771,31 +771,55 @@ void mat4_to_axis_angle(float axis[3], float *angle,float mat[4][4])
        quat_to_axis_angle(axis, angle,q);
 }
 
-/****************************** Vector/Rotation ******************************/
-/* TODO: the following calls should probably be depreceated sometime         */
 
-/* 3x3 matrix to axis angle */
-void mat3_to_vec_rot(float axis[3], float *angle,float mat[3][3])
-{
-       float q[4];
-       
-       /* use quaternions as intermediate representation */
-       // TODO: it would be nicer to go straight there...
-       mat3_to_quat(q,mat);
-       quat_to_axis_angle(axis, angle,q);
-}
 
-/* 4x4 matrix to axis angle */
-void mat4_to_vec_rot(float axis[3], float *angle,float mat[4][4])
+void single_axis_angle_to_mat3(float mat[3][3], const char axis, const float angle)
 {
-       float q[4];
-       
-       /* use quaternions as intermediate representation */
-       // TODO: it would be nicer to go straight there...
-       mat4_to_quat(q,mat);
-       quat_to_axis_angle(axis, angle,q);
+       const float angle_cos= cosf(angle);
+       const float angle_sin= sinf(angle);
+
+       switch(axis) {
+       case 'X': /* rotation around X */
+               mat[0][0] =  1.0f;
+               mat[0][1] =  0.0f;
+               mat[0][2] =  0.0f;
+               mat[1][0] =  0.0f;
+               mat[1][1] =  angle_cos;
+               mat[1][2] =  angle_sin;
+               mat[2][0] =  0.0f;
+               mat[2][1] = -angle_sin;
+               mat[2][2] =  angle_cos;
+               break;
+       case 'Y': /* rotation around Y */
+               mat[0][0] =  angle_cos;
+               mat[0][1] =  0.0f;
+               mat[0][2] = -angle_sin;
+               mat[1][0] =  0.0f;
+               mat[1][1] =  1.0f;
+               mat[1][2] =  0.0f;
+               mat[2][0] =  angle_sin;
+               mat[2][1] =  0.0f;
+               mat[2][2] =  angle_cos;
+               break;
+       case 'Z': /* rotation around Z */
+               mat[0][0] =  angle_cos;
+               mat[0][1] =  angle_sin;
+               mat[0][2] =  0.0f;
+               mat[1][0] = -angle_sin;
+               mat[1][1] =  angle_cos;
+               mat[1][2] =  0.0f;
+               mat[2][0] =  0.0f;
+               mat[2][1] =  0.0f;
+               mat[2][2] =  1.0f;
+               break;
+       default:
+               assert("invalid axis");
+       }
 }
 
+/****************************** Vector/Rotation ******************************/
+/* TODO: the following calls should probably be depreceated sometime         */
+
 /* axis angle to 3x3 matrix */
 void vec_rot_to_mat3(float mat[][3], const float vec[3], const float phi)
 {