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
path: root/source
diff options
context:
space:
mode:
authorRichard Antalik <ISS>2020-04-12 23:09:46 +0300
committerRichard Antalik <richardantalik@gmail.com>2020-04-12 23:10:13 +0300
commit77ca5ab6b02bbccc97d13c50d4174afe9471725a (patch)
treed750e8cab574fcf3bf6934b378fdf061d3a489a5 /source
parent5b79e0b80e49c1f75736a8b0bdeb8560a934b072 (diff)
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
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/BKE_sequencer.h2
-rw-r--r--source/blender/blenkernel/intern/sequencer.c16
-rw-r--r--source/blender/editors/space_sequencer/sequencer_edit.c6
-rw-r--r--source/blender/makesrna/intern/rna_sequencer_api.c4
4 files changed, 16 insertions, 12 deletions
diff --git a/source/blender/blenkernel/BKE_sequencer.h b/source/blender/blenkernel/BKE_sequencer.h
index 1b4ca1350ad..dd9414b81f7 100644
--- a/source/blender/blenkernel/BKE_sequencer.h
+++ b/source/blender/blenkernel/BKE_sequencer.h
@@ -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);
diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c
index 1cc7f4afa49..7d4e5e582c6 100644
--- a/source/blender/blenkernel/intern/sequencer.c
+++ b/source/blender/blenkernel/intern/sequencer.c
@@ -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;
diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c
index d34eed622d4..0175260a95c 100644
--- a/source/blender/editors/space_sequencer/sequencer_edit.c
+++ b/source/blender/editors/space_sequencer/sequencer_edit.c
@@ -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) {
diff --git a/source/blender/makesrna/intern/rna_sequencer_api.c b/source/blender/makesrna/intern/rna_sequencer_api.c
index d49a2ed1ea0..6c8f51f97a1 100644
--- a/source/blender/makesrna/intern/rna_sequencer_api.c
+++ b/source/blender/makesrna/intern/rna_sequencer_api.c
@@ -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);