From 01cf1e204ecc12cbd37622cf1898889293d29a50 Mon Sep 17 00:00:00 2001 From: Comment Date: Sat, 9 Nov 2013 00:41:33 +0000 Subject: cycler relative transitions --- rotord/src/rotor.h | 67 +++++++++++++++++++++++++++++++++++++++++------------- 1 file 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 &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 "<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.timeintVal){ @@ -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 &_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 -- cgit v1.2.3