Revision: 19551
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19551
Author:   aligorith
Date:     2009-04-06 02:04:04 +0200 (Mon, 06 Apr 2009)

Log Message:
-----------
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.

Modified Paths:
--------------
    trunk/blender/source/blender/include/BIF_poseobject.h
    trunk/blender/source/blender/src/header_view3d.c
    trunk/blender/source/blender/src/poseobject.c

Modified: trunk/blender/source/blender/include/BIF_poseobject.h
===================================================================
--- trunk/blender/source/blender/include/BIF_poseobject.h       2009-04-05 
19:37:13 UTC (rev 19550)
+++ trunk/blender/source/blender/include/BIF_poseobject.h       2009-04-06 
00:04:04 UTC (rev 19551)
@@ -80,6 +80,7 @@
 void pose_movetolayer(void);
 void pose_relax(void);
 void pose_flipquats(void);
+void pose_clear_user_transforms(void);
 
 #endif
 

Modified: trunk/blender/source/blender/src/header_view3d.c
===================================================================
--- trunk/blender/source/blender/src/header_view3d.c    2009-04-05 19:37:13 UTC 
(rev 19550)
+++ trunk/blender/source/blender/src/header_view3d.c    2009-04-06 00:04:04 UTC 
(rev 19551)
@@ -4123,8 +4123,6 @@
 
 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 @@
                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);

Modified: trunk/blender/source/blender/src/poseobject.c
===================================================================
--- trunk/blender/source/blender/src/poseobject.c       2009-04-05 19:37:13 UTC 
(rev 19550)
+++ trunk/blender/source/blender/src/poseobject.c       2009-04-06 00:04:04 UTC 
(rev 19551)
@@ -568,9 +568,7 @@
                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 @@
        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");
+}
 


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to