diff options
Diffstat (limited to 'rotord')
| -rw-r--r-- | rotord/04.xml | 12 | ||||
| -rwxr-xr-x | rotord/rotor.cpp | 4 | ||||
| -rwxr-xr-x | rotord/rotor.h | 57 |
3 files changed, 54 insertions, 19 deletions
diff --git a/rotord/04.xml b/rotord/04.xml index fe5c3e1..7552ae3 100644 --- a/rotord/04.xml +++ b/rotord/04.xml @@ -6,12 +6,18 @@ </node> <node ID="03" type="video_input" output="image">performance video </node> - <node ID="04" type="video_cycler" output="image">video cycler + <node ID="04" type="video_input" output="image">performance video + </node> + <node ID="05" type="video_input" output="image">performance video + </node> + <node ID="06" type="video_cycler" output="image">video cycler <signal_input from="01">switching signal</signal_input> <image_input from="02">image to switch</image_input> <image_input from="03">image to switch</image_input> + <image_input from="04">image to switch</image_input> + <image_input from="05">image to switch</image_input> </node> - <node ID="05" type="video_output">video output - <image_input from="04">image to output</image_input> + <node ID="07" type="video_output">video output + <image_input from="06">image to output</image_input> </node> </patchbay> diff --git a/rotord/rotor.cpp b/rotord/rotor.cpp index 4ed8de4..9e42f47 100755 --- a/rotord/rotor.cpp +++ b/rotord/rotor.cpp @@ -40,7 +40,7 @@ bool Signal_output::render(const float duration, const float framerate,string &x float step=1.0f/framerate; float v=0.0f; for (float f=0.0f;f<duration;f+=step) { - float u=get_output(Time_spec(f,framerate)); + float u=get_output(Time_spec(f,framerate,duration)); if (!fequal(u,v)) { xml_out+=("<signal time='"+ofToString(f)+"'>"+ofToString(u)+"</signal>\n"); v=u; @@ -190,7 +190,7 @@ bool Video_output::render(const float duration, const float framerate,const stri af+=exporter->get_audio_step(); } - Image* i=get_output(Frame_spec(vf,framerate,outW,outH)); + Image* i=get_output(Frame_spec(vf,framerate,duration,outW,outH)); if (i) { exporter->encodeFrame(i->RGBdata); } diff --git a/rotord/rotor.h b/rotord/rotor.h index 60138fe..884d822 100755 --- a/rotord/rotor.h +++ b/rotord/rotor.h @@ -114,17 +114,18 @@ namespace Rotor { class Time_spec{ public: Time_spec(){}; - Time_spec(float _time,float _framerate){ time=_time; framerate=_framerate; }; + Time_spec(float _time,float _framerate,float _duration){ time=_time; framerate=_framerate; duration=_duration;}; float time; float framerate; + float duration; Time_spec lastframe() const{ - return Time_spec(time-(1.0f/framerate),framerate); + return Time_spec(time-(1.0f/framerate),framerate,duration); } }; class Frame_spec: public Time_spec{ public: - Frame_spec(float _time,float _framerate,int _w,int _h){ time=_time; framerate=_framerate; w=_w; h=_h;}; - Frame_spec(int _frame,float _framerate,int _w,int _h){ time=((float)_frame)/framerate; framerate=_framerate; w=_w; h=_h;}; + Frame_spec(float _time,float _framerate,float _duration,int _w,int _h){ time=_time; framerate=_framerate; duration=_duration; w=_w; h=_h;}; + Frame_spec(int _frame,float _framerate,float _duration,int _w,int _h){ time=((float)_frame)/_framerate; Frame_spec(time,_framerate,_duration,_w,_h);}; //float time; //this hould probably be implemented with a num/denom scheme eventually for accuracy //float framerate; @@ -202,11 +203,24 @@ namespace Rotor { } else { for (int i=0;i<w*h*3;i++){ - RGBdata[i]=(unsigned char)(((int)other.RGBdata[i]+(int)RGBdata[i])&0x00FF); + //creates rainbow overload RGBdata[i]=(unsigned char)(((int)other.RGBdata[i]+(int)RGBdata[i])&0x00FF); + RGBdata[i]=(unsigned char)min((int)other.RGBdata[i]+(int)RGBdata[i],0x00FF); } } return *this; } + Image * operator*(const float &amount) { + Image *other=new Image(); + other->setup(w,h); + uint8_t *LUT=new uint8_t[0xFF]; + for (int i=0;i<0xFF;i++) { + LUT[i]=(uint8_t)min(0xFF,max(0,(int)(i*amount))); + } + for (int i=0;i<w*h*3;i++){ + other->RGBdata[i]=LUT[RGBdata[i]]; + } + return other; + } uint8_t *RGBdata; uint8_t *Adata; uint16_t *Zdata; @@ -323,6 +337,17 @@ namespace Rotor { int outputNo; vampHost::Analyser analyser; }; + class Track_time: public Signal_node { + public: + Track_time(){}; + Track_time(map<string,string> &settings) { + base_settings(settings); + }; + Track_time* clone(map<string,string> &_settings) { return new Track_time(_settings);}; + const float get_output(const Time_spec &time) { + return time.time/time.duration; + } + }; class Signal_divide: public Signal_node { public: Signal_divide(){}; @@ -432,8 +457,7 @@ namespace Rotor { if (inputs.size()) { if (image_inputs[0]->connection){ if (inputs[0]->connection) { - Time_spec requested=Time_spec(frame.time,frame.framerate); - if (fmoreorequal(1.0f,(((Signal_node*)inputs[0]->connection)->get_output(requested)))) { + if (fmoreorequal(1.0f,(((Signal_node*)inputs[0]->connection)->get_output((Time_spec)frame)))) { Image *in=(((Image_node*)image_inputs[0]->connection)->get_output(frame)); image->setup(frame.w,frame.h); for (int i=0;i<in->w*in->h*3;i++) { @@ -508,9 +532,8 @@ namespace Rotor { bool load(const string &filename); Image *get_output(const Frame_spec &frame){ int which_input=0; - Time_spec requested=Time_spec(frame.time,frame.framerate); if (inputs[0]->connection) { - which_input=((int)((Signal_node*)inputs[0]->connection)->get_output(requested))%image_inputs.size(); + which_input=((int)((Signal_node*)inputs[0]->connection)->get_output((Time_spec)frame))%image_inputs.size(); } if (image_inputs.size()) { if (image_inputs[which_input]->connection){ @@ -610,6 +633,7 @@ namespace Rotor { base_settings(settings); duration=find_setting(settings,"duration",1.0f); number=find_setting(settings,"number",1); + fadeto=find_setting(settings,"fadeto",1.0f); levels_settings(settings); image=new Image(); lastframe=-1; @@ -622,7 +646,7 @@ namespace Rotor { images.clear(); lastframe=-1; //calculate frame interval - interval=(int)((duration/number)*frame.framerate); + interval=(int)(((duration/number)*frame.framerate)+0.5); total=interval*number; } int thisframe=frame.frame(); @@ -657,11 +681,16 @@ namespace Rotor { images[absframe]=new Image(image->w,image->h); //cerr<<"Rotor: prepared image ("<<images[absframe].w<<"x"<<images[absframe].h<<")"<<endl; - Frame_spec wanted=Frame_spec(absframe,frame.framerate,frame.w,frame.h); + Frame_spec wanted=Frame_spec(absframe,frame.framerate,frame.duration,frame.w,frame.h); apply_LUT(*(((Image_node*)image_inputs[0]->connection)->get_output(wanted)),*images[absframe]); } //cerr<<"Rotor: about to apply image ("<<images[absframe].w<<"x"<<images[absframe].h<<")"<<endl; - (*image)+=*images[absframe]; + if (fless(fadeto,1.0f)){ + Image *temp=*images[absframe]*((float)number/((fadeto*number)+((1.0-fadeto)*i))); + (*image)+=*temp; + delete temp; + } + else (*image)+=*images[absframe]; } } //for (int i=0;i<frame.w*frame.h*3;i++){ @@ -677,7 +706,7 @@ namespace Rotor { } Echo_trails* clone(map<string,string> &_settings) { return new Echo_trails(_settings);}; private: - float duration; + float duration,fadeto; int number; int interval,total,lastframe; //number of frames between displayed echoes unordered_map<int,Image*> images; @@ -709,7 +738,7 @@ namespace Rotor { //?? is it faster than using strings?? string description; std::unordered_map<string,Node*> nodes; - vector<Node*> find_nodes(const string &type); + vector<Node*> find_nodes(const string &type); //could be a way of finding a set based on capabilities? Node* find_node(const string &type); bool signal_render(string &signal_xml,const float framerate); bool video_render(const string &output_filename,const string &audio_filename,const float framerate,float& progress); |
