Move function out of mathutils to: BLI_math_rotation --- single_axis_angle_to_mat3...
authorCampbell Barton <ideasman42@gmail.com>
Mon, 19 Sep 2011 13:08:01 +0000 (13:08 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Mon, 19 Sep 2011 13:08:01 +0000 (13:08 +0000)
source/blender/blenlib/BLI_math_rotation.h
source/blender/blenlib/intern/math_rotation.c
source/blender/python/mathutils/mathutils_Matrix.c

index ef20408..d7ca032 100644 (file)
@@ -102,6 +102,8 @@ void quat_to_axis_angle(float axis[3], float *angle, const float q[4]);
 void mat3_to_axis_angle(float axis[3], float *angle, float M[3][3]);
 void mat4_to_axis_angle(float axis[3], float *angle, float M[4][4]);
 
+void single_axis_angle_to_mat3(float R[3][3], const char axis, const float angle);
+
 /****************************** Vector/Rotation ******************************/
 /* old axis angle code                                                       */
 /* TODO: the following calls should probably be depreceated sometime         */
index 6800b59..ef286e1 100644 (file)
@@ -771,6 +771,52 @@ void mat4_to_axis_angle(float axis[3], float *angle,float mat[4][4])
        quat_to_axis_angle(axis, angle,q);
 }
 
+
+
+void single_axis_angle_to_mat3(float mat[3][3], const char axis, const float angle)
+{
+       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         */
 
index 3953171..2da96dc 100644 (file)
@@ -266,42 +266,19 @@ static PyObject *C_Matrix_Rotation(PyObject *cls, PyObject *args)
 
                axis_angle_to_mat3((float (*)[3])mat, tvec, angle);
        }
-       else if(matSize == 2) {
+       else if (matSize == 2) {
+               const float angle_cos= cosf(angle);
+               const float angle_sin= sinf(angle);
+
                //2D rotation matrix
-               mat[0] = (float) cos (angle);
-               mat[1] = (float) sin (angle);
-               mat[2] = -((float) sin(angle));
-               mat[3] = (float) cos(angle);
-       }
-       else if(strcmp(axis, "X") == 0) {
-               //rotation around X
-               mat[0] = 1.0f;
-               mat[4] = (float) cos(angle);
-               mat[5] = (float) sin(angle);
-               mat[7] = -((float) sin(angle));
-               mat[8] = (float) cos(angle);
-       }
-       else if(strcmp(axis, "Y") == 0) {
-               //rotation around Y
-               mat[0] = (float) cos(angle);
-               mat[2] = -((float) sin(angle));
-               mat[4] = 1.0f;
-               mat[6] = (float) sin(angle);
-               mat[8] = (float) cos(angle);
-       }
-       else if(strcmp(axis, "Z") == 0) {
-               //rotation around Z
-               mat[0] = (float) cos(angle);
-               mat[1] = (float) sin(angle);
-               mat[3] = -((float) sin(angle));
-               mat[4] = (float) cos(angle);
-               mat[8] = 1.0f;
+               mat[0] =  angle_cos;
+               mat[1] =  angle_sin;
+               mat[2] = -angle_sin;
+               mat[3] =  angle_cos;
        }
        else {
-               /* should never get here */
-               PyErr_SetString(PyExc_ValueError,
-                               "mathutils.RotationMatrix(): unknown error");
-               return NULL;
+               /* valid axis checked above */
+               single_axis_angle_to_mat3((float (*)[3])mat, axis[0], angle);
        }
 
        if(matSize == 4) {