Fix T74897: VSE animation doesn't work

`seq_free_animdata()` removes fcurve pointers belonging to strips from
`Scene` CoW datablock's `AnimData` during `BKE_scene_graph_update_for_newframe`.
This causes problems with updating animation.

This worked before rBbe2e41c397ba, because `AnimData` was freed by `BKE_animdata_free()`
before `seq_free_animdata()` was executed, so it had no data to operate on and returned
on precondition `if (scene->adt == NULL || scene->adt->action == NULL)`

Reviewed By: mont29, brecht

Maniphest Tasks: T74897

Differential Revision: https://developer.blender.org/D7264
This commit is contained in:
Richard Antalik 2020-04-12 22:09:46 +02:00 committed by Richard Antalik
parent 5b79e0b80e
commit 77ca5ab6b0
Notes: blender-bot 2023-02-14 06:17:14 +01:00
Referenced by issue #74897, VSE keyframes don't work
4 changed files with 16 additions and 12 deletions

View File

@ -265,7 +265,7 @@ void BKE_sequencer_base_clipboard_pointers_free(struct ListBase *seqbase);
void BKE_sequencer_base_clipboard_pointers_store(struct Main *bmain, struct ListBase *seqbase);
void BKE_sequencer_base_clipboard_pointers_restore(struct ListBase *seqbase, struct Main *bmain);
void BKE_sequence_free(struct Scene *scene, struct Sequence *seq);
void BKE_sequence_free(struct Scene *scene, struct Sequence *seq, const bool do_clean_animdata);
void BKE_sequence_free_anim(struct Sequence *seq);
const char *BKE_sequence_give_name(struct Sequence *seq);
ListBase *BKE_sequence_seqbase_get(struct Sequence *seq, int *r_offset);

View File

@ -236,7 +236,8 @@ static void seq_free_strip(Strip *strip)
static void BKE_sequence_free_ex(Scene *scene,
Sequence *seq,
const bool do_cache,
const bool do_id_user)
const bool do_id_user,
const bool do_clean_animdata)
{
if (seq->strip) {
seq_free_strip(seq->strip);
@ -271,7 +272,10 @@ static void BKE_sequence_free_ex(Scene *scene,
BKE_sound_remove_scene_sound(scene, seq->scene_sound);
}
seq_free_animdata(scene, seq);
/* XXX This must not be done in BKE code. */
if (do_clean_animdata) {
seq_free_animdata(scene, seq);
}
}
if (seq->prop) {
@ -299,9 +303,9 @@ static void BKE_sequence_free_ex(Scene *scene,
MEM_freeN(seq);
}
void BKE_sequence_free(Scene *scene, Sequence *seq)
void BKE_sequence_free(Scene *scene, Sequence *seq, const bool do_clean_animdata)
{
BKE_sequence_free_ex(scene, seq, true, true);
BKE_sequence_free_ex(scene, seq, true, true, do_clean_animdata);
}
/* Function to free imbuf and anim data on changes */
@ -331,7 +335,7 @@ static void seq_free_sequence_recurse(Scene *scene, Sequence *seq, const bool do
seq_free_sequence_recurse(scene, iseq, do_id_user);
}
BKE_sequence_free_ex(scene, seq, false, do_id_user);
BKE_sequence_free_ex(scene, seq, false, do_id_user, true);
}
Editing *BKE_sequencer_editing_get(Scene *scene, bool alloc)
@ -501,7 +505,7 @@ void BKE_sequencer_editing_free(Scene *scene, const bool do_id_user)
SEQ_BEGIN (ed, seq) {
/* handle cache freeing above */
BKE_sequence_free_ex(scene, seq, false, do_id_user);
BKE_sequence_free_ex(scene, seq, false, do_id_user, false);
}
SEQ_END;

View File

@ -720,7 +720,7 @@ static void recurs_del_seq_flag(Scene *scene, ListBase *lb, short flag, short de
if (seq->type == SEQ_TYPE_META) {
recurs_del_seq_flag(scene, &seq->seqbase, flag, 1);
}
BKE_sequence_free(scene, seq);
BKE_sequence_free(scene, seq, true);
}
seq = seqn;
}
@ -2641,7 +2641,7 @@ static int sequencer_separate_images_exec(bContext *C, wmOperator *op)
}
seq_next = seq->next;
BKE_sequence_free(scene, seq);
BKE_sequence_free(scene, seq, true);
seq = seq_next;
}
else {
@ -2866,7 +2866,7 @@ static int sequencer_meta_separate_exec(bContext *C, wmOperator *UNUSED(op))
BLI_listbase_clear(&last_seq->seqbase);
BLI_remlink(ed->seqbasep, last_seq);
BKE_sequence_free(scene, last_seq);
BKE_sequence_free(scene, last_seq, true);
/* Empty meta strip, delete all effects depending on it. */
for (seq = ed->seqbasep->first; seq; seq = seq->next) {

View File

@ -193,7 +193,7 @@ static Sequence *rna_Sequences_new_image(ID *id,
if (seq->strip->stripdata->name[0] == '\0') {
BKE_report(reports, RPT_ERROR, "Sequences.new_image: unable to open image file");
BLI_remlink(&ed->seqbase, seq);
BKE_sequence_free(scene, seq);
BKE_sequence_free(scene, seq, true);
return NULL;
}
@ -382,7 +382,7 @@ static void rna_Sequences_remove(
return;
}
BKE_sequence_free(scene, seq);
BKE_sequence_free(scene, seq, true);
RNA_POINTER_INVALIDATE(seq_ptr);
DEG_relations_tag_update(bmain);