summaryrefslogtreecommitdiff
path: root/rotord
diff options
context:
space:
mode:
authorTim Redfern <tim@herge.(none)>2013-05-13 18:29:16 +0100
committerTim Redfern <tim@herge.(none)>2013-05-13 18:29:16 +0100
commitf780d225c3a91dfb3a480bb734446858321002a0 (patch)
tree6f6f171afb7643676c71072681d57ece7b862712 /rotord
parent574c15ebe9989d079eee42b9cee4be19333fe24e (diff)
new sins work
Diffstat (limited to 'rotord')
-rw-r--r--rotord/04.xml12
-rwxr-xr-xrotord/rotor.cpp4
-rwxr-xr-xrotord/rotor.h57
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);