summaryrefslogtreecommitdiff
path: root/rotord/src/graph.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'rotord/src/graph.cpp')
-rw-r--r--rotord/src/graph.cpp106
1 files changed, 74 insertions, 32 deletions
diff --git a/rotord/src/graph.cpp b/rotord/src/graph.cpp
index 60af1c8..3aa2925 100644
--- a/rotord/src/graph.cpp
+++ b/rotord/src/graph.cpp
@@ -22,6 +22,7 @@ Node* Graph::find_node(const string &type){
}
return nullptr; //can be tested against
};
+/*
bool Graph::signal_render(string &signal_xml,const float framerate) {
if (find_node("signal_output")) {
Signal_output *signal_output=dynamic_cast<Signal_output*>(find_node("signal_output"));
@@ -31,6 +32,7 @@ bool Graph::signal_render(string &signal_xml,const float framerate) {
return false;
}
+*/
bool Graph::video_render(const string &output_filename,const string &audio_filename,const float framerate,float& progress) {
vector<Node*> loaders=find_nodes("video_loader");
for (auto i:loaders){
@@ -47,6 +49,7 @@ bool Graph::video_render(const string &output_filename,const string &audio_filen
cerr<<"Rotor: video output node not found"<<endl;
return false;
}
+
bool Graph::set_resolution(int w,int h){
if (w>64&&h>48){
outW=w;
@@ -83,61 +86,100 @@ bool Graph::parseXml(string media_path){
settings[attr]=xml.getAttribute("node",attr,"",i1);
//cerr << "Got attribute: " << attr << ":" << xml.getAttribute("node",attr,"",i1) << endl;
}
- settings["description"]=xml.getValue("node","",i1);
settings["media_path"]=media_path;
Node* node=factory.create(settings);
if (node) {
string nodeID=xml.getAttribute("node","ID","",i1);
if (nodes.find(nodeID)==nodes.end()){
+ string nodetype=xml.getAttribute("node","type","",i1);
cerr << "Rotor: creating node '"<<nodeID<<"': '"<< xml.getAttribute("node","type","",i1) << "'" << endl;
nodes[nodeID]=node;
if(xml.pushTag("node",i1)) {
int n2=xml.getNumTags("signal_input");
for (int i2=0;i2<n2;i2++){
- nodes[nodeID]->create_signal_input(xml.getValue("signal_input","",i2));
- string fromID=xml.getAttribute("signal_input","from","",i2);
- if (nodes.find(fromID)!=nodes.end()) {
- if (!nodes[nodeID]->inputs[i2]->connect((Signal_node*)nodes[fromID])){
- cerr << "Rotor: graph loader cannot connect input " << i2 << " of node '" << nodeID << "' to node '" << fromID << "'" << endl;
- return false;
+ //TODO expand
+ //nodes[nodeID]->create_signal_input(xml.getAttribute("signal_input","description","",i2),xml.getAttribute("signal_input","title","",i2));
+ if ((nodes[nodeID])->inputs.size()>i2) {
+ string fromID=xml.getAttribute("signal_input","from","",i2);
+ if (nodes.find(fromID)!=nodes.end()) {
+ if (!nodes[nodeID]->inputs[i2]->connect((Signal_node*)nodes[fromID])){
+ cerr << "Rotor: graph loader cannot connect input " << i2 << " of node '" << nodeID << "' to node '" << fromID << "'" << endl;
+ return false;
+ }
+ else cerr << "Rotor: linked input " << i2 << " of node '" << nodeID << "' to node '" << fromID << "'" << endl;
}
- else cerr << "Rotor: linked input " << i2 << " of node '" << nodeID << "' to node '" << fromID << "'" << endl;
+ else cerr << "Rotor: linking input " << i2 << " of node: '" << nodeID << "', cannot find target '" << fromID << "'" << endl;
}
- else cerr << "Rotor: linking input " << i2 << " of node: '" << nodeID << "', cannot find target '" << fromID << "'" << endl;
+ else cerr << "Rotor: input " << i2 << " of node: '" << nodeID << "' does not exist" << endl;
+
}
int n3=xml.getNumTags("image_input");
for (int i3=0;i3<n3;i3++){
- ((Image_node*)nodes[nodeID])->create_image_input(xml.getValue("image_input","",i3));
- string fromID=xml.getAttribute("image_input","from","",i3);
- if (nodes.find(fromID)!=nodes.end()) {
- if (!(((Image_node*)nodes[nodeID])->image_inputs[i3]->connect((Image_node*)nodes[fromID]))){
- cerr << "Rotor: graph loader cannot connect image input " << i3 << " of node '" << nodeID << "' to node '" << fromID << "'" << endl;
- return false;
+ //handle expandable inputs
+ if (((Image_node*)nodes[nodeID])->image_inputs.size()<=i3&((Image_node*)nodes[nodeID])->duplicate_inputs){
+ string desc=((Image_node*)nodes[nodeID])->image_inputs[0]->description;
+ string title=((Image_node*)nodes[nodeID])->image_inputs[0]->title;
+ while(((Image_node*)nodes[nodeID])->image_inputs.size()<=i3){
+ ((Image_node*)nodes[nodeID])->create_image_input(desc,title);
+ }
+ }
+ //((Image_node*)nodes[nodeID])->create_image_input(xml.getValue("image_input","",i3));
+ if (((Image_node*)nodes[nodeID])->image_inputs.size()>i3) {
+ string fromID=xml.getAttribute("image_input","from","",i3);
+ if (nodes.find(fromID)!=nodes.end()) {
+ if (!(((Image_node*)nodes[nodeID])->image_inputs[i3]->connect((Image_node*)nodes[fromID]))){
+ cerr << "Rotor: graph loader cannot connect image input " << i3 << " of node '" << nodeID << "' to node '" << fromID << "'" << endl;
+ return false;
+ }
+ else cerr << "Rotor: linked image input " << i3 << " of node '" << nodeID << "' to node '" << fromID << "'" << endl;
}
- else cerr << "Rotor: linked image input " << i3 << " of node '" << nodeID << "' to node '" << fromID << "'" << endl;
+ else cerr << "Rotor: linking image input " << i3 << " of node: '" << nodeID << "', cannot find target '" << fromID << "'" << endl;
}
- else cerr << "Rotor: linking image input " << i3 << " of node: '" << nodeID << "', cannot find target '" << fromID << "'" << endl;
+ else cerr << "Rotor: image input number " << i3 << " of node: '" << nodeID << "' does not exist" << endl;
}
- int n4=xml.getNumTags("parameter_input");
+ int n4=xml.getNumTags("parameter");
for (int i4=0;i4<n4;i4++){
- nodes[nodeID]->create_parameter_input(xml.getAttribute("parameter_input","parameter","",i4),xml.getValue("parameter_input","",i4));
- string fromID=xml.getAttribute("parameter_input","from","",i4);
- if (nodes.find(fromID)!=nodes.end()) {
- if (!nodes[nodeID]->parameter_inputs[i4]->connect(nodes[fromID])){
- cerr << "Rotor: graph loader cannot connect parameter input " << i4 << " of node '" << nodeID << "' to node '" << fromID << "'" << endl;
- return false;
+ string parameter=xml.getAttribute("parameter","name","",i4);
+ if (nodes[nodeID]->parameters.find(parameter)!=nodes[nodeID]->parameters.end()) {
+ string val=xml.getAttribute("parameter","value","",i4);
+ if (val!="") nodes[nodeID]->parameters.find(parameter)->second->value=ofToFloat(val);
+ string fromID=xml.getAttribute("parameter","from","",i4);
+ if (nodes.find(fromID)!=nodes.end()) {
+ if (!nodes[nodeID]->parameters[parameter]->connect(nodes[fromID])){
+ cerr << "Rotor: graph loader cannot connect parameter input " << i4 << " of node '" << nodeID << "' to node '" << fromID << "'" << endl;
+ return false;
+ }
+ else cerr << "Rotor: linked parameter input " << i4 << " of node '" << nodeID << "' to node '" << fromID << "'" << endl;
}
- else cerr << "Rotor: linked parameter input " << i4 << " of node '" << nodeID << "' to node '" << fromID << "'" << endl;
+ else cerr << "Rotor: linking parameter input " << i4 << " of node: '" << nodeID << "', cannot find target '" << fromID << "'" << endl;
}
- else cerr << "Rotor: linking parameter input " << i4 << " of node: '" << nodeID << "', cannot find target '" << fromID << "'" << endl;
+ else cerr << "Rotor: cannot find parameter input '" << parameter << "' of "<<nodetype<<" "<< nodeID << endl;
}
- nodes[nodeID]->link_params();
- //extra key/value pairs that can be specific to sub-settings
- int n5=xml.getNumTags("parameter");
- for (int i5=0;i5<n5;i5++){
- nodes[nodeID]->set_parameter(xml.getAttribute("parameter","name","",i5),xml.getAttribute("parameter","value","",i5));
+ //still support old parameter_input
+ n4=xml.getNumTags("parameter_input");
+ for (int i4=0;i4<n4;i4++){
+ string parameter=xml.getAttribute("parameter_input","name","",i4);
+ if (nodes[nodeID]->parameters.find(parameter)!=nodes[nodeID]->parameters.end()) {
+ string val=xml.getAttribute("parameter_input","value","",i4);
+ if (val!="") nodes[nodeID]->parameters.find(parameter)->second->value=ofToFloat(val);
+ string fromID=xml.getAttribute("parameter_input","from","",i4);
+ if (nodes.find(fromID)!=nodes.end()) {
+ if (!nodes[nodeID]->parameters[parameter]->connect(nodes[fromID])){
+ cerr << "Rotor: graph loader cannot connect parameter input " << i4 << " of node '" << nodeID << "' to node '" << fromID << "'" << endl;
+ return false;
+ }
+ else cerr << "Rotor: linked parameter input " << i4 << " of node '" << nodeID << "' to node '" << fromID << "'" << endl;
+ }
+ else cerr << "Rotor: linking parameter input " << i4 << " of node: '" << nodeID << "', cannot find target '" << fromID << "'" << endl;
+ }
+ else cerr << "Rotor: cannot find parameter input '" << parameter << "' of "<<nodetype<<" "<< nodeID << endl;
}
- if (n5>0) cerr << "Rotor: found " << n5 << " extra parameters for node '" << nodeID << "'" << endl;
+ //extra key/value pairs that can be specific to sub-settings - WHAT WAS THIS
+ //int n5=xml.getNumTags("parameter");
+ //for (int i5=0;i5<n5;i5++){
+ // nodes[nodeID]->set_parameter(xml.getAttribute("parameter","name","",i5),xml.getAttribute("parameter","value","",i5));
+ //}
+ //if (n5>0) cerr << "Rotor: found " << n5 << " extra parameters for node '" << nodeID << "'" << endl;
xml.popTag();
}