summaryrefslogtreecommitdiff
path: root/rotord/src/rotor.h
diff options
context:
space:
mode:
authorComment <tim@gray.(none)>2013-11-09 00:41:33 +0000
committerComment <tim@gray.(none)>2013-11-09 00:41:33 +0000
commit01cf1e204ecc12cbd37622cf1898889293d29a50 (patch)
tree6e62ec0b77174419ec96a658700129abac2e6ff6 /rotord/src/rotor.h
parentc187ad9af0c03d294f31f1145a68ad623a144286 (diff)
cycler relative transitions
Diffstat (limited to 'rotord/src/rotor.h')
-rw-r--r--rotord/src/rotor.h67
1 files changed, 51 insertions, 16 deletions
diff --git a/rotord/src/rotor.h b/rotord/src/rotor.h
index 14397e8..605ee44 100644
--- a/rotord/src/rotor.h
+++ b/rotord/src/rotor.h
@@ -406,6 +406,8 @@ namespace Rotor {
UID="93dd9d76-2d09-11e3-9589-5bbbeea1b304";
segment=0;
segment_start=segment_end=0.0f;
+ prevseg=0;
+ prevseg_start=0.0f;
lastframe=0;
}
Video_cycler(map<string,string> &settings):Video_cycler() {
@@ -423,6 +425,8 @@ namespace Rotor {
if(thisframe==lastframe||thisframe==lastframe+1){
if (segment!=seg){
//start of new segment
+ prevseg=segment;
+ prevseg_start=segment_start;
segment=seg;
segment_start=((Time_spec)frame).time;
//find segment end
@@ -431,7 +435,7 @@ namespace Rotor {
testframe=testframe.nextframe();
}
segment_end=((Time_spec)testframe).time;
- cerr<<"Video_cycler: segment "<<seg<<" start: "<<segment_start<<" end: "<<segment_end<<endl;
+ cerr<<"Video_cycler: segment "<<seg<<" preroll: "<<prevseg_start<<" start: "<<segment_start<<" end: "<<segment_end<<endl;
}
}
else {
@@ -447,12 +451,21 @@ namespace Rotor {
}
segment_start=testframe.time;
segment=seg;
+ if ((int)inputs[0]->get(testframe)!=seg){
+ prevseg=(int)inputs[0]->get(testframe);
+ //handle previous segment
+ while ((int)inputs[0]->get(testframe)==prevseg&&testframe.frame()>1){
+ testframe=testframe.lastframe();
+ }
+ prevseg_start=testframe.time;
+ }
testframe=(Time_spec)frame.nextframe();
while ((int)inputs[0]->get(testframe)==seg&&testframe.time<frame.duration){
testframe=testframe.nextframe();
}
segment_end=((Time_spec)testframe).time;
+
cerr<<"Video_cycler: segment "<<seg<<" start: "<<segment_start<<" end: "<<segment_end<<endl;
}
@@ -461,6 +474,14 @@ namespace Rotor {
float start_time=(((Time_spec)frame).time-segment_start);
float end_time=(((Time_spec)frame).time-segment_end);
+ float in_time=(((Time_spec)frame).time-segment_start);
+ //time in seconds for the incoming sequence: starts at 0
+ float out_time=(((Time_spec)frame).time-prevseg_start);
+ //time in seconds for the outgoing sequence:
+ //starts at how many seconds the outgoing has got to
+ //so we need the previous segmente duration
+
+
Frame_spec inframe=frame;
Frame_spec outframe=frame;
switch (attributes["time_mode"]->intVal){
@@ -468,8 +489,8 @@ namespace Rotor {
inframe=frame;
break;
case CYCLER_rel:
- inframe=Frame_spec(start_time,frame.framerate,frame.duration,frame.w,frame.h,frame.audio);
- outframe=Frame_spec(end_time,frame.framerate,frame.duration,frame.w,frame.h,frame.audio);
+ inframe=Frame_spec(in_time,frame.framerate,frame.duration,frame.w,frame.h,frame.audio);
+ outframe=Frame_spec(out_time,frame.framerate,frame.duration,frame.w,frame.h,frame.audio);
break;
}
@@ -482,20 +503,33 @@ namespace Rotor {
//we have 2 times here
if (attributes["mode"]->intVal==CYCLER_mix&&image_inputs.size()>1){
- int im1=((int)inputs[0]->get((Time_spec)frame))%image_inputs.size();
- int im2=(im1+1)%image_inputs.size();
+ int im1=seg%image_inputs.size();
+ int im2=prevseg%image_inputs.size();
- float f=fmod(inputs[0]->get((Time_spec)frame),1.0f);
- Image *in1=image_inputs[im1]->get(inframe);
+ float f;
+
+ switch (attributes["length_mode"]->intVal){
+ case CYCLER_seconds:
+ f=min(1.0f,in_time/parameters["transition_length"]->value);
+ break;
+ case CYCLER_fraction:
+ f=min(1.0f,(in_time/(segment_end-segment_start))/parameters["transition_length"]->value);
+ break;
+ }
+
+
+ Image *in1=image_inputs[im1]->get(attributes["time_mode"]->intVal==CYCLER_abs?frame:inframe);
if (in1){
- Image *in2=image_inputs[im2]->get(outframe);
- if (in2){
- image=(*in1);
- image*=(1.0f-f);
- Image i2=(*in2);
- i2*=f;
- image+=i2;
- return &image;
+ if (f<1.0f) {
+ Image *in2=image_inputs[im2]->get(outframe);
+ if (in2){
+ image=(*in1);
+ image*=f;
+ Image i2=(*in2);
+ i2*=(1.0f-f);
+ image+=i2;
+ return &image;
+ }
}
return in1;
}
@@ -512,7 +546,8 @@ namespace Rotor {
Video_cycler* clone(map<string,string> &_settings) { return new Video_cycler(_settings);};
private:
float segment_start,segment_end;
- int segment;
+ float prevseg_start;
+ int segment,prevseg;
int lastframe;
};
#define VIDEOFRAMES_frame 1