diff options
author | Campbell Barton <ideasman42@gmail.com> | 2021-11-11 13:14:08 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2021-11-11 13:14:08 +0300 |
commit | bb64155c6372577342f80234fece2615c36d347f (patch) | |
tree | 3f813b117b41e793226f37f36b63427ae14c93fe /source/blender/editors/transform/transform_gizmo_3d.c | |
parent | d753ebd40afe941bddc86f8f7dbb6dcb014d2716 (diff) |
Cleanup: split gimbal_axis into pose and object
Allow access to a single bones gimbal matrix.
Diffstat (limited to 'source/blender/editors/transform/transform_gizmo_3d.c')
-rw-r--r-- | source/blender/editors/transform/transform_gizmo_3d.c | 103 |
1 files changed, 47 insertions, 56 deletions
diff --git a/source/blender/editors/transform/transform_gizmo_3d.c b/source/blender/editors/transform/transform_gizmo_3d.c index e79fdc4890a..b40412a0845 100644 --- a/source/blender/editors/transform/transform_gizmo_3d.c +++ b/source/blender/editors/transform/transform_gizmo_3d.c @@ -564,72 +564,63 @@ static bool test_rotmode_euler(short rotmode) return (ELEM(rotmode, ROT_MODE_AXISANGLE, ROT_MODE_QUAT)) ? 0 : 1; } -/** - * Return false when no gimbal for selection. - */ -bool gimbal_axis(Object *ob, float gmat[3][3]) +bool gimbal_axis_pose(Object *ob, const bPoseChannel *pchan, float gmat[3][3]) { - if (ob->mode & OB_MODE_POSE) { - bPoseChannel *pchan = BKE_pose_channel_active(ob); - - if (pchan) { - float mat[3][3], tmat[3][3], obmat[3][3]; - if (test_rotmode_euler(pchan->rotmode)) { - eulO_to_gimbal_axis(mat, pchan->eul, pchan->rotmode); - } - else if (pchan->rotmode == ROT_MODE_AXISANGLE) { - axis_angle_to_gimbal_axis(mat, pchan->rotAxis, pchan->rotAngle); - } - else { /* quat */ - return 0; - } - - /* apply bone transformation */ - mul_m3_m3m3(tmat, pchan->bone->bone_mat, mat); + float mat[3][3], tmat[3][3], obmat[3][3]; + if (test_rotmode_euler(pchan->rotmode)) { + eulO_to_gimbal_axis(mat, pchan->eul, pchan->rotmode); + } + else if (pchan->rotmode == ROT_MODE_AXISANGLE) { + axis_angle_to_gimbal_axis(mat, pchan->rotAxis, pchan->rotAngle); + } + else { /* quat */ + return 0; + } - if (pchan->parent) { - float parent_mat[3][3]; + /* apply bone transformation */ + mul_m3_m3m3(tmat, pchan->bone->bone_mat, mat); - copy_m3_m4(parent_mat, - (pchan->bone->flag & BONE_HINGE) ? pchan->parent->bone->arm_mat : - pchan->parent->pose_mat); - mul_m3_m3m3(mat, parent_mat, tmat); + if (pchan->parent) { + float parent_mat[3][3]; - /* needed if object transformation isn't identity */ - copy_m3_m4(obmat, ob->obmat); - mul_m3_m3m3(gmat, obmat, mat); - } - else { - /* needed if object transformation isn't identity */ - copy_m3_m4(obmat, ob->obmat); - mul_m3_m3m3(gmat, obmat, tmat); - } + copy_m3_m4(parent_mat, + (pchan->bone->flag & BONE_HINGE) ? pchan->parent->bone->arm_mat : + pchan->parent->pose_mat); + mul_m3_m3m3(mat, parent_mat, tmat); - normalize_m3(gmat); - return 1; - } + /* needed if object transformation isn't identity */ + copy_m3_m4(obmat, ob->obmat); + mul_m3_m3m3(gmat, obmat, mat); } else { - if (test_rotmode_euler(ob->rotmode)) { - eulO_to_gimbal_axis(gmat, ob->rot, ob->rotmode); - } - else if (ob->rotmode == ROT_MODE_AXISANGLE) { - axis_angle_to_gimbal_axis(gmat, ob->rotAxis, ob->rotAngle); - } - else { /* quat */ - return 0; - } + /* needed if object transformation isn't identity */ + copy_m3_m4(obmat, ob->obmat); + mul_m3_m3m3(gmat, obmat, tmat); + } - if (ob->parent) { - float parent_mat[3][3]; - copy_m3_m4(parent_mat, ob->parent->obmat); - normalize_m3(parent_mat); - mul_m3_m3m3(gmat, parent_mat, gmat); - } - return 1; + normalize_m3(gmat); + return true; +} + +bool gimbal_axis_object(Object *ob, float gmat[3][3]) +{ + if (test_rotmode_euler(ob->rotmode)) { + eulO_to_gimbal_axis(gmat, ob->rot, ob->rotmode); + } + else if (ob->rotmode == ROT_MODE_AXISANGLE) { + axis_angle_to_gimbal_axis(gmat, ob->rotAxis, ob->rotAngle); + } + else { /* quat */ + return 0; } - return 0; + if (ob->parent) { + float parent_mat[3][3]; + copy_m3_m4(parent_mat, ob->parent->obmat); + normalize_m3(parent_mat); + mul_m3_m3m3(gmat, parent_mat, gmat); + } + return 1; } /* centroid, boundbox, of selection */ |