Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2014-05-18 18:24:45 +0400
committerCampbell Barton <ideasman42@gmail.com>2014-05-18 18:24:45 +0400
commit193e77cc673e6836525ab1a0bad0ff5491e04d23 (patch)
treeef97381949b0b9bfd5156158d001d0e0a6c51248 /source/blender/editors/space_action
parente8630bdccf545f6945b0f64db588168e69cc91a7 (diff)
Fix T40201: Keyframe edits fail to update the viewport
Diffstat (limited to 'source/blender/editors/space_action')
-rw-r--r--source/blender/editors/space_action/action_draw.c4
-rw-r--r--source/blender/editors/space_action/action_edit.c173
-rw-r--r--source/blender/editors/space_action/action_select.c26
3 files changed, 99 insertions, 104 deletions
diff --git a/source/blender/editors/space_action/action_draw.c b/source/blender/editors/space_action/action_draw.c
index f15bbe0d2f1..b2e55085579 100644
--- a/source/blender/editors/space_action/action_draw.c
+++ b/source/blender/editors/space_action/action_draw.c
@@ -139,7 +139,7 @@ void draw_channel_names(bContext *C, bAnimContext *ac, ARegion *ar)
}
/* free tempolary channels */
- BLI_freelistN(&anim_data);
+ ANIM_animdata_freelist(&anim_data);
}
/* ************************************************************************* */
@@ -346,7 +346,7 @@ void draw_channel_strips(bAnimContext *ac, SpaceAction *saction, ARegion *ar)
}
/* free tempolary channels used for drawing */
- BLI_freelistN(&anim_data);
+ ANIM_animdata_freelist(&anim_data);
/* black line marking 'current frame' for Time-Slide transform mode */
if (saction->flag & SACTION_MOVING) {
diff --git a/source/blender/editors/space_action/action_edit.c b/source/blender/editors/space_action/action_edit.c
index 92e727fc2d7..3bc3c7f7b73 100644
--- a/source/blender/editors/space_action/action_edit.c
+++ b/source/blender/editors/space_action/action_edit.c
@@ -299,7 +299,7 @@ static bool get_keyframe_extents(bAnimContext *ac, float *min, float *max, const
}
/* free memory */
- BLI_freelistN(&anim_data);
+ ANIM_animdata_freelist(&anim_data);
}
else {
/* set default range */
@@ -410,7 +410,7 @@ static bool actkeys_channels_get_selected_extents(bAnimContext *ac, float *min,
}
/* free all temp data */
- BLI_freelistN(&anim_data);
+ ANIM_animdata_freelist(&anim_data);
return (found != 0);
}
@@ -536,7 +536,7 @@ static short copy_action_keys(bAnimContext *ac)
ok = copy_animedit_keys(ac, &anim_data);
/* clean up */
- BLI_freelistN(&anim_data);
+ ANIM_animdata_freelist(&anim_data);
return ok;
}
@@ -561,9 +561,9 @@ static short paste_action_keys(bAnimContext *ac,
/* paste keyframes */
ok = paste_animedit_keys(ac, &anim_data, offset_mode, merge_mode);
-
+
/* clean up */
- BLI_freelistN(&anim_data);
+ ANIM_animdata_freelist(&anim_data);
return ok;
}
@@ -640,10 +640,7 @@ static int actkeys_paste_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
}
-
- /* validate keyframes after editing */
- ANIM_editkeyframes_refresh(&ac);
-
+
/* set notifier that keyframes have changed */
WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, NULL);
@@ -718,9 +715,12 @@ static void insert_action_keys(bAnimContext *ac, short mode)
insert_keyframe(reports, ale->id, NULL, ((fcu->grp) ? (fcu->grp->name) : (NULL)), fcu->rna_path, fcu->array_index, cfra, flag);
else
insert_vert_fcurve(fcu, cfra, fcu->curval, 0);
+
+ ale->update |= ANIM_UPDATE_DEFAULT;
}
-
- BLI_freelistN(&anim_data);
+
+ ANIM_animdata_update(ac, &anim_data);
+ ANIM_animdata_freelist(&anim_data);
}
/* ------------------- */
@@ -741,10 +741,7 @@ static int actkeys_insertkey_exec(bContext *C, wmOperator *op)
/* insert keyframes */
insert_action_keys(&ac, mode);
-
- /* validate keyframes after editing */
- ANIM_editkeyframes_refresh(&ac);
-
+
/* set notifier that keyframes have changed */
WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_ADDED, NULL);
@@ -795,10 +792,12 @@ static void duplicate_action_keys(bAnimContext *ac)
ED_masklayer_frames_duplicate((MaskLayer *)ale->data);
else
BLI_assert(0);
+
+ ale->update |= ANIM_UPDATE_DEFAULT;
}
-
- /* free filtered list */
- BLI_freelistN(&anim_data);
+
+ ANIM_animdata_update(ac, &anim_data);
+ ANIM_animdata_freelist(&anim_data);
}
/* ------------------- */
@@ -813,11 +812,7 @@ static int actkeys_duplicate_exec(bContext *C, wmOperator *UNUSED(op))
/* duplicate keyframes */
duplicate_action_keys(&ac);
-
- /* validate keyframes after editing */
- if (!ELEM(ac.datatype, ANIMCONT_GPENCIL, ANIMCONT_MASK))
- ANIM_editkeyframes_refresh(&ac);
-
+
/* set notifier that keyframes have changed */
WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_ADDED, NULL);
@@ -854,40 +849,47 @@ static bool delete_action_keys(bAnimContext *ac)
ListBase anim_data = {NULL, NULL};
bAnimListElem *ale;
int filter;
- bool changed = false;
-
+ bool changed_final = false;
+
/* filter data */
if (ELEM(ac->datatype, ANIMCONT_GPENCIL, ANIMCONT_MASK))
filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_NODUPLIS);
else
filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT /*| ANIMFILTER_CURVESONLY*/ | ANIMFILTER_NODUPLIS);
ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
-
+
/* loop through filtered data and delete selected keys */
for (ale = anim_data.first; ale; ale = ale->next) {
+ bool changed = false;
+
if (ale->type == ANIMTYPE_GPLAYER) {
- changed |= ED_gplayer_frames_delete((bGPDlayer *)ale->data);
+ changed = ED_gplayer_frames_delete((bGPDlayer *)ale->data);
}
else if (ale->type == ANIMTYPE_MASKLAYER) {
- changed |= ED_masklayer_frames_delete((MaskLayer *)ale->data);
+ changed = ED_masklayer_frames_delete((MaskLayer *)ale->data);
}
else {
FCurve *fcu = (FCurve *)ale->key_data;
AnimData *adt = ale->adt;
/* delete selected keyframes only */
- changed |= delete_fcurve_keys(fcu);
+ changed = delete_fcurve_keys(fcu);
/* Only delete curve too if it won't be doing anything anymore */
if ((fcu->totvert == 0) && (list_has_suitable_fmodifier(&fcu->modifiers, 0, FMI_TYPE_GENERATE_CURVE) == 0))
ANIM_fcurve_delete_from_animdata(ac, adt, fcu);
}
+
+ if (changed) {
+ ale->update |= ANIM_UPDATE_DEFAULT;
+ changed_final = true;
+ }
}
-
- /* free filtered list */
- BLI_freelistN(&anim_data);
- return changed;
+ ANIM_animdata_update(ac, &anim_data);
+ ANIM_animdata_freelist(&anim_data);
+
+ return changed_final;
}
/* ------------------- */
@@ -904,10 +906,6 @@ static int actkeys_delete_exec(bContext *C, wmOperator *UNUSED(op))
if (!delete_action_keys(&ac))
return OPERATOR_CANCELLED;
- /* validate keyframes after editing */
- if (!ELEM(ac.datatype, ANIMCONT_GPENCIL, ANIMCONT_MASK))
- ANIM_editkeyframes_refresh(&ac);
-
/* set notifier that keyframes have changed */
WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_REMOVED, NULL);
@@ -943,11 +941,14 @@ static void clean_action_keys(bAnimContext *ac, float thresh)
ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
/* loop through filtered data and clean curves */
- for (ale = anim_data.first; ale; ale = ale->next)
+ for (ale = anim_data.first; ale; ale = ale->next) {
clean_fcurve((FCurve *)ale->key_data, thresh);
-
- /* free temp data */
- BLI_freelistN(&anim_data);
+
+ ale->update |= ANIM_UPDATE_DEFAULT;
+ }
+
+ ANIM_animdata_update(ac, &anim_data);
+ ANIM_animdata_freelist(&anim_data);
}
/* ------------------- */
@@ -969,9 +970,6 @@ static int actkeys_clean_exec(bContext *C, wmOperator *op)
/* clean keyframes */
clean_action_keys(&ac, thresh);
- /* validate keyframes after editing */
- ANIM_editkeyframes_refresh(&ac);
-
/* set notifier that keyframes have changed */
WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, NULL);
@@ -1011,11 +1009,14 @@ static void sample_action_keys(bAnimContext *ac)
ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
/* loop through filtered data and add keys between selected keyframes on every frame */
- for (ale = anim_data.first; ale; ale = ale->next)
+ for (ale = anim_data.first; ale; ale = ale->next) {
sample_fcurve((FCurve *)ale->key_data);
-
- /* admin and redraws */
- BLI_freelistN(&anim_data);
+
+ ale->update |= ANIM_UPDATE_DEPS;
+ }
+
+ ANIM_animdata_update(ac, &anim_data);
+ ANIM_animdata_freelist(&anim_data);
}
/* ------------------- */
@@ -1033,9 +1034,6 @@ static int actkeys_sample_exec(bContext *C, wmOperator *UNUSED(op))
/* sample keyframes */
sample_action_keys(&ac);
- /* validate keyframes after editing */
- ANIM_editkeyframes_refresh(&ac);
-
/* set notifier that keyframes have changed */
WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, NULL);
@@ -1118,10 +1116,12 @@ static void setexpo_action_keys(bAnimContext *ac, short mode)
}
}
}
+
+ ale->update |= ANIM_UPDATE_DEFAULT;
}
-
- /* cleanup */
- BLI_freelistN(&anim_data);
+
+ ANIM_animdata_update(ac, &anim_data);
+ ANIM_animdata_freelist(&anim_data);
}
/* ------------------- */
@@ -1143,9 +1143,6 @@ static int actkeys_expo_exec(bContext *C, wmOperator *op)
/* set handle type */
setexpo_action_keys(&ac, mode);
- /* validate keyframes after editing */
- ANIM_editkeyframes_refresh(&ac);
-
/* set notifier that keyframe properties have changed */
WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME_PROP, NULL);
@@ -1188,11 +1185,14 @@ static void setipo_action_keys(bAnimContext *ac, short mode)
/* loop through setting BezTriple interpolation
* Note: we do not supply KeyframeEditData to the looper yet. Currently that's not necessary here...
*/
- for (ale = anim_data.first; ale; ale = ale->next)
+ for (ale = anim_data.first; ale; ale = ale->next) {
ANIM_fcurve_keyframes_loop(NULL, ale->key_data, NULL, set_cb, calchandles_fcurve);
-
- /* cleanup */
- BLI_freelistN(&anim_data);
+
+ ale->update |= ANIM_UPDATE_DEFAULT;
+ }
+
+ ANIM_animdata_update(ac, &anim_data);
+ ANIM_animdata_freelist(&anim_data);
}
/* ------------------- */
@@ -1214,9 +1214,6 @@ static int actkeys_ipo_exec(bContext *C, wmOperator *op)
/* set handle type */
setipo_action_keys(&ac, mode);
- /* validate keyframes after editing */
- ANIM_editkeyframes_refresh(&ac);
-
/* set notifier that keyframe properties have changed */
WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME_PROP, NULL);
@@ -1268,11 +1265,13 @@ static void sethandles_action_keys(bAnimContext *ac, short mode)
if (ANIM_fcurve_keyframes_loop(NULL, fcu, NULL, sel_cb, NULL)) {
/* change type of selected handles */
ANIM_fcurve_keyframes_loop(NULL, fcu, NULL, edit_cb, calchandles_fcurve);
+
+ ale->update |= ANIM_UPDATE_DEFAULT;
}
}
-
- /* cleanup */
- BLI_freelistN(&anim_data);
+
+ ANIM_animdata_update(ac, &anim_data);
+ ANIM_animdata_freelist(&anim_data);
}
/* ------------------- */
@@ -1294,9 +1293,6 @@ static int actkeys_handletype_exec(bContext *C, wmOperator *op)
/* set handle type */
sethandles_action_keys(&ac, mode);
- /* validate keyframes after editing */
- ANIM_editkeyframes_refresh(&ac);
-
/* set notifier that keyframe properties have changed */
WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME_PROP, NULL);
@@ -1339,11 +1335,14 @@ static void setkeytype_action_keys(bAnimContext *ac, short mode)
/* loop through setting BezTriple interpolation
* Note: we do not supply KeyframeEditData to the looper yet. Currently that's not necessary here...
*/
- for (ale = anim_data.first; ale; ale = ale->next)
+ for (ale = anim_data.first; ale; ale = ale->next) {
ANIM_fcurve_keyframes_loop(NULL, ale->key_data, NULL, set_cb, NULL);
-
- /* cleanup */
- BLI_freelistN(&anim_data);
+
+ ale->update |= ANIM_UPDATE_DEPS | ANIM_UPDATE_HANDLES;
+ }
+
+ ANIM_animdata_update(ac, &anim_data);
+ ANIM_animdata_freelist(&anim_data);
}
/* ------------------- */
@@ -1365,9 +1364,6 @@ static int actkeys_keytype_exec(bContext *C, wmOperator *op)
/* set handle type */
setkeytype_action_keys(&ac, mode);
- /* validate keyframes after editing */
- ANIM_editkeyframes_refresh(&ac);
-
/* set notifier that keyframe properties have changed */
WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME_PROP, NULL);
@@ -1436,7 +1432,7 @@ static int actkeys_framejump_exec(bContext *C, wmOperator *UNUSED(op))
ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, bezt_calc_average, NULL);
}
- BLI_freelistN(&anim_data);
+ ANIM_animdata_freelist(&anim_data);
/* set the new current frame value, based on the average time */
if (ked.i1) {
@@ -1525,9 +1521,12 @@ static void snap_action_keys(bAnimContext *ac, short mode)
else {
ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, edit_cb, calchandles_fcurve);
}
+
+ ale->update |= ANIM_UPDATE_DEFAULT;
}
-
- BLI_freelistN(&anim_data);
+
+ ANIM_animdata_update(ac, &anim_data);
+ ANIM_animdata_freelist(&anim_data);
}
/* ------------------- */
@@ -1547,10 +1546,6 @@ static int actkeys_snap_exec(bContext *C, wmOperator *op)
/* snap keyframes */
snap_action_keys(&ac, mode);
- /* validate keyframes after editing */
- if (!ELEM(ac.datatype, ANIMCONT_GPENCIL, ANIMCONT_MASK))
- ANIM_editkeyframes_refresh(&ac);
-
/* set notifier that keyframes have changed */
WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, NULL);
@@ -1635,9 +1630,12 @@ static void mirror_action_keys(bAnimContext *ac, short mode)
// snap_gplayer_frames(ale->data, mode);
else
ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, edit_cb, calchandles_fcurve);
+
+ ale->update |= ANIM_UPDATE_DEFAULT;
}
-
- BLI_freelistN(&anim_data);
+
+ ANIM_animdata_update(ac, &anim_data);
+ ANIM_animdata_freelist(&anim_data);
}
/* ------------------- */
@@ -1661,9 +1659,6 @@ static int actkeys_mirror_exec(bContext *C, wmOperator *op)
/* mirror keyframes */
mirror_action_keys(&ac, mode);
- /* validate keyframes after editing */
- ANIM_editkeyframes_refresh(&ac);
-
/* set notifier that keyframes have changed */
WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, NULL);
diff --git a/source/blender/editors/space_action/action_select.c b/source/blender/editors/space_action/action_select.c
index 1e89b304279..cf18cffefb6 100644
--- a/source/blender/editors/space_action/action_select.c
+++ b/source/blender/editors/space_action/action_select.c
@@ -142,7 +142,7 @@ static void deselect_action_keys(bAnimContext *ac, short test, short sel)
}
/* Cleanup */
- BLI_freelistN(&anim_data);
+ ANIM_animdata_freelist(&anim_data);
}
/* ------------------- */
@@ -294,7 +294,7 @@ static void borderselect_action(bAnimContext *ac, const rcti rect, short mode, s
}
/* cleanup */
- BLI_freelistN(&anim_data);
+ ANIM_animdata_freelist(&anim_data);
}
/* ------------------- */
@@ -442,7 +442,7 @@ static void markers_selectkeys_between(bAnimContext *ac)
}
/* Cleanup */
- BLI_freelistN(&anim_data);
+ ANIM_animdata_freelist(&anim_data);
}
@@ -477,7 +477,7 @@ static void columnselect_action_keys(bAnimContext *ac, short mode)
for (ale = anim_data.first; ale; ale = ale->next)
ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, bezt_to_cfraelem, NULL);
}
- BLI_freelistN(&anim_data);
+ ANIM_animdata_freelist(&anim_data);
break;
case ACTKEYS_COLUMNSEL_CFRA: /* current frame */
@@ -534,7 +534,7 @@ static void columnselect_action_keys(bAnimContext *ac, short mode)
/* free elements */
BLI_freelistN(&ked.list);
- BLI_freelistN(&anim_data);
+ ANIM_animdata_freelist(&anim_data);
}
/* ------------------- */
@@ -612,7 +612,7 @@ static int actkeys_select_linked_exec(bContext *C, wmOperator *UNUSED(op))
}
/* Cleanup */
- BLI_freelistN(&anim_data);
+ ANIM_animdata_freelist(&anim_data);
/* set notifier that keyframe selection has changed */
WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_SELECTED, NULL);
@@ -675,7 +675,7 @@ static void select_moreless_action_keys(bAnimContext *ac, short mode)
}
/* Cleanup */
- BLI_freelistN(&anim_data);
+ ANIM_animdata_freelist(&anim_data);
}
/* ----------------- */
@@ -838,7 +838,7 @@ static void actkeys_select_leftright(bAnimContext *ac, short leftright, short se
}
/* Cleanup */
- BLI_freelistN(&anim_data);
+ ANIM_animdata_freelist(&anim_data);
}
/* ----------------- */
@@ -975,7 +975,7 @@ static void actkeys_mselect_single(bAnimContext *ac, bAnimListElem *ale, short s
}
}
- BLI_freelistN(&anim_data);
+ ANIM_animdata_freelist(&anim_data);
}
else {
ANIM_animchannel_keyframes_loop(&ked, ac->ads, ale, ok_cb, select_cb, NULL);
@@ -1029,7 +1029,7 @@ static void actkeys_mselect_column(bAnimContext *ac, short select_mode, float se
/* free elements */
BLI_freelistN(&ked.list);
- BLI_freelistN(&anim_data);
+ ANIM_animdata_freelist(&anim_data);
}
/* option 4) select all keyframes in same channel */
@@ -1066,7 +1066,7 @@ static void actkeys_mselect_channel_only(bAnimContext *ac, bAnimListElem *ale, s
}
}
- BLI_freelistN(&anim_data);
+ ANIM_animdata_freelist(&anim_data);
}
else {
ANIM_animchannel_keyframes_loop(NULL, ac->ads, ale, NULL, select_cb, NULL);
@@ -1112,7 +1112,7 @@ static void mouse_action_keys(bAnimContext *ac, const int mval[2], short select_
if (ale == NULL) {
/* channel not found */
printf("Error: animation channel (index = %d) not found in mouse_action_keys()\n", channel_index);
- BLI_freelistN(&anim_data);
+ ANIM_animdata_freelist(&anim_data);
return;
}
else {
@@ -1195,7 +1195,7 @@ static void mouse_action_keys(bAnimContext *ac, const int mval[2], short select_
BLI_dlrbTree_free(&anim_keys);
/* free list of channels, since it's not used anymore */
- BLI_freelistN(&anim_data);
+ ANIM_animdata_freelist(&anim_data);
}
/* for replacing selection, firstly need to clear existing selection */