#include "rotor.h" using namespace Rotor; const string Graph::toString(){ string xmlgraph; if (loaded) { xml.copyXmlToString(xmlgraph); return xmlgraph; } else return ""; } vector Graph::find_nodes(const string &type){ vector found; for (std::unordered_map::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::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(find_node("signal_output")); return signal_output->render(duration,framerate,signal_xml); } cerr<<"Rotor: signal output node not found"< loaders=find_nodes("video_loader"); for (auto i:loaders){ if (!dynamic_cast(i)->isLoaded) { cerr<<"Rotor: all loaders must be populated before rendering"<(find_node("video_output")); return video_output->render(duration,framerate,output_filename,audio_filename,progress,outW,outH); } cerr<<"Rotor: video output node not found"<64&&h>48){ outW=w; outH=h; return true; } else return false; } bool Graph::load(string data,string media_path){ if (xml.loadFromBuffer(data)){ return parseXml(media_path); } cerr<<"Rotor: failed to load graph from string"< settings; vector 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["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 '"<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: 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;i3image_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: 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"); for (int i4=0;i4parameters.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 if (fromID!="") cerr << "Rotor: linking parameter input " << i4 << " of node: '" << nodeID << "', cannot find target '" << fromID << "'" << endl; } else cerr << "Rotor: cannot find parameter input '" << parameter << "' of "<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 "<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: duplicate node '"<