Revision: 28070
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28070
Author:   aligorith
Date:     2010-04-07 13:27:59 +0200 (Wed, 07 Apr 2010)

Log Message:
-----------
Auto Keyframing:

Made 'PoseLib', 'Pose Paste', and 'Transforms' use the active KeyingSet instead 
of a hardcoded one if there is an active KeyingSet and the 'Only Insert for 
Keying Set' option is enabled in the User Prefs.

Also, made sure that for transforms, the active KeyingSet is provided with the 
data being modified instead of having them retrieve this from the context 
(which may miss a few items).

---

While making the changes for pose paste, made pasting poses not destroy the 
existing properties on the bones if the buffer bones didn't have any properties 
to replace the old ones with. IMO, this seems a bit too destructive if they 
don't get replaced, but perhaps in some cases not removing causes some problems 
with bad poses? 

Modified Paths:
--------------
    trunk/blender/source/blender/editors/armature/poselib.c
    trunk/blender/source/blender/editors/armature/poseobject.c
    trunk/blender/source/blender/editors/transform/transform_conversions.c

Modified: trunk/blender/source/blender/editors/armature/poselib.c
===================================================================
--- trunk/blender/source/blender/editors/armature/poselib.c     2010-04-07 
10:26:53 UTC (rev 28069)
+++ trunk/blender/source/blender/editors/armature/poselib.c     2010-04-07 
11:27:59 UTC (rev 28070)
@@ -769,12 +769,19 @@
                        if (pchan) {
                                if (autokeyframe_cfra_can_key(scene, 
&pld->ob->id)) {
                                        ListBase dsources = {NULL, NULL};
+                                       KeyingSet *ks = NULL;
                                        
-                                       /* get KeyingSet to use */
-                                       // TODO: for getting the KeyingSet 
used, we should really check which channels were affected
-                                       // TODO: this should get modified so 
that custom props are taken into account too!
+                                       /* get KeyingSet to use 
+                                        *      - use the active KeyingSet if 
defined (and user wants to use it for all autokeying), 
+                                        *        or otherwise key transforms 
only
+                                        */
                                        if (poselib_ks_locrotscale == NULL)
                                                poselib_ks_locrotscale= 
ANIM_builtin_keyingset_get_named(NULL, "LocRotScale");
+                                        
+                                       if (IS_AUTOKEY_FLAG(ONLYKEYINGSET) && 
(scene->active_keyingset))
+                                               ks = 
ANIM_scene_get_active_keyingset(scene);
+                                       else 
+                                               ks = 
ANIM_builtin_keyingset_get_named(NULL, "LocRotScale");
                                        
                                        /* now insert the keyframe(s) using the 
Keying Set
                                         *      1) add datasource override for 
the PoseChannel
@@ -782,7 +789,7 @@
                                         *      3) free the extra info 
                                         */
                                        
ANIM_relative_keyingset_add_source(&dsources, &pld->ob->id, &RNA_PoseBone, 
pchan); 
-                                       ANIM_apply_keyingset(C, &dsources, 
NULL, poselib_ks_locrotscale, MODIFYKEY_MODE_INSERT, (float)CFRA);
+                                       ANIM_apply_keyingset(C, &dsources, 
NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA);
                                        BLI_freelistN(&dsources);
                                        
                                        /* clear any unkeyed tags */

Modified: trunk/blender/source/blender/editors/armature/poseobject.c
===================================================================
--- trunk/blender/source/blender/editors/armature/poseobject.c  2010-04-07 
10:26:53 UTC (rev 28069)
+++ trunk/blender/source/blender/editors/armature/poseobject.c  2010-04-07 
11:27:59 UTC (rev 28070)
@@ -892,9 +892,6 @@
 
 /* ---- */
 
-/* Pointers to the builtin KeyingSets that we want to use */
-static KeyingSet *posePaste_ks_locrotscale = NULL;             /* the only 
keyingset we'll need */
-
 static int pose_paste_exec (bContext *C, wmOperator *op)
 {
        Scene *scene= CTX_data_scene(C);
@@ -937,6 +934,10 @@
                                        if (pchan->rotmode > 0) {
                                                VECCOPY(pchan->eul, chan->eul);
                                        }
+                                       else if (pchan->rotmode == 
ROT_MODE_AXISANGLE) {
+                                               VECCOPY(pchan->rotAxis, 
chan->rotAxis);
+                                               pchan->rotAngle = 
chan->rotAngle;
+                                       }
                                        else {
                                                QUATCOPY(pchan->quat, 
chan->quat);
                                        }
@@ -979,13 +980,6 @@
                                                eul[1]*= -1;
                                                eul[2]*= -1;
                                                
eulO_to_axis_angle(pchan->rotAxis, &pchan->rotAngle, eul, EULER_ORDER_DEFAULT);
-                                               
-                                               // experimental method 
(uncomment to test):
-#if 0
-                                               /* experimental method: just 
flip the orientation of the axis on x/y axes */
-                                               pchan->quat[1] *= -1;
-                                               pchan->quat[2] *= -1;
-#endif
                                        }
                                        else {
                                                float eul[3];
@@ -997,25 +991,36 @@
                                        }
                                }
                                
-                               /* ID property */
-                               if (pchan->prop) {
-                                       IDP_FreeProperty(pchan->prop);
-                                       MEM_freeN(pchan->prop);
-                                       pchan->prop= NULL;
+                               /* ID properties 
+                                *      - only free the existing properties if 
the channel we're copying from has them
+                                *        NOTE: this means that if the pose 
depends on some pchan property, the pose may not be ok,
+                                *                  but this is better than 
loosing all the setting you've painstakingly added...
+                                */
+                               if (chan->prop) {
+                                       /* free the old properties since we 
want to replace them now */
+                                       if (pchan->prop) {
+                                               IDP_FreeProperty(pchan->prop);
+                                               MEM_freeN(pchan->prop);
+                                               pchan->prop= NULL;
+                                       }
+                                       
+                                       /* now copy over the new copy of the 
properties */
+                                       pchan->prop= 
IDP_CopyProperty(chan->prop);      
                                }
                                
-                               if (chan->prop)
-                                       pchan->prop= 
IDP_CopyProperty(chan->prop);
-                               
                                /* keyframing tagging */
-                               if (autokeyframe_cfra_can_key(scene, &ob->id)) 
{        
+                               if (autokeyframe_cfra_can_key(scene, &ob->id)) {
                                        ListBase dsources = {NULL, NULL};
+                                       KeyingSet *ks = NULL;
                                        
-                                       /* get KeyingSet to use */
-                                       // TODO: for getting the KeyingSet 
used, we should really check which channels were affected
-                                       // TODO: this should get modified so 
that custom props are taken into account too!
-                                       if (posePaste_ks_locrotscale == NULL)
-                                               posePaste_ks_locrotscale= 
ANIM_builtin_keyingset_get_named(NULL, "LocRotScale");
+                                       /* get KeyingSet to use 
+                                        *      - use the active KeyingSet if 
defined (and user wants to use it for all autokeying), 
+                                        *        or otherwise key transforms 
only
+                                        */
+                                       if (IS_AUTOKEY_FLAG(ONLYKEYINGSET) && 
(scene->active_keyingset))
+                                               ks = 
ANIM_scene_get_active_keyingset(scene);
+                                       else 
+                                               ks = 
ANIM_builtin_keyingset_get_named(NULL, "LocRotScale");
                                        
                                        /* now insert the keyframe(s) using the 
Keying Set
                                         *      1) add datasource override for 
the PoseChannel
@@ -1023,7 +1028,7 @@
                                         *      3) free the extra info 
                                         */
                                        
ANIM_relative_keyingset_add_source(&dsources, &ob->id, &RNA_PoseBone, pchan); 
-                                       ANIM_apply_keyingset(C, &dsources, 
NULL, posePaste_ks_locrotscale, MODIFYKEY_MODE_INSERT, (float)CFRA);
+                                       ANIM_apply_keyingset(C, &dsources, 
NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA);
                                        BLI_freelistN(&dsources);
                                        
                                        /* clear any unkeyed tags */

Modified: trunk/blender/source/blender/editors/transform/transform_conversions.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_conversions.c      
2010-04-07 10:26:53 UTC (rev 28069)
+++ trunk/blender/source/blender/editors/transform/transform_conversions.c      
2010-04-07 11:27:59 UTC (rev 28070)
@@ -4451,7 +4451,7 @@
                        /* only insert into active keyingset 
                         * NOTE: we assume here that the active Keying Set does 
not need to have its iterator overridden spe
                         */
-                       ANIM_apply_keyingset(C, NULL, NULL, active_ks, 
MODIFYKEY_MODE_INSERT, cfra);
+                       ANIM_apply_keyingset(C, &dsources, NULL, active_ks, 
MODIFYKEY_MODE_INSERT, cfra);
                }
                else if (IS_AUTOKEY_FLAG(INSERTAVAIL)) {
                        AnimData *adt= ob->adt;
@@ -4560,9 +4560,9 @@
                                ANIM_relative_keyingset_add_source(&dsources, 
id, &RNA_PoseBone, pchan); 
                                
                                /* only insert into active keyingset? */
-                               // TODO: move this first case out of the loop
                                if (IS_AUTOKEY_FLAG(ONLYKEYINGSET) && 
(active_ks)) {
-                                       ANIM_apply_keyingset(C, NULL, NULL, 
active_ks, MODIFYKEY_MODE_INSERT, cfra);
+                                       /* run the active Keying Set on the 
current datasource */
+                                       ANIM_apply_keyingset(C, &dsources, 
NULL, active_ks, MODIFYKEY_MODE_INSERT, cfra);
                                }
                                /* only insert into available channels? */
                                else if (IS_AUTOKEY_FLAG(INSERTAVAIL)) {


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

Reply via email to