Animation: Add in Parent space alignment option to the Transform Orientation gizmo #104724

Merged
Nate Rupsis merged 47 commits from nrupsis/blender:parent-space into main 2023-04-20 17:40:31 +02:00
4 changed files with 38 additions and 1 deletions
Showing only changes of commit 2e5da7e81f - Show all commits

4
.gitignore vendored
View File

@ -49,3 +49,7 @@ waveletNoiseTile.bin
# testing environment # testing environment
/Testing /Testing
# CLion cmake folders
cmake-*

View File

@ -514,6 +514,31 @@ short ED_transform_calc_orientation_from_type_ex(const Scene *scene,
/* If not gimbal, fall through to normal. */ /* If not gimbal, fall through to normal. */
ATTR_FALLTHROUGH; ATTR_FALLTHROUGH;
} }
case V3D_ORIENT_PARENT: {
if (ob) {
if (ob->mode & OB_MODE_POSE) {
bPoseChannel *active_pchan = BKE_pose_channel_active(ob, false);
// switch for parent if it exists
bPoseChannel *space_pchan = active_pchan->parent ? active_pchan->parent : active_pchan;
if (space_pchan) {
// store off the original active bone for a moment, run this, then restore
bArmature *armature = ob->data;
armature->act_bone = space_pchan->bone;
ED_getTransformOrientationMatrix(view_layer, v3d, ob, obedit, pivot_point, r_mat);
armature->act_bone = active_pchan->bone;
break;
}
}
else {
// handle the parent check at object level
ED_getTransformOrientationMatrix(
view_layer, v3d, ob->parent ? ob->parent : ob, obedit, pivot_point, r_mat);
break;
}
}
/* No break; we define 'parent' as 'normal' otherwise. */
ATTR_FALLTHROUGH;
}
case V3D_ORIENT_NORMAL: { case V3D_ORIENT_NORMAL: {
if (obedit || (ob && ob->mode & OB_MODE_POSE)) { if (obedit || (ob && ob->mode & OB_MODE_POSE)) {
ED_getTransformOrientationMatrix(scene, view_layer, v3d, ob, obedit, pivot_point, r_mat); ED_getTransformOrientationMatrix(scene, view_layer, v3d, ob, obedit, pivot_point, r_mat);
@ -526,7 +551,7 @@ short ED_transform_calc_orientation_from_type_ex(const Scene *scene,
if (ob) { if (ob) {
if (ob->mode & OB_MODE_POSE) { if (ob->mode & OB_MODE_POSE) {
/* Each bone moves on its own local axis, but to avoid confusion, /* Each bone moves on its own local axis, but to avoid confusion,
* use the active pones axis for display #33575, this works as expected on a single * use the active bone's axis for display #33575, this works as expected on a single
* bone and users who select many bones will understand what's going on and what local * bone and users who select many bones will understand what's going on and what local
* means when they start transforming. */ * means when they start transforming. */
ED_getTransformOrientationMatrix(scene, view_layer, v3d, ob, obedit, pivot_point, r_mat); ED_getTransformOrientationMatrix(scene, view_layer, v3d, ob, obedit, pivot_point, r_mat);
@ -646,6 +671,8 @@ const char *transform_orientations_spacename_get(TransInfo *t, const short orien
return TIP_("view"); return TIP_("view");
case V3D_ORIENT_CURSOR: case V3D_ORIENT_CURSOR:
return TIP_("cursor"); return TIP_("cursor");
case V3D_ORIENT_PARENT:
return TIP_("parent");
case V3D_ORIENT_CUSTOM_MATRIX: case V3D_ORIENT_CUSTOM_MATRIX:
return TIP_("custom"); return TIP_("custom");
case V3D_ORIENT_CUSTOM: case V3D_ORIENT_CUSTOM:

View File

@ -629,6 +629,7 @@ enum {
V3D_ORIENT_VIEW = 3, V3D_ORIENT_VIEW = 3,
V3D_ORIENT_GIMBAL = 4, V3D_ORIENT_GIMBAL = 4,
V3D_ORIENT_CURSOR = 5, V3D_ORIENT_CURSOR = 5,
V3D_ORIENT_PARENT = 6,
V3D_ORIENT_CUSTOM = 1024, V3D_ORIENT_CUSTOM = 1024,
/** Runtime only, never saved to DNA. */ /** Runtime only, never saved to DNA. */
V3D_ORIENT_CUSTOM_MATRIX = (V3D_ORIENT_CUSTOM - 1), V3D_ORIENT_CUSTOM_MATRIX = (V3D_ORIENT_CUSTOM - 1),

View File

@ -639,6 +639,11 @@ const EnumPropertyItem rna_enum_transform_orientation_items[] = {
ICON_ORIENTATION_CURSOR, ICON_ORIENTATION_CURSOR,
"Cursor", "Cursor",
"Align the transformation axes to the 3D cursor"}, "Align the transformation axes to the 3D cursor"},
{V3D_ORIENT_PARENT,
"PARENT",
ICON_ORIENTATION_GLOBAL,
"Parent",
"Align the transformation axes to the object's parent space"},
// {V3D_ORIENT_CUSTOM, "CUSTOM", 0, "Custom", "Use a custom transform orientation"}, // {V3D_ORIENT_CUSTOM, "CUSTOM", 0, "Custom", "Use a custom transform orientation"},
{0, NULL, 0, NULL, NULL}, {0, NULL, 0, NULL, NULL},
}; };