Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Poirier <theeth@yahoo.com>2009-11-02 00:10:54 +0300
committerMartin Poirier <theeth@yahoo.com>2009-11-02 00:10:54 +0300
commit94209d58aa45455793d0148299755c28ab832ba1 (patch)
treef8b7e8eaba40e14ef1f57cea70a3db8f0b10aff8 /source/blender/editors/transform/transform_manipulator.c
parent7bb6e18f20916b73618a4a42a4ebf285f5e3f6a9 (diff)
Simplify gimbal axis code and make gimbal orientation work correctly with parents (objects or pose bones). Works for all euler orders too, obviously.
Diffstat (limited to 'source/blender/editors/transform/transform_manipulator.c')
-rw-r--r--source/blender/editors/transform/transform_manipulator.c53
1 files changed, 35 insertions, 18 deletions
diff --git a/source/blender/editors/transform/transform_manipulator.c b/source/blender/editors/transform/transform_manipulator.c
index 4d48c2c0158..357e164961d 100644
--- a/source/blender/editors/transform/transform_manipulator.c
+++ b/source/blender/editors/transform/transform_manipulator.c
@@ -197,34 +197,51 @@ void gimbal_axis(Object *ob, float gmat[][3])
}
if(pchan) {
- int i;
+ float mat[3][3], tmat[3][3], obmat[3][3];
- EulToGimbalAxis(gmat, pchan->eul, pchan->rotmode);
+ EulToGimbalAxis(mat, pchan->eul, pchan->rotmode);
- for (i=0; i<3; i++)
- Mat3MulVecfl(pchan->bone->bone_mat, gmat[i]);
-
- if(pchan->parent) {
- bPoseChannel *pchan_par= pchan->parent;
+ /* apply bone transformation */
+ Mat3MulMat3(tmat, pchan->bone->bone_mat, mat);
+
+ if (pchan->parent)
+ {
+ float parent_mat[3][3];
- float tmat[3][3];
- Mat3CpyMat4(tmat, pchan_par->pose_mat);
+ Mat3CpyMat4(parent_mat, pchan->parent->pose_mat);
+ Mat3MulMat3(mat, parent_mat, tmat);
- for (i=0; i<3; i++)
- Mat3MulVecfl(tmat, gmat[i]);
+ /* needed if object transformation isn't identity */
+ Mat3CpyMat4(obmat, ob->obmat);
+ Mat3MulMat3(gmat, obmat, mat);
}
-
- /* needed if object trans isnt identity */
- for (i=0; i<3; i++) {
- float tmat[3][3];
- Mat3CpyMat4(tmat, ob->obmat);
- Mat3MulVecfl(tmat, gmat[i]);
+ else
+ {
+ /* needed if object transformation isn't identity */
+ Mat3CpyMat4(obmat, ob->obmat);
+ Mat3MulMat3(gmat, obmat, tmat);
}
+
+ Mat3Ortho(gmat);
}
}
else {
if(test_rotmode_euler(ob->rotmode)) {
- EulToGimbalAxis(gmat, ob->rot, ob->rotmode);
+
+
+ if (ob->parent)
+ {
+ float parent_mat[3][3], amat[3][3];
+
+ EulToGimbalAxis(amat, ob->rot, ob->rotmode);
+ Mat3CpyMat4(parent_mat, ob->parent->obmat);
+ Mat3Ortho(parent_mat);
+ Mat3MulMat3(gmat, parent_mat, amat);
+ }
+ else
+ {
+ EulToGimbalAxis(gmat, ob->rot, ob->rotmode);
+ }
}
}
}