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:
authorPeter Schlaile <peter@schlaile.de>2006-11-10 01:23:09 +0300
committerPeter Schlaile <peter@schlaile.de>2006-11-10 01:23:09 +0300
commit57a2f7a5b569d1d0564c45e33eae1ebad3cd560b (patch)
tree94a9a2e2613423eccfdcbb68b7f929c344e42f5a /source/blender/src/sequence.c
parent708e327b10195d9e711a55253402f7c374529d29 (diff)
== Sequencer ==
This adds support for "generator effect strips", which don't need necessarily an input strip and my version of Matt Ebb's [ #5035 ] 'Solid Color' sequence strip. TODO: With a little bit more tweaking it will be possible to make animated effect plugins and my still unfinished "Bake"-Strip. For the 'Solid Color'-Effect, to quote Matt: This is nice and simple, just provides a solid colour that's set in a colour picker in the properties popup. This is something we've needed for a long time, and I got totally sick of having to make 'black.png' and 'white.png' just to do fades, so I coded this.
Diffstat (limited to 'source/blender/src/sequence.c')
-rw-r--r--source/blender/src/sequence.c89
1 files changed, 62 insertions, 27 deletions
diff --git a/source/blender/src/sequence.c b/source/blender/src/sequence.c
index f81df5357f9..f34484fea14 100644
--- a/source/blender/src/sequence.c
+++ b/source/blender/src/sequence.c
@@ -229,9 +229,25 @@ void calc_sequence(Sequence *seq)
// seq->start= seq->startdisp= MAX2(seq->seq1->startdisp, seq->seq2->startdisp);
// seq->enddisp= MIN2(seq->seq1->enddisp, seq->seq2->enddisp);
- seq->start= seq->startdisp= MAX3(seq->seq1->startdisp, seq->seq2->startdisp, seq->seq3->startdisp);
- seq->enddisp= MIN3(seq->seq1->enddisp, seq->seq2->enddisp, seq->seq3->enddisp);
- seq->len= seq->enddisp - seq->startdisp;
+ if (seq->seq1) {
+ seq->start= seq->startdisp= MAX3(seq->seq1->startdisp, seq->seq2->startdisp, seq->seq3->startdisp);
+ seq->enddisp= MIN3(seq->seq1->enddisp, seq->seq2->enddisp, seq->seq3->enddisp);
+ seq->len= seq->enddisp - seq->startdisp;
+ } else {
+ if(seq->startofs && seq->startstill) seq->startstill= 0;
+ if(seq->endofs && seq->endstill) seq->endstill= 0;
+
+ seq->startdisp= seq->start + seq->startofs - seq->startstill;
+ seq->enddisp= seq->start+seq->len - seq->endofs + seq->endstill;
+
+ seq->handsize= 10.0; /* 10 frames */
+ if( seq->enddisp-seq->startdisp < 20 ) {
+ seq->handsize= (float)(0.5*(seq->enddisp-seq->startdisp));
+ }
+ else if(seq->enddisp-seq->startdisp > 250) {
+ seq->handsize= (float)((seq->enddisp-seq->startdisp)/25);
+ }
+ }
if(seq->strip && seq->len!=seq->strip->len) {
new_stripdata(seq);
@@ -414,39 +430,53 @@ void do_effect(int cfra, Sequence *seq, StripElem *se)
StripElem *se1, *se2, *se3;
float fac, facf;
int x, y;
+ int early_out;
struct SeqEffectHandle sh = get_sequence_effect(seq);
- if(!sh.execute || se->se1==0 || se->se2==0 || se->se3==0) {
+ if (!sh.execute) { /* effect not supported in this version... */
make_black_ibuf(se->ibuf);
return;
}
+ if(seq->ipo && seq->ipo->curve.first) {
+ do_seq_ipo(seq);
+ fac= seq->facf0;
+ facf= seq->facf1;
+ } else {
+ sh.get_default_fac(seq, cfra, &fac, &facf);
+ }
+
+ if( !(G.scene->r.mode & R_FIELDS) ) facf = fac;
+
+ early_out = sh.early_out(seq, fac, facf);
+
+ if (early_out == -1) { /* no input needed */
+ sh.execute(seq, cfra, fac, facf, se->ibuf->x, se->ibuf->y,
+ 0, 0, 0, se->ibuf);
+ return;
+ }
+
+ if(se->se1==0 || se->se2==0 || se->se3==0) {
+ make_black_ibuf(se->ibuf);
+ return;
+ }
+
/* if metastrip: other se's */
if(se->se1->ok==2) se1= se->se1->se1;
else se1= se->se1;
-
+
if(se->se2->ok==2) se2= se->se2->se1;
else se2= se->se2;
-
+
if(se->se3->ok==2) se3= se->se3->se1;
else se3= se->se3;
-
+
if(se1==0 || se2==0 || se3==0) {
make_black_ibuf(se->ibuf);
return;
}
- if(seq->ipo && seq->ipo->curve.first) {
- do_seq_ipo(seq);
- fac= seq->facf0;
- facf= seq->facf1;
- } else {
- sh.get_default_fac(seq, cfra, &fac, &facf);
- }
-
- if( G.scene->r.mode & R_FIELDS ); else facf= fac;
-
- switch (sh.early_out(seq, fac, facf)) {
+ switch (early_out) {
case 0:
break;
case 1:
@@ -719,6 +749,9 @@ static void do_effect_depend(int cfra, Sequence * seq, StripElem *se)
if( G.scene->r.mode & R_FIELDS ); else facf= fac;
switch (sh.early_out(seq, fac, facf)) {
+ case -1:
+ /* no input needed */
+ break;
case 0:
do_build_seq_depend(seq->seq1, cfra);
do_build_seq_depend(seq->seq2, cfra);
@@ -731,7 +764,9 @@ static void do_effect_depend(int cfra, Sequence * seq, StripElem *se)
break;
}
- do_build_seq_depend(seq->seq3, cfra);
+ if (seq->seq3) {
+ do_build_seq_depend(seq->seq3, cfra);
+ }
}
static void do_build_seq_depend(Sequence * seq, int cfra)
@@ -786,17 +821,17 @@ static void do_build_seq_ibuf(Sequence * seq, int cfra)
/* should the effect be recalculated? */
if(se->ibuf==0
- || (se->se1 != seq->seq1->curelem)
- || (se->se2 != seq->seq2->curelem)
- || (se->se3 != seq->seq3->curelem)) {
- se->se1= seq->seq1->curelem;
- se->se2= seq->seq2->curelem;
- se->se3= seq->seq3->curelem;
+ || (seq->seq1 && se->se1 != seq->seq1->curelem)
+ || (seq->seq2 && se->se2 != seq->seq2->curelem)
+ || (seq->seq3 && se->se3 != seq->seq3->curelem)) {
+ if (seq->seq1) se->se1= seq->seq1->curelem;
+ if (seq->seq2) se->se2= seq->seq2->curelem;
+ if (seq->seq3) se->se3= seq->seq3->curelem;
if(se->ibuf==NULL) {
/* if one of two first inputs are rectfloat, output is float too */
- if((se->se1->ibuf && se->se1->ibuf->rect_float) ||
- (se->se2->ibuf && se->se2->ibuf->rect_float))
+ if((se->se1 && se->se1->ibuf && se->se1->ibuf->rect_float) ||
+ (se->se2 && se->se2->ibuf && se->se2->ibuf->rect_float))
se->ibuf= IMB_allocImBuf((short)seqrectx, (short)seqrecty, 32, IB_rectfloat, 0);
else
se->ibuf= IMB_allocImBuf((short)seqrectx, (short)seqrecty, 32, IB_rect, 0);