[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [60386] branches/soc-2013-vse/source/ blender/sequencer: Fix for adding non-replace strips into vse.
Alexander Kuznetsov
kuzsasha at gmail.com
Fri Sep 27 08:05:19 CEST 2013
Revision: 60386
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=60386
Author: alexk
Date: 2013-09-27 06:05:18 +0000 (Fri, 27 Sep 2013)
Log Message:
-----------
Fix for adding non-replace strips into vse. Thanks Schlaile for pointing it out.
Modified Paths:
--------------
branches/soc-2013-vse/source/blender/sequencer/sequencer_seqChannel.cpp
branches/soc-2013-vse/source/blender/sequencer/sequencer_seqChannel.h
branches/soc-2013-vse/source/blender/sequencer/sequencer_seqFrame.cpp
branches/soc-2013-vse/source/blender/sequencer/sequencer_seqOutputImage.cpp
branches/soc-2013-vse/source/blender/sequencer/sequencer_seqRenderNode.cpp
branches/soc-2013-vse/source/blender/sequencer/sequencer_seqRenderNode.h
Modified: branches/soc-2013-vse/source/blender/sequencer/sequencer_seqChannel.cpp
===================================================================
--- branches/soc-2013-vse/source/blender/sequencer/sequencer_seqChannel.cpp 2013-09-26 22:27:51 UTC (rev 60385)
+++ branches/soc-2013-vse/source/blender/sequencer/sequencer_seqChannel.cpp 2013-09-27 06:05:18 UTC (rev 60386)
@@ -1 +1,29 @@
-
+#include "sequencer_seqChannel.h"
+
+
+int seqChannel::find_seq(int size, Sequence *seq)
+{
+
+ while(size >= 0)
+ {
+ size--;
+ if(this[size].seq == seq)
+ break;
+
+ }
+
+ return size;
+}
+
+int seqChannel::find_next_bellow(int size)
+{
+ while(size >= 0)
+ {
+ size--;
+ if(this[size].seq)
+ break;
+
+ }
+
+ return size;
+}
Modified: branches/soc-2013-vse/source/blender/sequencer/sequencer_seqChannel.h
===================================================================
--- branches/soc-2013-vse/source/blender/sequencer/sequencer_seqChannel.h 2013-09-26 22:27:51 UTC (rev 60385)
+++ branches/soc-2013-vse/source/blender/sequencer/sequencer_seqChannel.h 2013-09-27 06:05:18 UTC (rev 60386)
@@ -10,7 +10,7 @@
class seqChannel
{
public:
- Sequence *seq;
+ struct Sequence *seq;
seqRenderNode *rnode;
@@ -21,7 +21,10 @@
}
+ int find_seq(int size, Sequence *seq);
+ int find_next_bellow(int size);
+
MEM_CXX_CLASS_ALLOC_FUNCS("SeqChannel");
Modified: branches/soc-2013-vse/source/blender/sequencer/sequencer_seqFrame.cpp
===================================================================
--- branches/soc-2013-vse/source/blender/sequencer/sequencer_seqFrame.cpp 2013-09-26 22:27:51 UTC (rev 60385)
+++ branches/soc-2013-vse/source/blender/sequencer/sequencer_seqFrame.cpp 2013-09-27 06:05:18 UTC (rev 60386)
@@ -19,7 +19,7 @@
Retain();
- seqRenderNode *rtree = do_frame_id(&scene->ed->seqbase, frame_time, 0);
+ seqRenderNode *rtree = seqRenderNode::generate_full_tree(&scene->ed->seqbase, frame_time, 0);
Modified: branches/soc-2013-vse/source/blender/sequencer/sequencer_seqOutputImage.cpp
===================================================================
--- branches/soc-2013-vse/source/blender/sequencer/sequencer_seqOutputImage.cpp 2013-09-26 22:27:51 UTC (rev 60385)
+++ branches/soc-2013-vse/source/blender/sequencer/sequencer_seqOutputImage.cpp 2013-09-27 06:05:18 UTC (rev 60386)
@@ -10,7 +10,7 @@
seqBucket *seqOutputImage::createBucketFromTree(seqEngine *se, seqRenderNode *rtree, seqFrame *frm, seqOutputImage *out, int type, seqCanvas *canvas, int level)
{
- Sequence *seq = rtree->data;
+ Sequence *seq = rtree->get_data();
seqBucket *b = new seqBucket(se);
seqImageStackInfo ti;
@@ -26,55 +26,90 @@
ti.format = SEQ_ING_FORMAT_RGBA;
outd = b->new_image_on_stack(ti);
- seqEffect *efff = seqGetEffectFromType(seq->type);
+ seqEffect *efff;
+ void *eff_data;
- if(rtree && seq && seq->strip)
+ seqRenderNode *high = rtree->get_input_high();
+
+ if(seq)
{
- Strip *scene = seq->strip;
+ efff = seqGetEffectFromType(seq->type);
+ if(!efff)
+ {
+ printf("Unregistered effect type \n");
+ }
- curcanvas.translate(scene->transformation.TranX, scene->transformation.TranY);
- curcanvas.rotate(scene->transformation.rotRad);
- curcanvas.scale(scene->transformation.ScaleX, scene->transformation.ScaleY);
- }
+ if(rtree && seq && seq->strip)
+ {
+ Strip *scene = seq->strip;
+ curcanvas.translate(scene->transformation.TranX, scene->transformation.TranY);
+ curcanvas.rotate(scene->transformation.rotRad);
+ curcanvas.scale(scene->transformation.ScaleX, scene->transformation.ScaleY);
+ }
+
#if 0
- if(seq->type == SEQ_TYPE_ALPHAOVER)
- {
- seqEffect *efff = seqGetEffectFromType(SEQ_TYPE_WAVEFORM);
+ if(seq->type == SEQ_TYPE_ALPHAOVER)
+ {
+ seqEffect *efff = seqGetEffectFromType(SEQ_TYPE_WAVEFORM);
- efff->gen_command_for_bucket(b, seq, NULL, frm, &curcanvas, &outd, &ind[0]);
- outd = ind[0];
- }
+ efff->gen_command_for_bucket(b, seq, NULL, frm, &curcanvas, &outd, &ind[0]);
+ outd = ind[0];
+ }
#endif
- for (SequenceModifierData *smd = (SequenceModifierData*)seq->modifiers.last;
- smd; smd = (SequenceModifierData*)smd->prev) {
+ for (SequenceModifierData *smd = (SequenceModifierData*)seq->modifiers.last;
+ smd; smd = (SequenceModifierData*)smd->prev) {
- /* modifier is muted, do nothing */
- if (smd->flag & SEQUENCE_MODIFIER_MUTE)
- continue;
+ /* modifier is muted, do nothing */
+ if (smd->flag & SEQUENCE_MODIFIER_MUTE)
+ continue;
- seqEffect *modeff = seqGetEffectFromType(0x38+smd->type);
+ seqEffect *modeff = seqGetEffectFromType(0x38+smd->type);
- if(modeff)
+ if(modeff)
+ {
+ modeff->gen_command_for_bucket(b, seq, smd+1, frm, &curcanvas, &outd, &ind[0]);
+ outd = ind[0];
+ }
+ }
+
+ eff_data = seq->effectdata;
+ }
+ else if(high && high->get_data())
+ {
+ // blending for this sequence
+ seq = high->get_data();
+ efff = seqGetEffectFromType(seq->blend_mode);
+ if(!efff)
{
- modeff->gen_command_for_bucket(b, seq, smd+1, frm, &curcanvas, &outd, &ind[0]);
- outd = ind[0];
+ printf("Unregistered effect type \n");
}
- }
+ TransitionVars blend_data;
+ blend_data.factor = 0.01f * seq->blend_opacity;
+ eff_data = (void*)&blend_data;
- if(seq->type == SEQ_TYPE_MOVIE)
+ } else
{
- seqEffect *efff = seqGetEffectFromType(SEQ_TYPE_TRANSFORMATION);
+ printf("Error in the render tree");
+ BLI_assert(0);
- efff->gen_command_for_bucket(b, seq, NULL, frm, &curcanvas, &outd, &ind[0]);
+ }
+
+ int newin = efff ? efff->get_num_inputs() : 0;
+
+ // initial input from file
+ if(newin == 0)
+ {
+ seqEffect *lef = seqGetEffectFromType(SEQ_TYPE_TRANSFORMATION);
+
+ lef->gen_command_for_bucket(b, seq, NULL, frm, &curcanvas, &outd, &ind[0]);
outd = ind[0];
}
- int newin = efff->get_num_inputs();
for(int i = newin-1; i >= 0; i--)
{
ti = curcanvas.get_ssi();
@@ -83,7 +118,7 @@
}
- efff->gen_command_for_bucket(b, seq, seq->effectdata, frm, &curcanvas,
+ efff->gen_command_for_bucket(b, seq, eff_data, frm, &curcanvas,
&outd, newin>0?&ind[0]:NULL, newin>1?&ind[1]:NULL);
@@ -97,10 +132,12 @@
int dl_num = 0;
- if(newin >= 1 && rtree->input_low)
+ seqRenderNode *low = rtree->get_input_low();
+
+ if(newin >= 1 && low)
{
- seqBucket *lb = createBucketFromTree(se, rtree->input_low, frm, out, type, &curcanvas, level+1);
+ seqBucket *lb = createBucketFromTree(se, low, frm, out, type, &curcanvas, level+1);
lb->Retain();
@@ -111,9 +148,11 @@
b->dependencies.push_back(di);
dl_num++;
- if(newin >= 2 && rtree->input_high)
+ high = rtree->get_input_high();
+
+ if(newin >= 2 && high)
{
- seqBucket *hb = createBucketFromTree(se, rtree->input_high, frm, out, type, &curcanvas, level+1);
+ seqBucket *hb = createBucketFromTree(se, high, frm, out, type, &curcanvas, level+1);
hb->Retain();
Modified: branches/soc-2013-vse/source/blender/sequencer/sequencer_seqRenderNode.cpp
===================================================================
--- branches/soc-2013-vse/source/blender/sequencer/sequencer_seqRenderNode.cpp 2013-09-26 22:27:51 UTC (rev 60385)
+++ branches/soc-2013-vse/source/blender/sequencer/sequencer_seqRenderNode.cpp 2013-09-27 06:05:18 UTC (rev 60386)
@@ -4,41 +4,12 @@
#include "effects/sequencer_seqEffect.h"
-static int seq_seqChannel_find_seq(seqChannel *chan_arr, int size, Sequence *seq)
-{
- while(size >= 0)
- {
- size--;
- if(chan_arr[size].seq == seq)
- break;
-
- }
-
- return size;
-}
-
-static int seq_seqChannel_find_bellow(seqChannel *chan_arr, int size, Sequence *seq)
-{
- while(size >= 0)
- {
- size--;
- if(chan_arr[size].seq)
- break;
-
- }
-
- return size;
-}
-
-
-
-
seqRenderNode::seqRenderNode(Sequence *s):
- type(0),
- data(s),
input_low(NULL),
- input_high(NULL)
+ input_high(NULL),
+ data(s),
+ type(0)
{
if(s)
@@ -51,9 +22,6 @@
};
Retain();
-
-
-
}
@@ -67,38 +35,40 @@
-seqRenderNode * seqRenderNode::make_subtree(seqChannel *chan_arr, int size, int pos) const
+seqRenderNode * seqRenderNode::make_subtree(seqChannel *chan_arr, int size, int pos)
{
seqRenderNode *r = NULL;
seqRenderNode *sn = NULL;
int numinputs;
- if(pos < 0)
+ if(pos < 0 || pos >= size)
return NULL;
+#if 0
if(chan_arr[pos].rnode)
{
chan_arr[pos].rnode->Retain();
return chan_arr[pos].rnode;
}
+#endif
-
sn = new seqRenderNode(chan_arr[pos].seq);
- numinputs = seqGetEffectFromType(chan_arr[pos].seq->type)->get_num_inputs();
+ seqEffect *ef = seqGetEffectFromType(chan_arr[pos].seq->type);
+ numinputs = ef ? ef->get_num_inputs() : 0;
if(numinputs >= 1)
{
- int si = seq_seqChannel_find_seq(chan_arr, size-1, chan_arr[pos].seq->seq1);
+ int si = chan_arr->find_seq(size-1, chan_arr[pos].seq->seq1);
sn->input_low = make_subtree(chan_arr, size-1, si);
}
if(numinputs >= 2)
{
- int si = seq_seqChannel_find_seq(chan_arr, size-1, chan_arr[pos].seq->seq2);
+ int si = chan_arr->find_seq(size-1, chan_arr[pos].seq->seq2);
sn->input_high = make_subtree(chan_arr, size-1, si);
@@ -107,22 +77,26 @@
if(chan_arr[pos].seq->blend_mode != SEQ_BLEND_REPLACE)
{
- int si = seq_seqChannel_find_bellow(chan_arr, size-1, 0);
+ int si = chan_arr->find_next_bellow(size-1);
r = new seqRenderNode(NULL);
- r->input_high = sn;
r->input_low = make_subtree(chan_arr, size-1, si);
-
-
+ // There is nothing bellow
+ if(r->input_low == NULL)
+ {
+ delete r;
+ r = sn;
+ } else
+ {
+ r->input_high = sn;
+ }
} else
{
r = sn;
-
}
-
chan_arr[pos].rnode = r;
return r;
@@ -157,10 +131,25 @@
}
+Sequence *seqRenderNode::get_data()
+{
+ return data;
+}
+seqRenderNode *seqRenderNode::get_input_low()
+{
+ return input_low;
+}
-seqRenderNode * do_frame_id(ListBase *seqbasep, int cfra, int chanshown)
+seqRenderNode *seqRenderNode::get_input_high()
{
+ return input_high;
+}
+
+
+
+seqRenderNode * seqRenderNode::generate_full_tree(ListBase *seqbasep, int cfra, int chanshown)
+{
seqChannel seq_arr[MAXSEQ + 1];
int b = chanshown;
@@ -196,7 +185,7 @@
}
}
- seq_tree = seq_tree->make_subtree(seq_arr, cnt, cnt-1);
+ seq_tree = seqRenderNode::make_subtree(seq_arr, cnt, cnt-1);
return seq_tree;
Modified: branches/soc-2013-vse/source/blender/sequencer/sequencer_seqRenderNode.h
===================================================================
--- branches/soc-2013-vse/source/blender/sequencer/sequencer_seqRenderNode.h 2013-09-26 22:27:51 UTC (rev 60385)
+++ branches/soc-2013-vse/source/blender/sequencer/sequencer_seqRenderNode.h 2013-09-27 06:05:18 UTC (rev 60386)
@@ -12,22 +12,25 @@
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list