From df553892c9d2f034659e328e9286c1cf6a9554d7 Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Tue, 22 Oct 2013 11:36:48 +0000 Subject: [PATCH] Bugfix: Renaming bones now renames the corresponding F-Curves in actions used by Action Constraints --- source/blender/blenkernel/BKE_animsys.h | 4 ++ source/blender/blenkernel/intern/anim_sys.c | 44 +++++++++++++++++++ .../editors/armature/armature_naming.c | 7 +++ .../editors/space_action/action_select.c | 6 +-- 4 files changed, 56 insertions(+), 5 deletions(-) diff --git a/source/blender/blenkernel/BKE_animsys.h b/source/blender/blenkernel/BKE_animsys.h index f0f6b5a2319..a0ec6c7757f 100644 --- a/source/blender/blenkernel/BKE_animsys.h +++ b/source/blender/blenkernel/BKE_animsys.h @@ -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, diff --git a/source/blender/blenkernel/intern/anim_sys.c b/source/blender/blenkernel/intern/anim_sys.c index 74578266c63..d2189468f53 100644 --- a/source/blender/blenkernel/intern/anim_sys.c +++ b/source/blender/blenkernel/intern/anim_sys.c @@ -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 <["><"]> + * 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 <["><"]> * 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); diff --git a/source/blender/editors/armature/armature_naming.c b/source/blender/editors/armature/armature_naming.c index 8745d571a28..2228cb8386e 100644 --- a/source/blender/editors/armature/armature_naming.c +++ b/source/blender/editors/armature/armature_naming.c @@ -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); + } } } diff --git a/source/blender/editors/space_action/action_select.c b/source/blender/editors/space_action/action_select.c index d3fc8ce1d34..d62dd88418f 100644 --- a/source/blender/editors/space_action/action_select.c +++ b/source/blender/editors/space_action/action_select.c @@ -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 */