forked from bartvdbraak/blender
Bugfix: Renaming bones now renames the corresponding F-Curves in actions used by
Action Constraints
This commit is contained in:
parent
4dc9c9639f
commit
df553892c9
@ -104,6 +104,10 @@ void BKE_keyingsets_free(struct ListBase *list);
|
||||
/* ************************************* */
|
||||
/* Path Fixing API */
|
||||
|
||||
/* Fix all the paths for the the given ID + Action */
|
||||
void BKE_action_fix_paths_rename(struct ID *owner_id, struct bAction *act, const char *prefix, const char *oldName,
|
||||
const char *newName, int oldSubscript, int newSubscript, int verify_paths);
|
||||
|
||||
/* Fix all the paths for the given ID+AnimData */
|
||||
void BKE_animdata_fix_paths_rename(struct ID *owner_id, struct AnimData *adt, struct ID *ref_id, const char *prefix,
|
||||
const char *oldName, const char *newName, int oldSubscript, int newSubscript,
|
||||
|
@ -711,6 +711,49 @@ static void nlastrips_path_rename_fix(ID *owner_id, const char *prefix, const ch
|
||||
}
|
||||
}
|
||||
|
||||
/* Fix all RNA_Paths in the given Action, relative to the given ID block
|
||||
*
|
||||
* This is just an external wrapper for the F-Curve fixing function,
|
||||
* with input validity checks on top of the basic method.
|
||||
*
|
||||
* NOTE: it is assumed that the structure we're replacing is <prefix><["><name><"]>
|
||||
* i.e. pose.bones["Bone"]
|
||||
*/
|
||||
void BKE_action_fix_paths_rename(ID *owner_id, bAction *act, const char *prefix, const char *oldName,
|
||||
const char *newName, int oldSubscript, int newSubscript, int verify_paths)
|
||||
{
|
||||
char *oldN, *newN;
|
||||
|
||||
/* if no action, no need to proceed */
|
||||
if (ELEM(NULL, owner_id, act))
|
||||
return;
|
||||
|
||||
/* Name sanitation logic - copied from BKE_animdata_fix_paths_rename() */
|
||||
if ((oldName != NULL) && (newName != NULL)) {
|
||||
/* pad the names with [" "] so that only exact matches are made */
|
||||
const size_t name_old_len = strlen(oldName);
|
||||
const size_t name_new_len = strlen(newName);
|
||||
char *name_old_esc = BLI_array_alloca(name_old_esc, (name_old_len * 2) + 1);
|
||||
char *name_new_esc = BLI_array_alloca(name_new_esc, (name_new_len * 2) + 1);
|
||||
|
||||
BLI_strescape(name_old_esc, oldName, (name_old_len * 2) + 1);
|
||||
BLI_strescape(name_new_esc, newName, (name_new_len * 2) + 1);
|
||||
oldN = BLI_sprintfN("[\"%s\"]", name_old_esc);
|
||||
newN = BLI_sprintfN("[\"%s\"]", name_new_esc);
|
||||
}
|
||||
else {
|
||||
oldN = BLI_sprintfN("[%d]", oldSubscript);
|
||||
newN = BLI_sprintfN("[%d]", newSubscript);
|
||||
}
|
||||
|
||||
/* fix paths in action */
|
||||
fcurves_path_rename_fix(owner_id, prefix, oldName, newName, oldN, newN, &act->curves, verify_paths);
|
||||
|
||||
/* free the temp names */
|
||||
MEM_freeN(oldN);
|
||||
MEM_freeN(newN);
|
||||
}
|
||||
|
||||
/* Fix all RNA-Paths in the AnimData block used by the given ID block
|
||||
* NOTE: it is assumed that the structure we're replacing is <prefix><["><name><"]>
|
||||
* i.e. pose.bones["Bone"]
|
||||
@ -725,6 +768,7 @@ void BKE_animdata_fix_paths_rename(ID *owner_id, AnimData *adt, ID *ref_id, cons
|
||||
if (ELEM(NULL, owner_id, adt))
|
||||
return;
|
||||
|
||||
/* Name sanitation logic - shared with BKE_action_fix_paths_rename() */
|
||||
if ((oldName != NULL) && (newName != NULL)) {
|
||||
/* pad the names with [" "] so that only exact matches are made */
|
||||
const size_t name_old_len = strlen(oldName);
|
||||
|
@ -113,6 +113,7 @@ static void constraint_bone_name_fix(Object *ob, ListBase *conlist, const char *
|
||||
bConstraintTypeInfo *cti = BKE_constraint_get_typeinfo(curcon);
|
||||
ListBase targets = {NULL, NULL};
|
||||
|
||||
/* constraint targets */
|
||||
if (cti && cti->get_constraint_targets) {
|
||||
cti->get_constraint_targets(curcon, &targets);
|
||||
|
||||
@ -126,6 +127,12 @@ static void constraint_bone_name_fix(Object *ob, ListBase *conlist, const char *
|
||||
if (cti->flush_constraint_targets)
|
||||
cti->flush_constraint_targets(curcon, &targets, 0);
|
||||
}
|
||||
|
||||
/* action constraints */
|
||||
if (curcon->type == CONSTRAINT_TYPE_ACTION) {
|
||||
bActionConstraint *actcon = (bActionConstraint *)curcon->data;
|
||||
BKE_action_fix_paths_rename(&ob->id, actcon->act, "pose.bones", oldname, newname, 0, 0, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1037,8 +1037,6 @@ static void actkeys_mselect_channel_only(bAnimContext *ac, bAnimListElem *ale, s
|
||||
{
|
||||
KeyframeEditFunc select_cb;
|
||||
|
||||
printf("select all in channel - %d\n", select_mode);
|
||||
|
||||
/* get functions for selecting keyframes */
|
||||
select_cb = ANIM_editkeyframes_select(select_mode);
|
||||
|
||||
@ -1071,8 +1069,7 @@ static void actkeys_mselect_channel_only(bAnimContext *ac, bAnimListElem *ale, s
|
||||
BLI_freelistN(&anim_data);
|
||||
}
|
||||
else {
|
||||
int res = ANIM_animchannel_keyframes_loop(NULL, ac->ads, ale, NULL, select_cb, NULL);
|
||||
printf("\tresult = %d\n", res);
|
||||
ANIM_animchannel_keyframes_loop(NULL, ac->ads, ale, NULL, select_cb, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1204,7 +1201,6 @@ static void mouse_action_keys(bAnimContext *ac, const int mval[2], short select_
|
||||
/* for replacing selection, firstly need to clear existing selection */
|
||||
if (select_mode == SELECT_REPLACE) {
|
||||
/* reset selection mode for next steps */
|
||||
printf("selectmode = replace\n");
|
||||
select_mode = SELECT_ADD;
|
||||
|
||||
/* deselect all keyframes */
|
||||
|
Loading…
Reference in New Issue
Block a user