removing sequence strip overlap didnt adjust the animation key time

single images were not having their animation data transformed correctly
made sequence strip opacity 0-1 rather then 0-100 in RNA
This commit is contained in:
Campbell Barton
2009-12-21 16:57:39 +00:00
parent 76ce02ddc0
commit 1f8cd19d4b
6 changed files with 36 additions and 27 deletions

View File

@@ -188,8 +188,8 @@ void seq_single_fix(struct Sequence *seq);
int seq_test_overlap(struct ListBase * seqbasep, struct Sequence *test);
struct ListBase *seq_seqbase(struct ListBase *seqbase, struct Sequence *seq);
void seq_offset_animdata(struct Scene *scene, struct Sequence *seq, int ofs);
int shuffle_seq(struct ListBase * seqbasep, struct Sequence *test);
int shuffle_seq_time(ListBase * seqbasep);
int shuffle_seq(struct ListBase * seqbasep, struct Sequence *test, struct Scene *evil_scene);
int shuffle_seq_time(ListBase * seqbasep, struct Scene *evil_scene);
int seqbase_isolated_sel_check(struct ListBase *seqbase);
void free_imbuf_seq(struct Scene *scene, struct ListBase * seqbasep, int check_mem_usage);

View File

@@ -3442,13 +3442,15 @@ int seq_test_overlap(ListBase * seqbasep, Sequence *test)
}
static void seq_translate(Sequence *seq, int delta)
static void seq_translate(Scene *evil_scene, Sequence *seq, int delta)
{
seq_offset_animdata(evil_scene, seq, delta);
seq->start += delta;
if(seq->type==SEQ_META) {
Sequence *seq_child;
for(seq_child= seq->seqbase.first; seq_child; seq_child= seq_child->next) {
seq_translate(seq_child, delta);
seq_translate(evil_scene, seq_child, delta);
}
}
@@ -3456,7 +3458,7 @@ static void seq_translate(Sequence *seq, int delta)
}
/* return 0 if there werent enough space */
int shuffle_seq(ListBase * seqbasep, Sequence *test)
int shuffle_seq(ListBase * seqbasep, Sequence *test, Scene *evil_scene)
{
int orig_machine= test->machine;
test->machine++;
@@ -3484,7 +3486,7 @@ int shuffle_seq(ListBase * seqbasep, Sequence *test)
test->machine= orig_machine;
new_frame = new_frame + (test->start-test->startdisp); /* adjust by the startdisp */
seq_translate(test, new_frame - test->start);
seq_translate(evil_scene, test, new_frame - test->start);
calc_sequence(test);
return 0;
@@ -3540,7 +3542,7 @@ static int shuffle_seq_time_offset(ListBase * seqbasep, char dir)
return tot_ofs;
}
int shuffle_seq_time(ListBase * seqbasep)
int shuffle_seq_time(ListBase * seqbasep, Scene *evil_scene)
{
/* note: seq->tmp is used to tag strips to move */
@@ -3553,7 +3555,7 @@ int shuffle_seq_time(ListBase * seqbasep)
if(offset) {
for(seq= seqbasep->first; seq; seq= seq->next) {
if(seq->tmp) {
seq_translate(seq, offset);
seq_translate(evil_scene, seq, offset);
seq->flag &= ~SEQ_OVERLAP;
}
}

View File

@@ -548,7 +548,7 @@ static int sequencer_add_effect_strip_exec(bContext *C, wmOperator *op)
RNA_float_get_array(op->ptr, "color", colvars->col);
}
if(seq_test_overlap(ed->seqbasep, seq)) shuffle_seq(ed->seqbasep, seq);
if(seq_test_overlap(ed->seqbasep, seq)) shuffle_seq(ed->seqbasep, seq, scene);
update_changed_seq_and_deps(scene, seq, 1, 1); /* runs calc_sequence */

View File

@@ -195,7 +195,7 @@ static void change_plugin_seq(Scene *scene, char *str) /* called from fileselect
last_seq->seq2->machine,
last_seq->seq3->machine);
if( seq_test_overlap(ed->seqbasep, last_seq) ) shuffle_seq(ed->seqbasep, last_seq);
if( seq_test_overlap(ed->seqbasep, last_seq) ) shuffle_seq(ed->seqbasep, last_seq, scene);
}
@@ -1395,7 +1395,7 @@ static int sequencer_snap_exec(bContext *C, wmOperator *op)
if(seq->flag & SELECT && !(seq->depth==0 && seq->flag & SEQ_LOCK)) {
seq->flag &= ~SEQ_OVERLAP;
if( seq_test_overlap(ed->seqbasep, seq) ) {
shuffle_seq(ed->seqbasep, seq);
shuffle_seq(ed->seqbasep, seq, scene);
}
}
else if(seq->type & SEQ_EFFECT) {
@@ -1975,7 +1975,7 @@ static int sequencer_separate_images_exec(bContext *C, wmOperator *op)
calc_sequence(seq_new);
seq_new->flag &= ~SEQ_OVERLAP;
if (seq_test_overlap(ed->seqbasep, seq_new)) {
shuffle_seq(ed->seqbasep, seq_new);
shuffle_seq(ed->seqbasep, seq_new, scene);
}
seqUniqueName(scene->ed->seqbasep, seq_new);
@@ -2138,7 +2138,7 @@ static int sequencer_meta_make_exec(bContext *C, wmOperator *op)
active_seq_set(scene, seqm);
if( seq_test_overlap(ed->seqbasep, seqm) ) shuffle_seq(ed->seqbasep, seqm);
if( seq_test_overlap(ed->seqbasep, seqm) ) shuffle_seq(ed->seqbasep, seqm, scene);
seq_update_muting(ed);
@@ -2207,7 +2207,7 @@ static int sequencer_meta_separate_exec(bContext *C, wmOperator *op)
if(seq->flag & SELECT) {
seq->flag &= ~SEQ_OVERLAP;
if( seq_test_overlap(ed->seqbasep, seq) ) {
shuffle_seq(ed->seqbasep, seq);
shuffle_seq(ed->seqbasep, seq, scene);
}
}
}
@@ -2632,7 +2632,7 @@ static int sequencer_swap_exec(bContext *C, wmOperator *op)
if((iseq->type & SEQ_EFFECT) && (seq_is_parent(iseq, active_seq) || seq_is_parent(iseq, seq))) {
/* this may now overlap */
if( seq_test_overlap(ed->seqbasep, iseq) ) {
shuffle_seq(ed->seqbasep, iseq);
shuffle_seq(ed->seqbasep, iseq, scene);
}
}
}

View File

@@ -2365,23 +2365,21 @@ void flushTransSeq(TransInfo *t)
/* flush to 2d vector from internally used 3d vector */
for(a=0, td= t->data, td2d= t->data2d; a<t->total; a++, td++, td2d++) {
tdsq= (TransDataSeq *)td->extra;
seq= tdsq->seq;
new_frame= (int)floor(td2d->loc[0] + 0.5f);
switch (tdsq->sel_flag) {
case SELECT:
if (seq->type != SEQ_META && (seq->depth != 0 || seq_tx_test(seq))) /* for meta's, their children move */
seq->start= new_frame - tdsq->start_offset;
#ifdef XXX_DURIAN_ANIM_TX_HACK
if (seq->type != SEQ_META && seq != seq_prev) {
int ofs = (new_frame - tdsq->start_offset) - seq->start;
if (seq != seq_prev) {
int ofs = (new_frame - tdsq->start_offset) - seq->start; // breaks for single strips - color/image
seq_offset_animdata(t->scene, seq, ofs);
}
#endif
if (seq->type != SEQ_META && (seq->depth != 0 || seq_tx_test(seq))) /* for meta's, their children move */
seq->start= new_frame - tdsq->start_offset;
if (seq->depth==0) {
seq->machine= (int)floor(td2d->loc[1] + 0.5f);
CLAMP(seq->machine, 1, MAXSEQ);
@@ -4130,7 +4128,7 @@ static void freeSeqData(TransInfo *t)
}
}
shuffle_seq_time(seqbasep);
shuffle_seq_time(seqbasep, t->scene);
}
}
#endif

View File

@@ -96,7 +96,7 @@ static void rna_Sequence_frame_change_update(Scene *scene, Sequence *seq)
calc_sequence_disp(seq);
if(seq_test_overlap(seqbase, seq)) {
shuffle_seq(seqbase, seq);
shuffle_seq(seqbase, seq, scene); // XXX - BROKEN!, uses context seqbasep
}
sort_seq(scene);
}
@@ -155,7 +155,7 @@ static void rna_Sequence_channel_set(PointerRNA *ptr, int value)
seq->machine= value;
if( seq_test_overlap(seqbase, seq) ) {
shuffle_seq(seqbase, seq);
shuffle_seq(seqbase, seq, scene); // XXX - BROKEN!, uses context seqbasep
}
sort_seq(scene);
}
@@ -362,6 +362,14 @@ static void rna_Sequence_mute_update(Main *bmain, Scene *scene, PointerRNA *ptr)
rna_Sequence_update(bmain, scene, ptr);
}
/* do_versions? */
static float rna_Sequence_opacity_get(PointerRNA *ptr) {
return ((Sequence*)(ptr->data))->blend_opacity / 100.0f;
}
static void rna_Sequence_opacity_set(PointerRNA *ptr, float value) {
((Sequence*)(ptr->data))->blend_opacity = value * 100.0f;
}
#else
static void rna_def_strip_element(BlenderRNA *brna)
@@ -660,9 +668,10 @@ static void rna_def_sequence(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Blend Mode", "");
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
prop= RNA_def_property(srna, "blend_opacity", PROP_FLOAT, PROP_NONE);
RNA_def_property_range(prop, 0.0f, 100.0f);
prop= RNA_def_property(srna, "blend_opacity", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Blend Opacity", "");
RNA_def_property_float_funcs(prop, "rna_Sequence_opacity_get", "rna_Sequence_opacity_set", NULL); // stupid 0-100 -> 0-1
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
prop= RNA_def_property(srna, "effect_fader", PROP_FLOAT, PROP_NONE);