diff --git a/app/node/block/block.cpp b/app/node/block/block.cpp index 005183345..3f0feab3f 100644 --- a/app/node/block/block.cpp +++ b/app/node/block/block.cpp @@ -24,19 +24,19 @@ Block::Block() { - previous_input_ = new NodeInput(); + previous_input_ = new NodeInput("prev_block"); previous_input_->add_data_input(NodeParam::kBlock); AddParameter(previous_input_); - block_output_ = new NodeOutput(); + block_output_ = new NodeOutput("block_out"); block_output_->set_data_type(NodeParam::kBlock); AddParameter(block_output_); - next_input_ = new NodeInput(); + next_input_ = new NodeInput("next_block"); next_input_->add_data_input(NodeParam::kBlock); AddParameter(next_input_); - texture_output_ = new NodeOutput(); + texture_output_ = new NodeOutput("tex_out"); texture_output_->set_data_type(NodeParam::kTexture); AddParameter(texture_output_); diff --git a/app/node/block/clip/clip.cpp b/app/node/block/clip/clip.cpp index 7aa4c5bb0..9baa42c3c 100644 --- a/app/node/block/clip/clip.cpp +++ b/app/node/block/clip/clip.cpp @@ -24,7 +24,7 @@ ClipBlock::ClipBlock() { - texture_input_ = new NodeInput(); + texture_input_ = new NodeInput("tex_in"); texture_input_->add_data_input(NodeInput::kTexture); AddParameter(texture_input_); } diff --git a/app/node/generator/solid/solid.cpp b/app/node/generator/solid/solid.cpp index 33956d2ad..d1a572766 100644 --- a/app/node/generator/solid/solid.cpp +++ b/app/node/generator/solid/solid.cpp @@ -23,11 +23,11 @@ SolidGenerator::SolidGenerator() : texture_(nullptr) { - color_input_ = new NodeInput(); + color_input_ = new NodeInput("color_in"); color_input_->add_data_input(NodeParam::kColor); AddParameter(color_input_); - texture_output_ = new NodeOutput(); + texture_output_ = new NodeOutput("tex_out"); texture_output_->set_data_type(NodeOutput::kTexture); AddParameter(texture_output_); } diff --git a/app/node/input.cpp b/app/node/input.cpp index 65bef54ec..fe3dedaf0 100644 --- a/app/node/input.cpp +++ b/app/node/input.cpp @@ -22,7 +22,8 @@ #include "output.h" -NodeInput::NodeInput() : +NodeInput::NodeInput(const QString& id) : + NodeParam(id), keyframing_(false), can_accept_multiple_inputs_(false) { diff --git a/app/node/input.h b/app/node/input.h index 5951484d8..369f7c9be 100644 --- a/app/node/input.h +++ b/app/node/input.h @@ -31,7 +31,7 @@ class NodeInput : public NodeParam { Q_OBJECT public: - NodeInput(); + NodeInput(const QString &id); /** * @brief Returns kInput diff --git a/app/node/input/media/media.cpp b/app/node/input/media/media.cpp index 6e521e1c2..004835413 100644 --- a/app/node/input/media/media.cpp +++ b/app/node/input/media/media.cpp @@ -34,11 +34,11 @@ MediaInput::MediaInput() : decoder_(nullptr) { - footage_input_ = new NodeInput(); + footage_input_ = new NodeInput("footage_in"); footage_input_->add_data_input(NodeInput::kFootage); AddParameter(footage_input_); - texture_output_ = new NodeOutput(); + texture_output_ = new NodeOutput("tex_out"); texture_output_->set_data_type(NodeOutput::kTexture); AddParameter(texture_output_); } diff --git a/app/node/node.cpp b/app/node/node.cpp index 12a8184bc..255b88c00 100644 --- a/app/node/node.cpp +++ b/app/node/node.cpp @@ -44,6 +44,9 @@ void Node::Release() void Node::AddParameter(NodeParam *param) { + // Ensure no other param with this ID has been added to this Node (since that defeats the purpose) + Q_ASSERT(!HasParamWithID(param->id())); + param->setParent(this); connect(param, SIGNAL(EdgeAdded(NodeEdgePtr)), this, SIGNAL(EdgeAdded(NodeEdgePtr))); @@ -120,3 +123,18 @@ QVariant Node::PtrToValue(void *ptr) { return reinterpret_cast(ptr); } + +bool Node::HasParamWithID(const QString &id) +{ + QList params = parameters(); + + foreach (NodeParam* p, params) + { + if (p->id() == id) + { + return true; + } + } + + return false; +} diff --git a/app/node/node.h b/app/node/node.h index f6503711f..dfb83dd4f 100644 --- a/app/node/node.h +++ b/app/node/node.h @@ -179,6 +179,12 @@ signals: * The edge that was removed */ void EdgeRemoved(NodeEdgePtr edge); + +private: + /** + * @brief Return whether a parameter with ID `id` has already been added to this Node + */ + bool HasParamWithID(const QString& id); }; template diff --git a/app/node/output.cpp b/app/node/output.cpp index 0f9f259d6..05f971321 100644 --- a/app/node/output.cpp +++ b/app/node/output.cpp @@ -22,9 +22,9 @@ #include "node/node.h" -NodeOutput::NodeOutput() +NodeOutput::NodeOutput(const QString &id) : + NodeParam(id) { - } NodeParam::Type NodeOutput::type() diff --git a/app/node/output.h b/app/node/output.h index a03574fd5..add99ec37 100644 --- a/app/node/output.h +++ b/app/node/output.h @@ -32,7 +32,7 @@ public: /** * @brief NodeOutput Constructor */ - NodeOutput(); + NodeOutput(const QString& id); /** * @brief Returns kOutput diff --git a/app/node/output/viewer/viewer.cpp b/app/node/output/viewer/viewer.cpp index c9cb2a950..ef75ed92a 100644 --- a/app/node/output/viewer/viewer.cpp +++ b/app/node/output/viewer/viewer.cpp @@ -25,7 +25,7 @@ ViewerOutput::ViewerOutput() : attached_viewer_(nullptr) { - texture_input_ = new NodeInput(); + texture_input_ = new NodeInput("tex_out"); texture_input_->add_data_input(NodeInput::kTexture); AddParameter(texture_input_); } diff --git a/app/node/param.cpp b/app/node/param.cpp index 98a62c131..54d8a08fd 100644 --- a/app/node/param.cpp +++ b/app/node/param.cpp @@ -26,8 +26,15 @@ #include "node/input.h" #include "node/output.h" -NodeParam::NodeParam() +NodeParam::NodeParam(const QString &id) : + id_(id) { + Q_ASSERT(!id_.isEmpty()); +} + +const QString NodeParam::id() +{ + return id_; } const QString &NodeParam::name() diff --git a/app/node/param.h b/app/node/param.h index 819254957..420387408 100644 --- a/app/node/param.h +++ b/app/node/param.h @@ -72,7 +72,12 @@ public: /** * @brief NodeParam Constructor */ - NodeParam(); + NodeParam(const QString& id); + + /** + * @brief Return ID of this parameter + */ + const QString id(); /** * @brief The type of node paramter this is @@ -220,6 +225,11 @@ private: */ QString name_; + /** + * @brief Internal ID string + */ + QString id_; + }; #endif // NODEPARAM_H