diff options
author | Martin Poirier <theeth@yahoo.com> | 2009-11-02 00:10:54 +0300 |
---|---|---|
committer | Martin Poirier <theeth@yahoo.com> | 2009-11-02 00:10:54 +0300 |
commit | 94209d58aa45455793d0148299755c28ab832ba1 (patch) | |
tree | f8b7e8eaba40e14ef1f57cea70a3db8f0b10aff8 /source/blender/editors/transform/transform_manipulator.c | |
parent | 7bb6e18f20916b73618a4a42a4ebf285f5e3f6a9 (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.c | 53 |
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); + } } } } |