diff options
author | Campbell Barton <ideasman42@gmail.com> | 2010-06-25 16:04:04 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2010-06-25 16:04:04 +0400 |
commit | 7b36b2ebbb5449cebd6264d707a43bcaf910b81c (patch) | |
tree | d1c12525e05fcd1c190cd5304c4db9067c7c4c96 /source/blender/blenkernel/intern | |
parent | 044a20821b290beef5b39a265a3527bc4ecf31fa (diff) |
- duplicating a scene now duplicates its sequence strips too.
- bugfix for copying a scene with FFMPEG properties set (wasnt copying the ID properties, could crash blender)
- relative path option for adding sequence strips and replaceing images.
Diffstat (limited to 'source/blender/blenkernel/intern')
-rw-r--r-- | source/blender/blenkernel/intern/scene.c | 10 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/sequencer.c | 31 |
2 files changed, 28 insertions, 13 deletions
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index 6f049df917c..a2fdf35583f 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -198,6 +198,10 @@ Scene *copy_scene(Main *bmain, Scene *sce, int type) scen->r.qtcodecdata->cdParms = MEM_dupallocN(scen->r.qtcodecdata->cdParms); } + if(sce->r.ffcodecdata.properties) { /* intentionally check scen not sce. */ + scen->r.ffcodecdata.properties= IDP_CopyProperty(scen->r.ffcodecdata.properties); + } + /* NOTE: part of SCE_COPY_LINK_DATA and SCE_COPY_FULL operations * are done outside of blenkernel with ED_objects_single_users! */ @@ -212,6 +216,12 @@ Scene *copy_scene(Main *bmain, Scene *sce, int type) id_us_plus((ID *)scen->world); scen->world= copy_world(scen->world); } + + if(sce->ed) { + scen->ed= MEM_callocN( sizeof(Editing), "addseq"); + scen->ed->seqbasep= &scen->ed->seqbase; + seqbase_dupli_recursive(sce, &scen->ed->seqbase, &sce->ed->seqbase, 0); + } } sound_create_scene(scen); diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c index f16b169a4fb..4241f481c30 100644 --- a/source/blender/blenkernel/intern/sequencer.c +++ b/source/blender/blenkernel/intern/sequencer.c @@ -3991,7 +3991,7 @@ Sequence *sequencer_add_sound_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo AUD_SoundInfo info; - sound = sound_new_file(CTX_data_main(C), seq_load->path); + sound = sound_new_file(CTX_data_main(C), seq_load->path); /* handles relative paths */ if (sound==NULL || sound->playback_handle == NULL) { //if(op) @@ -4039,6 +4039,7 @@ Sequence *sequencer_add_sound_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo Sequence *sequencer_add_movie_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo *seq_load) { Scene *scene= CTX_data_scene(C); /* only for sound */ + char path[sizeof(seq_load->path)]; Sequence *seq, *soundseq; /* generic strip vars */ Strip *strip; @@ -4046,7 +4047,10 @@ Sequence *sequencer_add_movie_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo struct anim *an; - an = openanim(seq_load->path, IB_rect); + BLI_strncpy(path, seq_load->path, sizeof(path)); + BLI_path_abs(path, G.sce); + + an = openanim(path, IB_rect); if(an==NULL) return NULL; @@ -4088,7 +4092,7 @@ Sequence *sequencer_add_movie_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo } -static Sequence *dupli_seq(struct Scene *scene, Sequence *seq) +static Sequence *seq_dupli(struct Scene *scene, Sequence *seq, int dupe_flag) { Sequence *seqn = MEM_dupallocN(seq); @@ -4164,18 +4168,19 @@ static Sequence *dupli_seq(struct Scene *scene, Sequence *seq) " now...\n"); } - seqbase_unique_name_recursive(&scene->ed->seqbase, seqn); + if(dupe_flag & SEQ_DUPE_UNIQUE_NAME) + seqbase_unique_name_recursive(&scene->ed->seqbase, seqn); return seqn; } -Sequence * seq_dupli_recursive(struct Scene *scene, Sequence * seq) +Sequence * seq_dupli_recursive(struct Scene *scene, Sequence * seq, int dupe_flag) { - Sequence * seqn = dupli_seq(scene, seq); + Sequence * seqn = seq_dupli(scene, seq, dupe_flag); if (seq->type == SEQ_META) { - Sequence * s; + Sequence *s; for(s= seq->seqbase.first; s; s = s->next) { - Sequence *n = seq_dupli_recursive(scene, s); + Sequence *n = seq_dupli_recursive(scene, s, dupe_flag); if (n) { BLI_addtail(&seqn->seqbase, n); } @@ -4184,7 +4189,7 @@ Sequence * seq_dupli_recursive(struct Scene *scene, Sequence * seq) return seqn; } -void seqbase_dupli_recursive(Scene *scene, ListBase *nseqbase, ListBase *seqbase, int do_context) +void seqbase_dupli_recursive(Scene *scene, ListBase *nseqbase, ListBase *seqbase, int dupe_flag) { Sequence *seq; Sequence *seqn = 0; @@ -4193,18 +4198,18 @@ void seqbase_dupli_recursive(Scene *scene, ListBase *nseqbase, ListBase *seqbase for(seq= seqbase->first; seq; seq= seq->next) { seq->tmp= NULL; if(seq->flag & SELECT) { - seqn = dupli_seq(scene, seq); + seqn = seq_dupli(scene, seq, dupe_flag); if (seqn) { /*should never fail */ - if(do_context) { + 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_META) - seqbase_dupli_recursive(scene, &seqn->seqbase, &seq->seqbase, do_context); + seqbase_dupli_recursive(scene, &seqn->seqbase, &seq->seqbase, dupe_flag); - if(do_context) { + if(dupe_flag & SEQ_DUPE_CONTEXT) { if (seq == last_seq) { seq_active_set(scene, seqn); } |