Fix T40201: Keyframe edits fail to update the viewport

This commit is contained in:
Campbell Barton 2014-05-19 00:24:45 +10:00
parent e8630bdccf
commit 193e77cc67
Notes: blender-bot 2023-02-14 10:38:55 +01:00
Referenced by issue #40455, Assigning textures in Cycles automatically reassigns textures to other unrelated objects
Referenced by issue #40201, Keyframe edits fail to update the viewport in many places (fix included)
23 changed files with 392 additions and 319 deletions

View File

@ -313,9 +313,8 @@ void BLI_freelist(ListBase *listbase)
free(link);
link = next;
}
listbase->first = NULL;
listbase->last = NULL;
BLI_listbase_clear(listbase);
}
/**
@ -331,9 +330,8 @@ void BLI_freelistN(ListBase *listbase)
MEM_freeN(link);
link = next;
}
listbase->first = NULL;
listbase->last = NULL;
BLI_listbase_clear(listbase);
}

View File

@ -3569,7 +3569,7 @@ static void achannel_setting_flush_widget_cb(bContext *C, void *ale_npoin, void
ANIM_flush_setting_anim_channels(&ac, &anim_data, ale_setting, setting, on);
/* free temp data */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
/* callback for wrapping NLA Track "solo" toggle logic */

View File

@ -184,7 +184,7 @@ void ANIM_set_active_channel(bAnimContext *ac, void *data, short datatype, int f
}
/* clean up */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
/* Deselect all animation channels
@ -373,7 +373,7 @@ void ANIM_deselect_anim_channels(bAnimContext *ac, void *data, short datatype, s
}
/* Cleanup */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
/* ---------------------------- Graph Editor ------------------------------------- */
@ -1177,7 +1177,7 @@ static int animchannels_rearrange_exec(bContext *C, wmOperator *op)
}
/* free temp data */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
/* send notifier that things have changed */
@ -1290,7 +1290,7 @@ static void animchannels_group_channels(bAnimContext *ac, bAnimListElem *adt_ref
}
/* cleanup */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
}
@ -1321,7 +1321,7 @@ static int animchannels_group_exec(bContext *C, wmOperator *op)
}
/* free temp data */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
/* updatss */
WM_event_add_notifier(C, NC_ANIMATION | ND_ANIMCHAN | NA_EDITED, NULL);
@ -1393,7 +1393,7 @@ static int animchannels_ungroup_exec(bContext *C, wmOperator *UNUSED(op))
}
/* cleanup */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
/* updates */
WM_event_add_notifier(C, NC_ANIMATION | ND_ANIMCHAN | NA_EDITED, NULL);
@ -1470,7 +1470,7 @@ static int animchannels_delete_exec(bContext *C, wmOperator *UNUSED(op))
}
/* cleanup */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
/* filter data */
@ -1515,7 +1515,7 @@ static int animchannels_delete_exec(bContext *C, wmOperator *UNUSED(op))
}
/* cleanup */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
/* send notifier that things have changed */
WM_event_add_notifier(C, NC_ANIMATION | ND_ANIMCHAN | NA_EDITED, NULL);
@ -1586,7 +1586,7 @@ static int animchannels_visibility_set_exec(bContext *C, wmOperator *UNUSED(op))
ANIM_flush_setting_anim_channels(&ac, &all_data, ale, ACHANNEL_SETTING_VISIBLE, 0);
}
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
/* make all the selected channels visible */
filter = (ANIMFILTER_SEL | ANIMFILTER_NODUPLIS);
@ -1605,7 +1605,7 @@ static int animchannels_visibility_set_exec(bContext *C, wmOperator *UNUSED(op))
ANIM_flush_setting_anim_channels(&ac, &all_data, ale, ACHANNEL_SETTING_VISIBLE, 1);
}
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
BLI_freelistN(&all_data);
@ -1683,7 +1683,7 @@ static int animchannels_visibility_toggle_exec(bContext *C, wmOperator *UNUSED(o
}
/* cleanup */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
BLI_freelistN(&all_data);
/* send notifier that things have changed */
@ -1799,7 +1799,7 @@ static void setflag_anim_channels(bAnimContext *ac, short setting, short mode, s
ANIM_flush_setting_anim_channels(ac, &all_data, ale, setting, mode);
}
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
BLI_freelistN(&all_data);
}
@ -2064,11 +2064,11 @@ static int animchannels_enable_exec(bContext *C, wmOperator *UNUSED(op))
fcu->driver->flag &= ~DRIVER_FLAG_INVALID;
/* tag everything for updates - in particular, this is needed to get drivers working again */
ANIM_list_elem_update(ac.scene, ale);
ale->update |= ANIM_UPDATE_DEPS;
}
/* free temp data */
BLI_freelistN(&anim_data);
ANIM_animdata_update(&ac, &anim_data);
ANIM_animdata_freelist(&anim_data);
/* send notifier that things have changed */
WM_event_add_notifier(C, NC_ANIMATION | ND_ANIMCHAN | NA_EDITED, NULL);
@ -2228,7 +2228,7 @@ static void borderselect_anim_channels(bAnimContext *ac, rcti *rect, short selec
}
/* cleanup */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
/* ------------------- */
@ -2312,7 +2312,7 @@ static void rename_anim_channels(bAnimContext *ac, int channel_index)
if (G.debug & G_DEBUG)
printf("Error: animation channel (index = %d) not found in rename_anim_channels()\n", channel_index);
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
return;
}
@ -2338,7 +2338,7 @@ static void rename_anim_channels(bAnimContext *ac, int channel_index)
}
/* free temp data and tag for refresh */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
ED_region_tag_redraw(ac->ar);
}
@ -2413,7 +2413,7 @@ static int mouse_anim_channels(bContext *C, bAnimContext *ac, int channel_index,
if (G.debug & G_DEBUG)
printf("Error: animation channel (index = %d) not found in mouse_anim_channels()\n", channel_index);
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
return 0;
}
@ -2421,7 +2421,7 @@ static int mouse_anim_channels(bContext *C, bAnimContext *ac, int channel_index,
/* TODO: should this feature be extended to work with other channel types too? */
if ((selectmode == -1) && (ale->type != ANIMTYPE_GROUP)) {
/* normal channels should not behave normally in this case */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
return 0;
}
@ -2706,7 +2706,7 @@ static int mouse_anim_channels(bContext *C, bAnimContext *ac, int channel_index,
}
/* free channels */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
/* return notifier flags */
return notifierFlags;

View File

@ -45,6 +45,7 @@
#include "BKE_animsys.h"
#include "BKE_action.h"
#include "BKE_fcurve.h"
#include "BKE_context.h"
#include "BKE_depsgraph.h"
#include "BKE_global.h"
@ -341,5 +342,49 @@ void ANIM_sync_animchannels_to_data(const bContext *C)
}
}
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
void ANIM_animdata_update(bAnimContext *ac, ListBase *anim_data)
{
bAnimListElem *ale;
if (ELEM(ac->datatype, ANIMCONT_GPENCIL, ANIMCONT_MASK))
return;
for (ale = anim_data->first; ale; ale = ale->next) {
FCurve *fcu = ale->key_data;
if (ale->update & ANIM_UPDATE_ORDER) {
ale->update &= ~ANIM_UPDATE_ORDER;
sort_time_fcurve(fcu);
}
if (ale->update & ANIM_UPDATE_HANDLES) {
ale->update &= ~ANIM_UPDATE_HANDLES;
calchandles_fcurve(fcu);
}
if (ale->update & ANIM_UPDATE_DEPS) {
ale->update &= ~ANIM_UPDATE_DEPS;
ANIM_list_elem_update(ac->scene, ale);
}
BLI_assert(ale->update == 0);
}
}
void ANIM_animdata_freelist(ListBase *anim_data)
{
#ifndef NDEBUG
bAnimListElem *ale, *ale_next;
for (ale = anim_data->first; ale; ale = ale_next) {
ale_next = ale->next;
BLI_assert(ale->update == 0);
MEM_freeN(ale);
}
BLI_listbase_clear(anim_data);
#else
BLI_freelistN(anim_data);
#endif
}

View File

@ -798,7 +798,7 @@ void summary_to_keylist(bAnimContext *ac, DLRBT_Tree *keys, DLRBT_Tree *blocks)
}
}
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
}
@ -832,7 +832,7 @@ void scene_to_keylist(bDopeSheet *ads, Scene *sce, DLRBT_Tree *keys, DLRBT_Tree
for (ale = anim_data.first; ale; ale = ale->next)
fcurve_to_keylist(ale->adt, ale->data, keys, blocks);
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
void ob_to_keylist(bDopeSheet *ads, Object *ob, DLRBT_Tree *keys, DLRBT_Tree *blocks)
@ -868,7 +868,7 @@ void ob_to_keylist(bDopeSheet *ads, Object *ob, DLRBT_Tree *keys, DLRBT_Tree *bl
for (ale = anim_data.first; ale; ale = ale->next)
fcurve_to_keylist(ale->adt, ale->data, keys, blocks);
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
void fcurve_to_keylist(AnimData *adt, FCurve *fcu, DLRBT_Tree *keys, DLRBT_Tree *blocks)

View File

@ -223,7 +223,7 @@ static short ob_keyframes_loop(KeyframeEditData *ked, bDopeSheet *ads, Object *o
}
}
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
/* return return code - defaults to zero if nothing happened */
return ret;
@ -265,7 +265,7 @@ static short scene_keyframes_loop(KeyframeEditData *ked, bDopeSheet *ads, Scene
}
}
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
/* return return code - defaults to zero if nothing happened */
return ret;
@ -301,7 +301,7 @@ static short summary_keyframes_loop(KeyframeEditData *ked, bAnimContext *ac, Key
break;
}
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
return ret_code;
}
@ -397,7 +397,7 @@ void ANIM_editkeyframes_refresh(bAnimContext *ac)
}
/* free temp data */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
/* ************************************************************************** */

View File

@ -857,6 +857,8 @@ short paste_animedit_keys(bAnimContext *ac, ListBase *anim_data,
totmatch++;
paste_animedit_keys_fcurve(fcu, aci, offset, merge_mode);
}
ale->update |= ANIM_UPDATE_DEFAULT;
}
/* don't continue if some fcurves were pasted */
@ -865,6 +867,8 @@ short paste_animedit_keys(bAnimContext *ac, ListBase *anim_data,
}
}
ANIM_animdata_update(ac, anim_data);
return 0;
}

View File

@ -115,6 +115,7 @@ typedef struct bAnimListElem {
int flag; /* copy of elem's flags for quick access */
int index; /* for un-named data, the index of the data in it's collection */
short update; /* tag the element for updating (eAnim_Update_Flags) */
short datatype; /* type of motion data to expect */
void *key_data; /* motion data - mostly F-Curves, but can be other types too */
@ -123,6 +124,15 @@ typedef struct bAnimListElem {
struct AnimData *adt; /* source of the animation data attached to ID block (for convenience) */
} bAnimListElem;
typedef enum eAnim_Update_Flags {
ANIM_UPDATE_DEPS = (1 << 0), /* referenced data and dependencies get refreshed */
ANIM_UPDATE_ORDER = (1 << 1), /* keyframes need to be sorted */
ANIM_UPDATE_HANDLES = (1 << 2), /* recalculate handles */
} eAnim_Update_Flags;
/* used for most tools which change keyframes (flushed by ANIM_animdata_update) */
#define ANIM_UPDATE_DEFAULT (ANIM_UPDATE_DEPS | ANIM_UPDATE_ORDER | ANIM_UPDATE_HANDLES)
#define ANIM_UPDATE_DEFAULT_NOHANDLES (ANIM_UPDATE_DEFAULT & ~ANIM_UPDATE_HANDLES)
/* Some types for easier type-testing
* NOTE: need to keep the order of these synchronized with the channels define code
@ -356,6 +366,11 @@ bool ANIM_animdata_get_context(const struct bContext *C, bAnimContext *ac);
*/
bool ANIM_animdata_context_getdata(bAnimContext *ac);
/* Acts on bAnimListElem eAnim_Update_Flags */
void ANIM_animdata_update(bAnimContext *ac, ListBase *anim_data);
void ANIM_animdata_freelist(ListBase *anim_data);
/* ************************************************ */
/* ANIMATION CHANNELS LIST */
/* anim_channels_*.c */

View File

@ -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) {

View File

@ -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);
}
}
/* free filtered list */
BLI_freelistN(&anim_data);
return changed;
if (changed) {
ale->update |= ANIM_UPDATE_DEFAULT;
changed_final = true;
}
}
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);

View File

@ -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 */

View File

@ -1054,7 +1054,7 @@ void graph_draw_curves(bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, View2DGrid
}
/* free list of curves */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
/* ************************************************************************* */
@ -1139,5 +1139,5 @@ void graph_draw_channel_names(bContext *C, bAnimContext *ac, ARegion *ar)
}
/* free tempolary channels */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}

View File

@ -151,7 +151,7 @@ void get_graph_keyframe_extents(bAnimContext *ac, float *xmin, float *xmax, floa
}
/* free memory */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
else {
/* set default range */
@ -369,7 +369,7 @@ static void create_ghost_curves(bAnimContext *ac, int start, int end)
}
/* admin and redraws */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
/* ------------------- */
@ -505,9 +505,12 @@ static void insert_graph_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);
}
/* ------------------- */
@ -527,9 +530,6 @@ static int graphkeys_insertkey_exec(bContext *C, wmOperator *op)
/* insert keyframes */
insert_graph_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);
@ -581,6 +581,8 @@ static int graphkeys_click_insert_exec(bContext *C, wmOperator *op)
* keyframes if these will be visible after doing so...
*/
if (fcurve_is_keyframable(fcu)) {
ListBase anim_data;
short mapping_flag = ANIM_get_normalization_flags(&ac);
/* get frame and value from props */
@ -596,6 +598,13 @@ static int graphkeys_click_insert_exec(bContext *C, wmOperator *op)
/* insert keyframe on the specified frame + value */
insert_vert_fcurve(fcu, frame, val, 0);
ale->update |= ANIM_UPDATE_DEPS;
BLI_listbase_clear(&anim_data);
BLI_addtail(&anim_data, ale);
ANIM_animdata_update(&ac, &anim_data);
}
else {
/* warn about why this can't happen */
@ -684,7 +693,7 @@ static short copy_graph_keys(bAnimContext *ac)
ok = copy_animedit_keys(ac, &anim_data);
/* clean up */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
return ok;
}
@ -708,9 +717,9 @@ static short paste_graph_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;
}
@ -771,9 +780,6 @@ static int graphkeys_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);
@ -815,10 +821,12 @@ static void duplicate_graph_keys(bAnimContext *ac)
/* loop through filtered data and delete selected keys */
for (ale = anim_data.first; ale; ale = ale->next) {
duplicate_fcurve_keys((FCurve *)ale->key_data);
ale->update |= ANIM_UPDATE_DEFAULT;
}
/* free filtered list */
BLI_freelistN(&anim_data);
ANIM_animdata_update(ac, &anim_data);
ANIM_animdata_freelist(&anim_data);
}
/* ------------------- */
@ -834,9 +842,6 @@ static int graphkeys_duplicate_exec(bContext *C, wmOperator *UNUSED(op))
/* duplicate keyframes */
duplicate_graph_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_ADDED, NULL);
@ -876,7 +881,7 @@ static bool delete_graph_keys(bAnimContext *ac)
ListBase anim_data = {NULL, NULL};
bAnimListElem *ale;
int filter;
bool changed = false;
bool changed_final = false;
/* filter data */
filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_CURVE_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_NODUPLIS);
@ -886,9 +891,15 @@ static bool delete_graph_keys(bAnimContext *ac)
for (ale = anim_data.first; ale; ale = ale->next) {
FCurve *fcu = (FCurve *)ale->key_data;
AnimData *adt = ale->adt;
bool changed;
/* delete selected keyframes only */
changed |= delete_fcurve_keys(fcu);
changed = delete_fcurve_keys(fcu);
if (changed) {
ale->update |= ANIM_UPDATE_DEFAULT;
changed_final = true;
}
/* Only delete curve too if it won't be doing anything anymore */
if ((fcu->totvert == 0) &&
@ -898,11 +909,11 @@ static bool delete_graph_keys(bAnimContext *ac)
ANIM_fcurve_delete_from_animdata(ac, adt, fcu);
}
}
/* free filtered list */
BLI_freelistN(&anim_data);
return changed;
ANIM_animdata_update(ac, &anim_data);
ANIM_animdata_freelist(&anim_data);
return changed_final;
}
/* ------------------- */
@ -919,9 +930,6 @@ static int graphkeys_delete_exec(bContext *C, wmOperator *UNUSED(op))
if (!delete_graph_keys(&ac))
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_REMOVED, NULL);
@ -957,11 +965,14 @@ static void clean_graph_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);
}
/* ------------------- */
@ -981,9 +992,6 @@ static int graphkeys_clean_exec(bContext *C, wmOperator *op)
/* clean keyframes */
clean_graph_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);
@ -1036,10 +1044,12 @@ static void bake_graph_curves(bAnimContext *ac, int start, int end)
/* restore driver */
fcu->driver = driver;
ale->update |= ANIM_UPDATE_DEPS;
}
/* admin and redraws */
BLI_freelistN(&anim_data);
ANIM_animdata_update(ac, &anim_data);
ANIM_animdata_freelist(&anim_data);
}
/* ------------------- */
@ -1063,9 +1073,6 @@ static int graphkeys_bake_exec(bContext *C, wmOperator *UNUSED(op))
/* bake keyframes */
bake_graph_curves(&ac, start, end);
/* validate keyframes after editing */
ANIM_editkeyframes_refresh(&ac);
/* set notifier that keyframes have changed */
// NOTE: some distinction between order/number of keyframes and type should be made?
WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, NULL);
@ -1178,16 +1185,16 @@ static int graphkeys_sound_bake_exec(bContext *C, wmOperator *op)
/* sample the sound */
fcurve_store_samples(fcu, &sbi, start, end, fcurve_samplingcb_sound);
ale->update |= ANIM_UPDATE_DEFAULT;
}
/* free sample data */
free(sbi.samples);
/* admin and redraws */
BLI_freelistN(&anim_data);
/* validate keyframes after editing */
ANIM_editkeyframes_refresh(&ac);
ANIM_animdata_update(&ac, &anim_data);
ANIM_animdata_freelist(&anim_data);
/* set notifier that 'keyframes' have changed */
WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, NULL);
@ -1275,11 +1282,14 @@ static void sample_graph_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);
}
/* ------------------- */
@ -1295,9 +1305,6 @@ static int graphkeys_sample_exec(bContext *C, wmOperator *UNUSED(op))
/* sample keyframes */
sample_graph_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);
@ -1381,10 +1388,12 @@ static void setexpo_graph_keys(bAnimContext *ac, short mode)
}
}
}
ale->update |= ANIM_UPDATE_DEPS;
}
/* cleanup */
BLI_freelistN(&anim_data);
ANIM_animdata_update(ac, &anim_data);
ANIM_animdata_freelist(&anim_data);
}
/* ------------------- */
@ -1404,9 +1413,6 @@ static int graphkeys_expo_exec(bContext *C, wmOperator *op)
/* set handle type */
setexpo_graph_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);
@ -1449,11 +1455,14 @@ static void setipo_graph_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_NOHANDLES;
}
ANIM_animdata_update(ac, &anim_data);
ANIM_animdata_freelist(&anim_data);
}
/* ------------------- */
@ -1473,9 +1482,6 @@ static int graphkeys_ipo_exec(bContext *C, wmOperator *op)
/* set handle type */
setipo_graph_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);
@ -1517,11 +1523,14 @@ static void seteasing_graph_keys(bAnimContext *ac, short mode)
/* loop through setting BezTriple easing
* 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_NOHANDLES;
}
ANIM_animdata_update(ac, &anim_data);
ANIM_animdata_freelist(&anim_data);
}
static int graphkeys_easing_exec(bContext *C, wmOperator *op)
@ -1539,9 +1548,6 @@ static int graphkeys_easing_exec(bContext *C, wmOperator *op)
/* set handle type */
seteasing_graph_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);
@ -1593,11 +1599,13 @@ static void sethandles_graph_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);
}
/* ------------------- */
@ -1616,9 +1624,6 @@ static int graphkeys_handletype_exec(bContext *C, wmOperator *op)
/* set handle type */
sethandles_graph_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);
@ -1724,10 +1729,12 @@ static int graphkeys_euler_filter_exec(bContext *C, wmOperator *op)
euf->rna_path = fcu->rna_path; /* this should be safe, since we're only using it for a short time */
euf->fcurves[fcu->array_index] = fcu;
}
ale->update |= ANIM_UPDATE_DEFAULT;
}
BLI_freelistN(&anim_data);
if (groups == 0) {
ANIM_animdata_freelist(&anim_data);
BKE_report(op->reports, RPT_WARNING, "No Euler Rotation F-Curves to fix up");
return OPERATOR_CANCELLED;
}
@ -1786,6 +1793,9 @@ static int graphkeys_euler_filter_exec(bContext *C, wmOperator *op)
}
BLI_freelistN(&eulers);
ANIM_animdata_update(&ac, &anim_data);
ANIM_animdata_freelist(&anim_data);
/* updates + finishing warnings */
if (failed == groups) {
BKE_report(op->reports, RPT_ERROR,
@ -1801,9 +1811,6 @@ static int graphkeys_euler_filter_exec(bContext *C, wmOperator *op)
"consecutive XYZ order and selected");
}
/* 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);
@ -1882,7 +1889,7 @@ static int graphkeys_framejump_exec(bContext *C, wmOperator *UNUSED(op))
ked.i2 += current_ked.i2;
}
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
/* set the new current frame and cursor values, based on the average time and value */
if (ked.i1) {
@ -1984,9 +1991,12 @@ static void snap_graph_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);
}
/* ------------------- */
@ -2006,9 +2016,6 @@ static int graphkeys_snap_exec(bContext *C, wmOperator *op)
/* snap keyframes */
snap_graph_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);
@ -2111,9 +2118,12 @@ static void mirror_graph_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);
}
/* ------------------- */
@ -2133,9 +2143,6 @@ static int graphkeys_mirror_exec(bContext *C, wmOperator *op)
/* mirror keyframes */
mirror_graph_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);
@ -2185,11 +2192,12 @@ static int graphkeys_smooth_exec(bContext *C, wmOperator *UNUSED(op))
* Snap->Flatten Handles anyway.
*/
smooth_fcurve(ale->key_data);
ale->update |= ANIM_UPDATE_DEFAULT;
}
BLI_freelistN(&anim_data);
/* validate keyframes after editing */
ANIM_editkeyframes_refresh(&ac);
ANIM_animdata_update(&ac, &anim_data);
ANIM_animdata_freelist(&anim_data);
/* set notifier that keyframes have changed */
WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, NULL);
@ -2283,11 +2291,12 @@ static int graph_fmodifier_add_exec(bContext *C, wmOperator *op)
BKE_report(op->reports, RPT_ERROR, "Modifier could not be added (see console for details)");
break;
}
ale->update |= ANIM_UPDATE_DEPS;
}
BLI_freelistN(&anim_data);
/* validate keyframes after editing */
ANIM_editkeyframes_refresh(&ac);
ANIM_animdata_update(&ac, &anim_data);
ANIM_animdata_freelist(&anim_data);
/* set notifier that things have changed */
// FIXME: this really isn't the best description for it...
@ -2397,19 +2406,26 @@ static int graph_fmodifier_paste_exec(bContext *C, wmOperator *op)
/* paste modifiers */
for (ale = anim_data.first; ale; ale = ale->next) {
FCurve *fcu = (FCurve *)ale->data;
int tot;
/* TODO: do we want to replace existing modifiers? add user pref for that! */
ok += ANIM_fmodifiers_paste_from_buf(&fcu->modifiers, 0);
tot = ANIM_fmodifiers_paste_from_buf(&fcu->modifiers, 0);
if (tot) {
ale->update |= ANIM_UPDATE_DEPS;
}
ok += tot;
}
/* clean up */
BLI_freelistN(&anim_data);
if (ok) {
ANIM_animdata_update(&ac, &anim_data);
}
ANIM_animdata_freelist(&anim_data);
/* successful or not? */
if (ok) {
/* 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);

View File

@ -141,7 +141,7 @@ static void deselect_graph_keys(bAnimContext *ac, short test, short sel, short d
}
/* Cleanup */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
/* ------------------- */
@ -311,7 +311,7 @@ static void borderselect_graphkeys(
}
/* cleanup */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
/* ------------------- */
@ -548,7 +548,7 @@ static void markers_selectkeys_between(bAnimContext *ac)
}
/* Cleanup */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
@ -576,7 +576,7 @@ static void columnselect_graph_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 GRAPHKEYS_COLUMNSEL_CFRA: /* current frame */
@ -622,7 +622,7 @@ static void columnselect_graph_keys(bAnimContext *ac, short mode)
/* free elements */
BLI_freelistN(&ked.list);
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
/* ------------------- */
@ -700,7 +700,7 @@ static int graphkeys_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);
@ -764,7 +764,7 @@ static void select_moreless_graph_keys(bAnimContext *ac, short mode)
}
/* Cleanup */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
/* ----------------- */
@ -899,7 +899,7 @@ static void graphkeys_select_leftright(bAnimContext *ac, short leftright, short
}
/* Cleanup */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
/* ----------------- */
@ -1147,7 +1147,7 @@ static void get_nearest_fcurve_verts_list(bAnimContext *ac, const int mval[2], L
}
/* free channels */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
/* helper for find_nearest_fcurve_vert() - get the best match to use */
@ -1400,7 +1400,7 @@ static void graphkeys_mselect_column(bAnimContext *ac, const int mval[2], short
/* free elements */
MEM_freeN(nvi);
BLI_freelistN(&ked.list);
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
/* ------------------- */

View File

@ -78,7 +78,7 @@ bAnimListElem *get_active_fcurve_channel(bAnimContext *ac)
/* remove first item from list, then free the rest of the list and return the stored one */
BLI_remlink(&anim_data, ale);
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
return ale;
}
@ -135,7 +135,7 @@ int graphop_visible_keyframes_poll(bContext *C)
}
/* cleanup and return findings */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
return found;
}
@ -185,7 +185,7 @@ int graphop_editable_keyframes_poll(bContext *C)
}
/* cleanup and return findings */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
return found;
}
@ -251,7 +251,7 @@ int graphop_selected_fcurve_poll(bContext *C)
return 0;
/* cleanup and return findings */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
return 1;
}

View File

@ -607,7 +607,7 @@ static void graph_refresh(const bContext *C, ScrArea *sa)
}
/* free temp list */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
}

View File

@ -174,7 +174,7 @@ bool nla_panel_context(const bContext *C, PointerRNA *adt_ptr, PointerRNA *nlt_p
}
/* free temp data */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
return (found != 0);
}

View File

@ -94,7 +94,7 @@ static int mouse_nla_channels(bAnimContext *ac, float x, int channel_index, shor
if (G.debug & G_DEBUG)
printf("Error: animation channel (index = %d) not found in mouse_anim_channels()\n", channel_index);
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
return 0;
}
@ -322,7 +322,7 @@ static int mouse_nla_channels(bAnimContext *ac, float x, int channel_index, shor
}
/* free channels */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
/* return the notifier-flags set */
return notifierFlags;
@ -438,12 +438,12 @@ static int nlachannels_pushdown_exec(bContext *C, wmOperator *op)
ale = BLI_findlink(&anim_data, channel_index);
if (ale == NULL) {
BKE_reportf(op->reports, RPT_ERROR, "No animation channel found at index %d", channel_index);
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
return OPERATOR_CANCELLED;
}
else if (ale->type != ANIMTYPE_NLAACTION) {
BKE_reportf(op->reports, RPT_ERROR, "Animation channel at index %d is not a NLA 'Active Action' channel", channel_index);
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
return OPERATOR_CANCELLED;
}
@ -451,7 +451,7 @@ static int nlachannels_pushdown_exec(bContext *C, wmOperator *op)
adt = ale->adt;
/* we don't need anything here anymore, so free it all */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
/* double-check that we are free to push down here... */
@ -539,7 +539,7 @@ bool nlaedit_add_tracks_existing(bAnimContext *ac, bool above_sel)
}
/* free temp data */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
return added;
}
@ -572,7 +572,7 @@ bool nlaedit_add_tracks_empty(bAnimContext *ac)
}
/* cleanup */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
return added;
}
@ -666,7 +666,7 @@ static int nlaedit_delete_tracks_exec(bContext *C, wmOperator *UNUSED(op))
}
/* free temp data */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
/* set notifier that things have changed */
WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);

View File

@ -613,7 +613,7 @@ void draw_nla_main_data(bAnimContext *ac, SpaceNla *snla, ARegion *ar)
}
/* free tempolary channels */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
/* *********************************************** */
@ -704,7 +704,7 @@ void draw_nla_channel_list(bContext *C, bAnimContext *ac, ARegion *ar)
}
/* free temporary channels */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
/* *********************************************** */

View File

@ -93,7 +93,7 @@ void ED_nla_postop_refresh(bAnimContext *ac)
}
/* free temp memory */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
/* *********************************************** */
@ -136,7 +136,7 @@ static int nlaedit_enable_tweakmode_exec(bContext *C, wmOperator *op)
}
/* free temp data */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
/* if we managed to enter tweakmode on at least one AnimData block,
* set the flag for this in the active scene and send notifiers
@ -200,7 +200,7 @@ bool nlaedit_disable_tweakmode(bAnimContext *ac)
}
/* free temp data */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
/* if we managed to enter tweakmode on at least one AnimData block,
* set the flag for this in the active scene and send notifiers
@ -293,7 +293,7 @@ static void get_nlastrip_extents(bAnimContext *ac, float *min, float *max, const
}
/* free memory */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
/* set default range if nothing happened */
@ -406,7 +406,7 @@ static bool nla_channels_get_selected_extents(bAnimContext *ac, float *min, floa
}
/* free all temp data */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
return (found != 0);
}
@ -602,7 +602,7 @@ static int nlaedit_add_actionclip_exec(bContext *C, wmOperator *op)
}
/* free temp data */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
/* refresh auto strip properties */
ED_nla_postop_refresh(&ac);
@ -723,7 +723,7 @@ static int nlaedit_add_transition_exec(bContext *C, wmOperator *op)
}
/* free temp data */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
/* was anything added? */
if (done) {
@ -815,7 +815,7 @@ static int nlaedit_add_sound_exec(bContext *C, wmOperator *UNUSED(op))
}
/* free temp data */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
/* refresh auto strip properties */
ED_nla_postop_refresh(&ac);
@ -880,7 +880,7 @@ static int nlaedit_add_meta_exec(bContext *C, wmOperator *UNUSED(op))
}
/* free temp data */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
/* set notifier that things have changed */
WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
@ -932,7 +932,7 @@ static int nlaedit_remove_meta_exec(bContext *C, wmOperator *UNUSED(op))
}
/* free temp data */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
/* set notifier that things have changed */
WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
@ -1019,7 +1019,7 @@ static int nlaedit_duplicate_exec(bContext *C, wmOperator *op)
}
/* free temp data */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
if (done) {
/* refresh auto strip properties */
@ -1111,7 +1111,7 @@ static int nlaedit_delete_exec(bContext *C, wmOperator *UNUSED(op))
}
/* free temp data */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
/* refresh auto strip properties */
ED_nla_postop_refresh(&ac);
@ -1256,7 +1256,7 @@ static int nlaedit_split_exec(bContext *C, wmOperator *UNUSED(op))
}
/* free temp data */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
/* refresh auto strip properties */
ED_nla_postop_refresh(&ac);
@ -1309,7 +1309,7 @@ static int nlaedit_bake_exec(bContext *C, wmOperator *UNUSED(op))
}
/* free temp data */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
/* refresh auto strip properties */
ED_nla_postop_refresh(&ac);
@ -1375,7 +1375,7 @@ static int nlaedit_toggle_mute_exec(bContext *C, wmOperator *UNUSED(op))
}
/* free temp data */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
/* set notifier that things have changed */
WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
@ -1529,7 +1529,7 @@ static int nlaedit_swap_exec(bContext *C, wmOperator *op)
}
/* free temp data */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
/* refresh auto strip properties */
ED_nla_postop_refresh(&ac);
@ -1603,7 +1603,7 @@ static int nlaedit_move_up_exec(bContext *C, wmOperator *UNUSED(op))
}
/* free temp data */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
/* refresh auto strip properties */
ED_nla_postop_refresh(&ac);
@ -1677,7 +1677,7 @@ static int nlaedit_move_down_exec(bContext *C, wmOperator *UNUSED(op))
}
/* free temp data */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
/* refresh auto strip properties */
ED_nla_postop_refresh(&ac);
@ -1756,7 +1756,7 @@ static int nlaedit_sync_actlen_exec(bContext *C, wmOperator *op)
}
/* free temp data */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
/* set notifier that things have changed */
WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
@ -1832,7 +1832,7 @@ static int nlaedit_make_single_user_exec(bContext *C, wmOperator *UNUSED(op))
}
/* free temp data */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
/* set notifier that things have changed */
WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
@ -1928,7 +1928,7 @@ static int nlaedit_apply_scale_exec(bContext *C, wmOperator *UNUSED(op))
}
/* free temp data */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
/* set notifier that things have changed */
WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
@ -1988,7 +1988,7 @@ static int nlaedit_clear_scale_exec(bContext *C, wmOperator *UNUSED(op))
}
/* free temp data */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
/* refresh auto strip properties */
ED_nla_postop_refresh(&ac);
@ -2129,7 +2129,7 @@ static int nlaedit_snap_exec(bContext *C, wmOperator *op)
}
/* free temp data */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
/* refresh auto strip properties */
ED_nla_postop_refresh(&ac);
@ -2252,7 +2252,7 @@ static int nla_fmodifier_add_exec(bContext *C, wmOperator *op)
}
/* free temp data */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
/* set notifier that things have changed */
WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL);
@ -2375,7 +2375,7 @@ static int nla_fmodifier_paste_exec(bContext *C, wmOperator *op)
}
/* clean up */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
/* successful or not? */
if (ok) {

View File

@ -153,7 +153,7 @@ static void deselect_nla_strips(bAnimContext *ac, short test, short sel)
}
/* Cleanup */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
/* ------------------- */
@ -268,7 +268,7 @@ static void borderselect_nla_strips(bAnimContext *ac, rcti rect, short mode, sho
}
/* cleanup */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
/* ------------------- */
@ -412,7 +412,7 @@ static void nlaedit_select_leftright(bContext *C, bAnimContext *ac, short leftri
}
/* Cleanup */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
/* ------------------- */
@ -537,7 +537,7 @@ static void mouse_nla_strips(bContext *C, bAnimContext *ac, const int mval[2], s
if (ale == NULL) {
/* channel not found */
printf("Error: animation channel (index = %d) not found in mouse_nla_strips()\n", channel_index);
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
return;
}
else {
@ -556,7 +556,7 @@ static void mouse_nla_strips(bContext *C, bAnimContext *ac, const int mval[2], s
BLI_remlink(&anim_data, ale);
/* free list of channels, since it's not used anymore */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
/* if currently in tweakmode, exit tweakmode before changing selection states

View File

@ -2861,7 +2861,7 @@ static void createTransNlaData(bContext *C, TransInfo *t)
}
/* cleanup temp list */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
return;
}
@ -2994,7 +2994,7 @@ static void createTransNlaData(bContext *C, TransInfo *t)
}
/* cleanup temp list */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
/* ********************* ACTION EDITOR ****************** */
@ -3183,7 +3183,7 @@ static void posttrans_action_clean(bAnimContext *ac, bAction *act)
}
/* free temp data */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
/* ----------------------------- */
@ -3458,7 +3458,7 @@ static void createTransActionData(bContext *C, TransInfo *t)
/* stop if trying to build list if nothing selected */
if (count == 0) {
/* cleanup temp list */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
return;
}
@ -3547,7 +3547,7 @@ static void createTransActionData(bContext *C, TransInfo *t)
}
/* cleanup temp list */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
/* ********************* GRAPH EDITOR ************************* */
@ -3738,7 +3738,7 @@ static void createTransGraphEditData(bContext *C, TransInfo *t)
/* stop if trying to build list if nothing selected */
if (count == 0) {
/* cleanup temp list */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
return;
}
@ -3870,7 +3870,7 @@ static void createTransGraphEditData(bContext *C, TransInfo *t)
}
/* cleanup temp list */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
@ -5532,7 +5532,7 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
}
/* free temp memory */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
else if (ac.datatype == ANIMCONT_ACTION) { // TODO: just integrate into the above...
/* Depending on the lock status, draw necessary views */
@ -5664,7 +5664,7 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
}
/* free temp memory */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
/* Make sure all F-Curves are set correctly, but not if transform was
@ -5701,7 +5701,7 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
}
/* free temp memory */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
/* perform after-transfrom validation */
ED_nla_postop_refresh(&ac);

View File

@ -363,7 +363,7 @@ static void recalcData_actedit(TransInfo *t)
}
/* now free temp channels */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
}
/* helper for recalcData() - for Graph Editor transforms */
@ -423,7 +423,7 @@ static void recalcData_graphedit(TransInfo *t)
if (dosort) remake_graph_transdata(t, &anim_data);
/* now free temp channels */
BLI_freelistN(&anim_data);
ANIM_animdata_freelist(&anim_data);
}
/* helper for recalcData() - for NLA Editor transforms */