diff options
author | Campbell Barton <ideasman42@gmail.com> | 2014-05-18 18:24:45 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2014-05-18 18:24:45 +0400 |
commit | 193e77cc673e6836525ab1a0bad0ff5491e04d23 (patch) | |
tree | ef97381949b0b9bfd5156158d001d0e0a6c51248 /source/blender/editors/space_action/action_edit.c | |
parent | e8630bdccf545f6945b0f64db588168e69cc91a7 (diff) |
Fix T40201: Keyframe edits fail to update the viewport
Diffstat (limited to 'source/blender/editors/space_action/action_edit.c')
-rw-r--r-- | source/blender/editors/space_action/action_edit.c | 173 |
1 files changed, 84 insertions, 89 deletions
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); |