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:
parent
5b79e0b80e
commit
77ca5ab6b0
Notes:
blender-bot
2023-02-14 06:17:14 +01:00
Referenced by issue #74897, VSE keyframes don't work
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue