diff options
Diffstat (limited to 'rotord/src/graph.cpp')
| -rw-r--r-- | rotord/src/graph.cpp | 106 |
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(); } |
