- Simplified EulToGimbalAxis, its still only works on XYZ and ZXY but at least its...
authorCampbell Barton <ideasman42@gmail.com>
Fri, 30 Oct 2009 12:11:04 +0000 (12:11 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Fri, 30 Oct 2009 12:11:04 +0000 (12:11 +0000)
- Made RotOrderInfo use a vector rather then i/j/k
- Added gimbal_axis to transform.h (was extern)

source/blender/blenlib/intern/arithb.c
source/blender/editors/transform/transform.h
source/blender/editors/transform/transform_manipulator.c
source/blender/editors/transform/transform_orientations.c

index c42e21d5234fbea81bcb9f3e20c7024c7d56ce2f..fe8f97b4bcf63c66aff1f34e2c998f7e30b5bccf 100644 (file)
@@ -2995,10 +2995,8 @@ void MeanValueWeights(float v[][3], int n, float *co, float *w)
 
 /* Type for rotation order info - see wiki for derivation details */
 typedef struct RotOrderInfo {
-       short i;                /* first axis index */
-       short j;                /* second axis index */
-       short k;                /* third axis index */
-       short parity;   /* parity of axis permuation (even=0, odd=1) - 'n' in original code */
+       short axis[3];
+       short parity;   /* parity of axis permutation (even=0, odd=1) - 'n' in original code */
 } RotOrderInfo;
 
 /* Array of info for Rotation Order calculations 
@@ -3006,12 +3004,12 @@ typedef struct RotOrderInfo {
  */
 static RotOrderInfo rotOrders[]= {
        /* i, j, k, n */
-       {0, 1, 2, 0}, // XYZ
-       {0, 2, 1, 1}, // XZY
-       {1, 0, 2, 1}, // YXZ
-       {1, 2, 0, 0}, // YZX
-       {2, 0, 1, 0}, // ZXY
-       {2, 1, 0, 1}  // ZYZ
+       {{0, 1, 2}, 0}, // XYZ
+       {{0, 2, 1}, 1}, // XZY
+       {{1, 0, 2}, 1}, // YXZ
+       {{1, 2, 0}, 0}, // YZX
+       {{2, 0, 1}, 0}, // ZXY
+       {{2, 1, 0}, 1}  // ZYZ
 };
 
 /* Get relevant pointer to rotation order set from the array 
@@ -3024,7 +3022,7 @@ static RotOrderInfo rotOrders[]= {
 void EulOToQuat(float e[3], short order, float q[4])
 {
        RotOrderInfo *R= GET_ROTATIONORDER_INFO(order); 
-       short i=R->i,  j=R->j,  k=R->k;
+       short i=R->axis[0],  j=R->axis[1],      k=R->axis[2];
        double ti, tj, th, ci, cj, ch, si, sj, sh, cc, cs, sc, ss;
        double a[3];
        
@@ -3063,7 +3061,7 @@ void QuatToEulO(float q[4], float e[3], short order)
 void EulOToMat3(float e[3], short order, float M[3][3])
 {
        RotOrderInfo *R= GET_ROTATIONORDER_INFO(order); 
-       short i=R->i,  j=R->j,  k=R->k;
+       short i=R->axis[0],  j=R->axis[1],      k=R->axis[2];
        double ti, tj, th, ci, cj, ch, si, sj, sh, cc, cs, sc, ss;
        
        if (R->parity) {
@@ -3099,7 +3097,7 @@ void EulOToMat4(float e[3], short order, float M[4][4])
 void Mat3ToEulO(float M[3][3], float e[3], short order)
 {
        RotOrderInfo *R= GET_ROTATIONORDER_INFO(order); 
-       short i=R->i,  j=R->j,  k=R->k;
+       short i=R->axis[0],  j=R->axis[1],      k=R->axis[2];
        double cy = sqrt(M[i][i]*M[i][i] + M[i][j]*M[i][j]);
        
        if (cy > 16*FLT_EPSILON) {
@@ -3135,7 +3133,7 @@ void Mat4ToEulO(float M[4][4], float e[3], short order)
 static void mat3_to_eulo2(float M[3][3], float *e1, float *e2, short order)
 {
        RotOrderInfo *R= GET_ROTATIONORDER_INFO(order); 
-       short i=R->i,  j=R->j,  k=R->k;
+       short i=R->axis[0],  j=R->axis[1],      k=R->axis[2];
        float m[3][3];
        double cy;
        
@@ -3472,30 +3470,21 @@ void Mat3ToCompatibleEul(float mat[][3], float *eul, float *oldrot)
 void EulToGimbalAxis(float gmat[][3], float *eul, short order)
 {
        RotOrderInfo *R= GET_ROTATIONORDER_INFO(order);
-       short R_order[3];
-       short R_order2[3];
 
        float quat[4];
        float teul[3];
        float tvec[3];
        int i, a;
 
-       R_order2[R->i]= 0;
-       R_order2[R->j]= 1;
-       R_order2[R->k]= 2;
-
-       R_order[0]= R->i;
-       R_order[1]= R->j;
-       R_order[2]= R->k;
-
        for(i= 0; i<3; i++) {
                tvec[0]= tvec[1]= tvec[2]= 0.0f;
                tvec[i] = 1.0f;
 
                VecCopyf(teul, eul);
 
-               for(a= R_order2[i]; a >= 1; a--)
-                       teul[R_order[a-1]]= 0.0f;
+               /* TODO - only works on XYZ and ZXY */
+               for(a= R->axis[i]; a >= 1; a--)
+                       teul[R->axis[a-1]]= 0.0f;
 
                EulOToQuat(teul, order, quat);
                NormalQuat(quat);
@@ -3504,31 +3493,6 @@ void EulToGimbalAxis(float gmat[][3], float *eul, short order)
 
                VecCopyf(gmat[i], tvec);
        }
-
-
-#if 0
-
-       for(i= 0; i<3; i++) {
-               tvec[0]= tvec[1]= tvec[2]= 0.0f;
-               tvec[i] = 1.0f;
-
-               VecCopyf(teul, eul);
-
-               for(a= R_order2[i]; a >= 1; a--)
-                       teul[R_order[a-1]]= 0.0f;
-
-               EulToQuat(teul, quat);
-               NormalQuat(quat);
-               QuatMulVecf(quat, tvec);
-               Normalize(tvec);
-
-               VecCopyf(gmat[i], tvec);
-       }
-#endif
-
-
-
-
 }
 
 /* ************ AXIS ANGLE *************** */
index 819cb95d948e68dd8c89a92059d979057b52a0b9..ae4b1f446dac6870c826f8a4fca46bdaaf2b44d7 100644 (file)
@@ -535,6 +535,7 @@ void flushTransNodes(TransInfo *t);
 void flushTransSeq(TransInfo *t);
 
 /*********************** exported from transform_manipulator.c ********** */
+void gimbal_axis(struct Object *ob, float gmat[][3]);
 int calc_manipulator_stats(const struct bContext *C);
 float get_drawsize(struct ARegion *ar, float *co);
 
index 51a820dcdcb7e49d9bb73460687d8c07ab369545..4d48c2c0158e75efa2882ff3a11ebeded68841e4 100644 (file)
@@ -181,7 +181,7 @@ static int test_rotmode_euler(short rotmode)
        return (ELEM(rotmode, ROT_MODE_AXISANGLE, ROT_MODE_QUAT)) ? 0:1;
 }
 
-void gimbalAxis(Object *ob, float gmat[][3])
+void gimbal_axis(Object *ob, float gmat[][3])
 {
        if(ob->mode & OB_MODE_POSE)
        {
@@ -475,7 +475,7 @@ int calc_manipulator_stats(const bContext *C)
                {
                        float mat[3][3];
                        Mat3One(mat);
-                       gimbalAxis(ob, mat);
+                       gimbal_axis(ob, mat);
                        Mat4CpyMat3(rv3d->twmat, mat);
                        break;
                }
index efcaedd2fe11159152229928b23a38ef33c11242..56160d66e258d8f32ac2cf680cb40424d5cdb57b 100644 (file)
@@ -510,7 +510,6 @@ static int count_bone_select(bArmature *arm, ListBase *lb, int do_it)
        return total;
 }
 
-extern void gimbalAxis(Object *ob, float gimbal_vecs[][3]);
 void initTransformOrientation(bContext *C, TransInfo *t)
 {
        View3D *v3d = CTX_wm_view3d(C);
@@ -528,7 +527,7 @@ void initTransformOrientation(bContext *C, TransInfo *t)
        case V3D_MANIP_GIMBAL:
                Mat3One(t->spacemtx);
                if(ob)
-                       gimbalAxis(ob, t->spacemtx);
+                       gimbal_axis(ob, t->spacemtx);
                break;
        case V3D_MANIP_NORMAL:
                if(obedit || (ob && ob->mode & OB_MODE_POSE)) {