diff options
| author | Tim Redfern <tim@herge.(none)> | 2013-05-13 18:29:16 +0100 |
|---|---|---|
| committer | Tim Redfern <tim@herge.(none)> | 2013-05-13 18:29:16 +0100 |
| commit | f780d225c3a91dfb3a480bb734446858321002a0 (patch) | |
| tree | 6f6f171afb7643676c71072681d57ece7b862712 /rotord/rotor.h | |
| parent | 574c15ebe9989d079eee42b9cee4be19333fe24e (diff) | |
new sins work
Diffstat (limited to 'rotord/rotor.h')
| -rwxr-xr-x | rotord/rotor.h | 57 |
1 files changed, 43 insertions, 14 deletions
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); |
