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
diff options
context:
space:
mode:
authorBastien Montagne <montagne29@wanadoo.fr>2019-01-11 22:03:42 +0300
committerBastien Montagne <montagne29@wanadoo.fr>2019-01-11 22:03:42 +0300
commitee34275e7da798a1cc9c398ac9bba68ad3343c1b (patch)
treef039058be6f8f4aa41cdde2a8540430d8f0f4df3 /source/blender/blenkernel/intern/sequencer.c
parentbb9c9d0eaaab836b8f20ab7b2228795f607b823a (diff)
parent1ded3d2f7c04100698afdee356e2ba8d4ae2d6bd (diff)
Merge branch 'blender2.7'
Diffstat (limited to 'source/blender/blenkernel/intern/sequencer.c')
-rw-r--r--source/blender/blenkernel/intern/sequencer.c39
1 files changed, 28 insertions, 11 deletions
diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c
index 5160e5ddffc..0f3f35477af 100644
--- a/source/blender/blenkernel/intern/sequencer.c
+++ b/source/blender/blenkernel/intern/sequencer.c
@@ -1957,7 +1957,7 @@ void BKE_sequencer_proxy_rebuild_context(
context = MEM_callocN(sizeof(SeqIndexBuildContext), "seq proxy rebuild context");
- nseq = BKE_sequence_dupli_recursive(scene, scene, seq, 0);
+ nseq = BKE_sequence_dupli_recursive(scene, scene, NULL, seq, 0);
context->tc_flags = nseq->strip->proxy->build_tc_flags;
context->size_flags = nseq->strip->proxy->build_size_flags;
@@ -5413,7 +5413,8 @@ Sequence *BKE_sequencer_add_movie_strip(bContext *C, ListBase *seqbasep, SeqLoad
return seq;
}
-static Sequence *seq_dupli(const Scene *scene_src, Scene *scene_dst, Sequence *seq, int dupe_flag, const int flag)
+static Sequence *seq_dupli(
+ const Scene *scene_src, Scene *scene_dst, ListBase *new_seq_list, Sequence *seq, int dupe_flag, const int flag)
{
Sequence *seqn = MEM_dupallocN(seq);
@@ -5498,9 +5499,18 @@ static Sequence *seq_dupli(const Scene *scene_src, Scene *scene_dst, Sequence *s
BLI_assert(0);
}
+ /* When using SEQ_DUPE_UNIQUE_NAME, it is mandatory to add new sequences in relevant container
+ * (scene or meta's one), *before* checking for unique names. Otherwise the meta's list is empty
+ * and hence we miss all seqs in that meta that have already been duplicated (see T55668).
+ * Note that unique name check itslef could be done at a later step in calling code, once all seqs
+ * have bee duplicated (that was first, simpler solution), but then handling of animation data will
+ * be broken (see T60194). */
+ if (new_seq_list != NULL) {
+ BLI_addtail(new_seq_list, seqn);
+ }
+
if (scene_src == scene_dst) {
if (dupe_flag & SEQ_DUPE_UNIQUE_NAME) {
- /* TODO this is broken in case of Meta strips recursive duplication... Not trivial to fix. */
BKE_sequence_base_unique_name_recursive(&scene_dst->ed->seqbase, seqn);
}
@@ -5534,22 +5544,30 @@ static void seq_new_fix_links_recursive(Sequence *seq)
}
}
-Sequence *BKE_sequence_dupli_recursive(const Scene *scene_src, Scene *scene_dst, Sequence *seq, int dupe_flag)
+static Sequence *sequence_dupli_recursive_do(
+ const Scene *scene_src, Scene *scene_dst, ListBase *new_seq_list, Sequence *seq, const int dupe_flag)
{
Sequence *seqn;
seq->tmp = NULL;
- seqn = seq_dupli(scene_src, scene_dst, seq, dupe_flag, 0);
+ seqn = seq_dupli(scene_src, scene_dst, new_seq_list, seq, dupe_flag, 0);
if (seq->type == SEQ_TYPE_META) {
Sequence *s;
for (s = seq->seqbase.first; s; s = s->next) {
- Sequence *n = BKE_sequence_dupli_recursive(scene_src, scene_dst, s, dupe_flag);
- if (n) {
- BLI_addtail(&seqn->seqbase, n);
- }
+ sequence_dupli_recursive_do(scene_src, scene_dst, &seqn->seqbase, s, dupe_flag);
}
}
+ return seqn;
+}
+
+Sequence *BKE_sequence_dupli_recursive(
+ const Scene *scene_src, Scene *scene_dst,
+ ListBase *new_seq_list, Sequence *seq, int dupe_flag)
+{
+ Sequence *seqn = sequence_dupli_recursive_do(scene_src, scene_dst, new_seq_list, seq, dupe_flag);
+
+ /* This does not need to be in recursive call itself, since it is already recursive... */
seq_new_fix_links_recursive(seqn);
return seqn;
@@ -5568,14 +5586,13 @@ void BKE_sequence_base_dupli_recursive(
for (seq = seqbase->first; seq; seq = seq->next) {
seq->tmp = NULL;
if ((seq->flag & SELECT) || (dupe_flag & SEQ_DUPE_ALL)) {
- seqn = seq_dupli(scene_src, scene_dst, seq, dupe_flag, flag);
+ seqn = seq_dupli(scene_src, scene_dst, nseqbase, seq, dupe_flag, flag);
if (seqn) { /*should never fail */
if (dupe_flag & SEQ_DUPE_CONTEXT) {
seq->flag &= ~SEQ_ALLSEL;
seqn->flag &= ~(SEQ_LEFTSEL + SEQ_RIGHTSEL + SEQ_LOCK);
}
- BLI_addtail(nseqbase, seqn);
if (seq->type == SEQ_TYPE_META) {
BKE_sequence_base_dupli_recursive(
scene_src, scene_dst, &seqn->seqbase, &seq->seqbase,