diff options
Diffstat (limited to 'rotord/rotor.h')
| -rwxr-xr-x | rotord/rotor.h | 118 |
1 files changed, 39 insertions, 79 deletions
diff --git a/rotord/rotor.h b/rotord/rotor.h index aab0af9..605ae67 100755 --- a/rotord/rotor.h +++ b/rotord/rotor.h @@ -81,6 +81,7 @@ namespace Rotor { //forward declaration class Node; + class Signal_node; class Render_status{ @@ -111,73 +112,51 @@ namespace Rotor { }; class Signal_input: public Input{ public: - bool connect(Node* source); + bool connect(Signal_node* source); Signal_input(const string &_desc): Input(_desc){}; }; class Node{ - public: - Node(){}; - virtual ~Node(){}; - Node(map<string,string> &settings){ - cerr << "Node:"; - for (map<string,string>::iterator it=settings.begin();it!=settings.end();++it) { - cerr << it->first << "," << it->second << " "; - } - cerr << endl; - description=settings["description"];type=settings["type"];output_type=settings["output"];ID=settings["ID"]; - }; + public:; + virtual Node* clone(map<string,string> &_settings)=0; UUID uid; //every usable node has a UUID int id; - vector<Signal_input*> inputs; //simple node has signal inputs and outputs + vector<Signal_input*> inputs; //simple node can have signal inputs, output depends on node type void create_signal_input(const string &description) {inputs.push_back(new Signal_input(description));}; - void gather_inputs(const float &time) { - for (uint i=0;i<inputs.size();i++){ - if (inputs[i]->connection) inputs[i]->connection->get_output(time); - } - } - float get_output(const float &time) { //default is to pass through first input, if disconnected returns 0 - cerr << "getting output for " << type << "," << ID << endl; - if (inputs.size()) { - if (inputs[0]->connection) return inputs[0]->connection->get_output(time); - } - return 0.0f; - } string description; string type; string output_type; string ID; - }; + string check(map<string,string> &settings,string key){ if (settings.find(key)!=settings.end()) return settings[key]; else return "";}; + void base_settings(map<string,string> &settings) { + description=check(settings,"description"); + type=check(settings,"type"); + output_type=check(settings,"output"); + ID=check(settings,"ID"); + } + }; class Image{ char* data; }; class Signal_node: public Node{ public: - Signal_node(){}; - Signal_node(map<string,string> &settings){ - cerr << "Signal_node:"; - for (map<string,string>::iterator it=settings.begin();it!=settings.end();++it) { - cerr << it->first << "," << it->second << " "; + float get_output(const float &time) { //default is to pass through first input, if disconnected returns 0 + cerr << "getting output for " << type << "," << ID << endl; + if (inputs.size()) { + if (inputs[0]->connection) return ((Signal_node*)(inputs[0]->connection))->get_output(time); } - cerr << endl; - description=settings["description"];type=settings["type"];output_type=settings["output"];ID=settings["ID"]; - }; + return 0.0f; + } }; class Image_node: public Node{ public: vector<Image_input> image_inputs; //image node also has image inputs and outputs - void gather_inputs(const float &time) { - Node::gather_inputs(time); - for (uint i=0;i<image_inputs.size();i++){ - if (image_inputs[i].connection) image_inputs[i].connection->get_output(time); - } - } Image* get_output(float time){ //sample implementation - gather_inputs(time); + //do something with the inputs //and then - return ((Image_node*)image_inputs[0].connection)->image; + return ((Image_node*)image_inputs[0].connection)->get_output(time); } void get_preview(float time); Image* image; //this can be privately allocated or just passed on as the node see fit @@ -189,13 +168,9 @@ namespace Rotor { public: Audio_analysis(){}; Audio_analysis(map<string,string> &settings) { - cerr << "Audio analysis:"; - for (map<string,string>::iterator it=settings.begin();it!=settings.end();++it) { - cerr << it->first << "," << it->second << " "; - } - cerr << endl; - description=settings["description"];type=settings["type"];output_type=settings["output"];ID=settings["ID"]; - }; + base_settings(settings); + }; + Audio_analysis* clone(map<string,string> &_settings) { return new Audio_analysis(_settings);}; float get_output(const float &time) { float t=time; return t; @@ -208,15 +183,13 @@ namespace Rotor { public: Is_new_integer(){}; Is_new_integer(map<string,string> &settings) { - cerr << "Is new integer:"; - for (map<string,string>::iterator it=settings.begin();it!=settings.end();++it) { - cerr << it->first << "," << it->second << " "; - } - cerr << endl; - description=settings["description"];type=settings["type"];output_type=settings["output"];ID=settings["ID"]; - }; + base_settings(settings); + }; + Is_new_integer* clone(map<string,string> &_settings) { return new Is_new_integer(_settings);}; float get_output(const float &time) { - if (((int)Node::get_output(time))>((int)Node::get_output(time-.04))) return 1.0f; + if (inputs[0]->connection) { + if (((int)((Signal_node*)(inputs[0]->connection))->get_output(time))>((int)((Signal_node*)(inputs[0]->connection))->get_output(time-.04))) return 1.0f; + } else return 0.0f; } }; @@ -224,41 +197,28 @@ namespace Rotor { public: Signal_output(){}; Signal_output(map<string,string> &settings) { - cerr << "Signal output:"; - for (map<string,string>::iterator it=settings.begin();it!=settings.end();++it) { - cerr << it->first << "," << it->second << " "; - } - cerr << endl; - description=settings["description"];type=settings["type"];output_type=settings["output"];ID=settings["ID"]; - }; - + base_settings(settings); + }; + Signal_output* clone(map<string,string> &_settings) { return new Signal_output(_settings);}; bool render(const float duration, const float framerate,string &xml_out); }; //------------------------------------------------------------------- class Node_factory{ public: Node_factory(); - template <typename T> - T* clone(T* proto,map<string,string> &settings) { - cerr << "Factory settings: "; - for (map<string,string>::iterator it=settings.begin();it!=settings.end();++it) { - cerr << it->first << "," << it->second << " "; - } - cerr << endl; - return new T(settings); - } void add_type(string type,Node* proto){ type_map[type]=proto; }; - Node* create(map<string,string> &settings){ - if (type_map.find(settings["type"])!=type_map.end()) { - cerr << "Factory: creating " << settings["type"] << endl; - return clone(type_map[settings["type"]],settings); + Node *create(map<string,string> &settings){ + if (settings.find("type")!=settings.end()) { + if (type_map.find(settings["type"])!=type_map.end()) { + return type_map[settings["type"]]->clone(settings); + } } else return NULL; }; private: - map<string,Node*> type_map; + unordered_map<string,Node*> type_map; }; class Graph{ public: |
