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?
This commit is contained in:
Joshua Leung 2010-04-07 11:27:59 +00:00
parent e81c198e9a
commit 8bf6e2d09c
3 changed files with 44 additions and 32 deletions

@ -769,12 +769,19 @@ static void poselib_keytag_pose (bContext *C, Scene *scene, tPoseLib_PreviewData
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 @@ static void poselib_keytag_pose (bContext *C, Scene *scene, tPoseLib_PreviewData
* 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 */

@ -892,9 +892,6 @@ void POSE_OT_copy (wmOperatorType *ot)
/* ---- */
/* 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 @@ static int pose_paste_exec (bContext *C, wmOperator *op)
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 @@ static int pose_paste_exec (bContext *C, wmOperator *op)
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 @@ static int pose_paste_exec (bContext *C, wmOperator *op)
}
}
/* 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 @@ static int pose_paste_exec (bContext *C, wmOperator *op)
* 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 */

@ -4451,7 +4451,7 @@ void autokeyframe_ob_cb_func(bContext *C, Scene *scene, View3D *v3d, Object *ob,
/* 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 @@ void autokeyframe_pose_cb_func(bContext *C, Scene *scene, View3D *v3d, Object *o
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)) {