diff options
| author | Comment <tim@gray.(none)> | 2013-11-09 00:41:33 +0000 |
|---|---|---|
| committer | Comment <tim@gray.(none)> | 2013-11-09 00:41:33 +0000 |
| commit | 01cf1e204ecc12cbd37622cf1898889293d29a50 (patch) | |
| tree | 6e62ec0b77174419ec96a658700129abac2e6ff6 /rotord | |
| parent | c187ad9af0c03d294f31f1145a68ad623a144286 (diff) | |
cycler relative transitions
Diffstat (limited to 'rotord')
| -rw-r--r-- | rotord/src/rotor.h | 67 |
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 ℑ + 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 ℑ + } } 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 |
