diff options
| author | Comment <tim@gray.(none)> | 2013-07-26 22:46:17 +0100 |
|---|---|---|
| committer | Comment <tim@gray.(none)> | 2013-07-26 22:46:17 +0100 |
| commit | f4170d6bfb763ad0af4002277a37dcd1692534d5 (patch) | |
| tree | db32d9753de780063e3afeb64764e13e5c4f5087 /rotord/src/graph.cpp | |
| parent | 3d7eea02aa7a155b84c8c74ecbfd55a1941a9297 (diff) | |
tidy files
Diffstat (limited to 'rotord/src/graph.cpp')
| -rw-r--r-- | rotord/src/graph.cpp | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/rotord/src/graph.cpp b/rotord/src/graph.cpp new file mode 100644 index 0000000..59f7361 --- /dev/null +++ b/rotord/src/graph.cpp @@ -0,0 +1,150 @@ +#include "rotor.h" + +using namespace Rotor; +const string Graph::toString(){ + string xmlgraph; + if (loaded) { + xml.copyXmlToString(xmlgraph); + return xmlgraph; + } + else return ""; +} +vector<Node*> Graph::find_nodes(const string &type){ + vector<Node*> found; + for (std::unordered_map<string,Node*>::iterator it=nodes.begin();it!=nodes.end();++it) { + if (it->second->type==type) found.push_back(it->second); + } + return found; +}; +Node* Graph::find_node(const string &type){ + for (std::unordered_map<string,Node*>::iterator it=nodes.begin();it!=nodes.end();++it) { + if (it->second->type==type) return it->second; + } + 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")); + return signal_output->render(duration,framerate,signal_xml); + } + cerr<<"Rotor: signal output node not found"<<endl; + + 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){ + if (!dynamic_cast<Video_loader*>(i)->isLoaded) { + cerr<<"Rotor: all loaders must be populated before rendering"<<endl; + return false; + } + } + if (find_node("video_output")) { + Video_output *video_output=dynamic_cast<Video_output*>(find_node("video_output")); + return video_output->render(duration,framerate,output_filename,audio_filename,progress,outW,outH); + } + + 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; + outH=h; + return true; + } + else return false; +} +bool Graph::load(string data){ + if (xml.loadFromBuffer(data)){ + return parseXml(); + } + return false; +} +bool Graph::loadFile(string &filename){ + loaded=false; + printf("loading graph: %s\n",filename.c_str()); + if(xml.loadFile(filename) ){ + return parseXml(); + } + else return false; +} +bool Graph::parseXml(){ + init(xml.getAttribute("patchbay","ID","",0),xml.getValue("patchbay","",0)); + if(xml.pushTag("patchbay")) { + int n1=xml.getNumTags("node"); + for (int i1=0;i1<n1;i1++){ + map<string,string> settings; + vector<string> attrs; + xml.getAttributeNames("node",attrs,i1); + for (auto& attr: attrs) { + settings[attr]=xml.getAttribute("node",attr,"",i1); + //cerr << "Got attribute: " << attr << ":" << xml.getAttribute("node",attr,"",i1) << endl; + } + settings["description"]=xml.getValue("node","",i1); + Node* node=factory.create(settings); + if (node) { + string nodeID=xml.getAttribute("node","ID","",i1); + cerr << "Rotor: created 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; + } + 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; + } + 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; + } + 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; + } + int n4=xml.getNumTags("parameter_input"); + 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; + } + 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; + } + 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)); + } + if (n5>0) cerr << "Rotor: found " << n5 << " extra parameters for node '" << nodeID << "'" << endl; + + xml.popTag(); + } + } + else { + cerr << "Rotor: graph loader cannot find node '" << xml.getAttribute("node","type","",i1) << "'" << endl; + return false; + } + } + xml.popTag(); + } + loaded=true; + return true; +}
\ No newline at end of file |
