From 9a1e1912e173262436598efe62f4ff0134ea04a7 Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Mon, 6 Apr 2009 00:04:04 +0000 Subject: [PATCH] 2.4x Bugfix - #18188: "Clear user transform" does not work as described For the record, "Clear user transform" is supposed to restore selected bones to the transforms defined by Actions/NLA, not back to rest position. --- source/blender/include/BIF_poseobject.h | 1 + source/blender/src/header_view3d.c | 6 +---- source/blender/src/poseobject.c | 30 ++++++++++++++++++++++--- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/source/blender/include/BIF_poseobject.h b/source/blender/include/BIF_poseobject.h index ab96f7ec03e..ba7ad8c4e77 100644 --- a/source/blender/include/BIF_poseobject.h +++ b/source/blender/include/BIF_poseobject.h @@ -80,6 +80,7 @@ void pose_activate_flipped_bone(void); void pose_movetolayer(void); void pose_relax(void); void pose_flipquats(void); +void pose_clear_user_transforms(void); #endif diff --git a/source/blender/src/header_view3d.c b/source/blender/src/header_view3d.c index 8171fe2e527..6d72e434e67 100644 --- a/source/blender/src/header_view3d.c +++ b/source/blender/src/header_view3d.c @@ -4123,8 +4123,6 @@ static uiBlock *view3d_edit_armaturemenu(void *arg_unused) static void do_view3d_pose_armature_transformmenu(void *arg, int event) { - Object *ob= OBACT; - switch(event) { case 0: /* clear origin */ clear_object('o'); @@ -4139,9 +4137,7 @@ static void do_view3d_pose_armature_transformmenu(void *arg, int event) clear_object('g'); break; case 4: /* clear user transform */ - rest_pose(ob->pose); - DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA); - BIF_undo_push("Pose, Clear User Transform"); + pose_clear_user_transforms(); break; } allqueue(REDRAWVIEW3D, 0); diff --git a/source/blender/src/poseobject.c b/source/blender/src/poseobject.c index c2a2be80e89..c081bcbcb45 100644 --- a/source/blender/src/poseobject.c +++ b/source/blender/src/poseobject.c @@ -568,9 +568,7 @@ void pose_special_editmenu(void) pose_clear_paths(ob); } else if(nr==5) { - rest_pose(ob->pose); - DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA); - BIF_undo_push("Clear User Transform Pose"); + pose_clear_user_transforms(); } else if(nr==6) { pose_relax(); @@ -1740,4 +1738,30 @@ void pose_flipquats(void) autokeyframe_pose_cb_func(ob, TFM_ROTATION, 0); } +/* Restore selected pose-bones to 'action'-defined pose */ +void pose_clear_user_transforms (void) +{ + Object *ob = OBACT; + bArmature *arm= ob->data; + bPoseChannel *pchan; + + if (ob->pose == NULL) + return; + + /* find selected bones */ + for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) { + if (pchan->bone && (pchan->bone->flag & BONE_SELECTED) && (pchan->bone->layer & arm->layer)) { + /* just clear the BONE_UNKEYED flag, allowing this bone to get overwritten by actions again */ + pchan->bone->flag &= ~BONE_UNKEYED; + } + } + + /* clear pose locking flag + * - this will only clear the user-defined pose in the selected bones, where BONE_UNKEYED has been cleared + */ + ob->pose->flag |= POSE_DO_UNLOCK; + + DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA); + BIF_undo_push("Clear User Transform"); +}