summaryrefslogtreecommitdiff
path: root/rotord/rotor.h
diff options
context:
space:
mode:
Diffstat (limited to 'rotord/rotor.h')
-rwxr-xr-xrotord/rotor.h118
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: