From 9ff4a81ec8a171e509eff5e759b29f53c0dfc99e Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 9 Sep 2019 18:11:04 +1000 Subject: [PATCH] partially functional transform --- app/main.cpp | 2 +- app/node/color/opacity/opacity.cpp | 5 ++ app/node/color/opacity/opacity.h | 2 + app/node/distort/transform/transform.cpp | 21 ++++++-- app/node/distort/transform/transform.h | 2 + app/node/input.cpp | 7 +++ app/node/node.cpp | 7 ++- app/node/node.h | 5 ++ app/node/output.cpp | 15 ++++++ app/node/param.cpp | 48 +++++++++++++++++++ app/node/param.h | 11 +++++ app/node/processor/renderer/renderer.cpp | 2 +- .../nodeparamview/nodeparamviewitem.cpp | 35 ++++++++++++-- app/widget/nodeparamview/nodeparamviewitem.h | 4 ++ 14 files changed, 155 insertions(+), 11 deletions(-) diff --git a/app/main.cpp b/app/main.cpp index a05769982..ab1ecc787 100644 --- a/app/main.cpp +++ b/app/main.cpp @@ -36,7 +36,7 @@ extern "C" { #include "core.h" -int main(int argc, char *argv[]) { +int main(int argc, char *argv[]) { // Create application instance QApplication a(argc, argv); diff --git a/app/node/color/opacity/opacity.cpp b/app/node/color/opacity/opacity.cpp index dae3ca234..7573d9d93 100644 --- a/app/node/color/opacity/opacity.cpp +++ b/app/node/color/opacity/opacity.cpp @@ -114,6 +114,11 @@ QVariant OpacityNode::Value(NodeOutput *output, const rational &time) return 0; } +void OpacityNode::Retranslate() +{ + opacity_input_->set_name(tr("Opacity")); +} + NodeInput *OpacityNode::texture_input() { return texture_input_; diff --git a/app/node/color/opacity/opacity.h b/app/node/color/opacity/opacity.h index a604bc4ca..36ada8f37 100644 --- a/app/node/color/opacity/opacity.h +++ b/app/node/color/opacity/opacity.h @@ -38,6 +38,8 @@ public: virtual QVariant Value(NodeOutput *output, const rational &time) override; + virtual void Retranslate() override; + NodeInput* texture_input(); NodeOutput* texture_output(); diff --git a/app/node/distort/transform/transform.cpp b/app/node/distort/transform/transform.cpp index a0dab0602..94392dc2d 100644 --- a/app/node/distort/transform/transform.cpp +++ b/app/node/distort/transform/transform.cpp @@ -35,6 +35,7 @@ TransformDistort::TransformDistort() scale_input_ = new NodeInput("scale_in"); scale_input_->add_data_input(NodeParam::kVec2); + scale_input_->set_value(QVector2D(100.0f, 100.0f)); AddParameter(scale_input_); anchor_input_ = new NodeInput("anchor_in"); @@ -71,14 +72,28 @@ NodeOutput *TransformDistort::matrix_output() return matrix_output_; } +void TransformDistort::Retranslate() +{ + position_input_->set_name(tr("Position")); + rotation_input_->set_name(tr("Rotation")); + scale_input_->set_name(tr("Scale")); + anchor_input_->set_name(tr("Anchor Point")); +} + QVariant TransformDistort::Value(NodeOutput *output, const rational &time) { if (output == matrix_output_) { QMatrix4x4 mat; - mat.translate(position_input_->get_value(time).value()); - //mat.rotate(0) - //mat.scale() + // Position translate + QVector2D pos = position_input_->get_value(time).value() * 0.01f; + mat.translate(pos); + + // Rotation + mat.rotate(rotation_input_->get_value(time).toFloat(), 0, 0, 1); + + // Scale + mat.scale(scale_input_->get_value(time).value()*0.01f); return mat; } diff --git a/app/node/distort/transform/transform.h b/app/node/distort/transform/transform.h index 2f1ae34ff..0b58a1845 100644 --- a/app/node/distort/transform/transform.h +++ b/app/node/distort/transform/transform.h @@ -36,6 +36,8 @@ public: NodeOutput* matrix_output(); + virtual void Retranslate() override; + protected: virtual QVariant Value(NodeOutput *output, const rational &time) override; diff --git a/app/node/input.cpp b/app/node/input.cpp index ccc7e767f..a3f8ed9af 100644 --- a/app/node/input.cpp +++ b/app/node/input.cpp @@ -164,10 +164,17 @@ void NodeInput::set_maximum(const QVariant &max) NodeParam::DataType NodeInput::data_type() { + if (IsConnected()) { + // Return the connected output's data type + return edges_.first()->output()->data_type(); + } + if (inputs_.isEmpty()) { + // Safety if no inputs have been added return kNone; } + // Return first return inputs_.first(); } diff --git a/app/node/node.cpp b/app/node/node.cpp index 17f2d5bcc..186c03532 100644 --- a/app/node/node.cpp +++ b/app/node/node.cpp @@ -45,6 +45,10 @@ void Node::Release() { } +void Node::Retranslate() +{ +} + void Node::AddParameter(NodeParam *param) { // Ensure no other param with this ID has been added to this Node (since that defeats the purpose) @@ -334,7 +338,8 @@ void Node::Hash(QCryptographicHash *hash, NodeOutput* from, const rational &time && static_cast(param)->dependent()) { // Get the value at this time QVariant v = static_cast(param)->get_value(time); - hash->addData(v.toByteArray()); // FIXME: Does this work on all value types? + + hash->addData(NodeParam::ValueToBytes(param->data_type(), v)); } } diff --git a/app/node/node.h b/app/node/node.h index dcd16ec03..eff4c4fe8 100644 --- a/app/node/node.h +++ b/app/node/node.h @@ -90,6 +90,11 @@ public: */ virtual void Release(); + /** + * @brief Function called to retranslate parameter names (should be overridden in derivatives) + */ + virtual void Retranslate(); + /** * @brief Return the parameter at a given index */ diff --git a/app/node/output.cpp b/app/node/output.cpp index 0144ddbb0..1eeba7a6c 100644 --- a/app/node/output.cpp +++ b/app/node/output.cpp @@ -39,7 +39,22 @@ NodeParam::DataType NodeOutput::data_type() void NodeOutput::set_data_type(const NodeParam::DataType &type) { + if (data_type_ == type) { + return; + } + data_type_ = type; + + // If this output is connected to other inputs, check if they're compatible with this new data type + if (IsConnected()) { + foreach (NodeEdgePtr edge, edges_) { + if (!AreDataTypesCompatible(this, edge->input())) { + // FIXME: Possible array out of bounds since this function removes edges while we're iterating through them? + // I'm not sure how Qt's `foreach` works. + DisconnectEdge(edge); + } + } + } } QVariant NodeOutput::get_value(const rational& time) diff --git a/app/node/param.cpp b/app/node/param.cpp index d7dd029f9..53871e82f 100644 --- a/app/node/param.cpp +++ b/app/node/param.cpp @@ -20,7 +20,12 @@ #include "param.h" +#include #include +#include +#include +#include +#include #include "node/node.h" #include "node/input.h" @@ -241,6 +246,35 @@ QString NodeParam::GetDefaultDataTypeName(const DataType& type) return QString(); } +QByteArray NodeParam::ValueToBytes(const NodeParam::DataType &type, const QVariant &value) +{ + switch (type) { + case kInt: return ValueToBytesInternal(value); + case kFloat: return ValueToBytesInternal(value); + case kColor: return ValueToBytesInternal(value); + case kString: return ValueToBytesInternal(value); + case kBoolean: return ValueToBytesInternal(value); + case kFont: return ValueToBytesInternal(value); // FIXME: This should probably be a QFont? + case kFile: return ValueToBytesInternal(value); + case kMatrix: return ValueToBytesInternal(value); + case kFootage: return ValueToBytesInternal(value); // FIXME: Unsustainble, find some other way to match Footage + case kRational: return ValueToBytesInternal(value); + case kVec2: return ValueToBytesInternal(value); + case kVec3: return ValueToBytesInternal(value); + case kVec4: return ValueToBytesInternal(value); + + // These types have no persistent input + case kNone: + case kTexture: + case kBlock: + case kTrack: + case kAny: + break; + } + + return QByteArray(); +} + void NodeParam::ClearCachedValue() { // Since get_value() will (read: should) never receive a negative number, this will effectively invalidate any value @@ -257,3 +291,17 @@ void NodeParam::SetValueCachingEnabled(bool enabled) { value_caching_ = enabled; } + +template +QByteArray NodeParam::ValueToBytesInternal(const QVariant &v) +{ + QByteArray bytes; + + int size_of_type = sizeof(T); + + bytes.resize(size_of_type); + T raw_val = v.value(); + memcpy(bytes.data(), &raw_val, static_cast(size_of_type)); + + return bytes; +} diff --git a/app/node/param.h b/app/node/param.h index b2d18b8ba..d5e719e7d 100644 --- a/app/node/param.h +++ b/app/node/param.h @@ -240,6 +240,11 @@ public: */ static QString GetDefaultDataTypeName(const DataType &type); + /** + * @brief Convert a value from a NodeParam into bytes + */ + static QByteArray ValueToBytes(const DataType &type, const QVariant& value); + /** * @brief Clear the cached value */ @@ -293,6 +298,12 @@ protected: bool value_caching_; private: + /** + * @brief Internal function for returning a value in the form of bytes + */ + template + static QByteArray ValueToBytesInternal(const QVariant& v); + /** * @brief Internal name string */ diff --git a/app/node/processor/renderer/renderer.cpp b/app/node/processor/renderer/renderer.cpp index 394079051..e2bab1bb6 100644 --- a/app/node/processor/renderer/renderer.cpp +++ b/app/node/processor/renderer/renderer.cpp @@ -364,7 +364,7 @@ void RendererProcessor::CacheNext() rational cache_frame = cache_queue_.takeFirst(); - //qDebug() << "[RendererProcessor] Caching" << cache_frame.toDouble(); + qDebug() << "[RendererProcessor] Caching" << cache_frame.toDouble(); threads_.first()->Queue(NodeDependency(texture_input_->get_connected_output(), cache_frame), true); diff --git a/app/widget/nodeparamview/nodeparamviewitem.cpp b/app/widget/nodeparamview/nodeparamviewitem.cpp index 24dedeec7..f87558c3b 100644 --- a/app/widget/nodeparamview/nodeparamviewitem.cpp +++ b/app/widget/nodeparamview/nodeparamviewitem.cpp @@ -22,7 +22,7 @@ #include #include - +#include #include #include "project/item/sequence/sequence.h" @@ -92,7 +92,9 @@ bool NodeParamViewItem::CanAddNode(Node* n) void NodeParamViewItem::changeEvent(QEvent *e) { - // FIXME: Retranslate all UI elements + if (e->type() == QEvent::LanguageChange && !nodes_.isEmpty()) { + Retranslate(); + } QWidget::changeEvent(e); } @@ -103,8 +105,6 @@ void NodeParamViewItem::SetupUI() Node* first_node = nodes_.first(); - title_bar_lbl_->setText(first_node->Name()); - int row_count = 0; for (int i=0;iParameterCount();i++) { @@ -114,7 +114,8 @@ void NodeParamViewItem::SetupUI() if (param->type() == NodeParam::kInput) { // Add descriptor label - QLabel* param_label = new QLabel(tr("%1:").arg(param->name())); + QLabel* param_label = new QLabel(); + param_lbls_.append(param_label); content_layout_->addWidget(param_label, row_count, 0); @@ -132,6 +133,8 @@ void NodeParamViewItem::SetupUI() row_count++; } } + + Retranslate(); } void NodeParamViewItem::AddAdditionalNode(Node *n) @@ -149,6 +152,28 @@ void NodeParamViewItem::AddAdditionalNode(Node *n) } } +void NodeParamViewItem::Retranslate() +{ + Node* first_node = nodes_.first(); + + first_node->Retranslate(); + + title_bar_lbl_->setText(first_node->Name()); + + int row_count = 0; + + for (int i=0;iParameterCount();i++) { + NodeParam* param = first_node->ParamAt(i); + + // This widget only needs to show input parameters + if (param->type() == NodeParam::kInput) { + param_lbls_.at(row_count)->setText(tr("%1:").arg(param->name())); + + row_count++; + } + } +} + void NodeParamViewItem::SetExpanded(bool e) { expanded_ = e; diff --git a/app/widget/nodeparamview/nodeparamviewitem.h b/app/widget/nodeparamview/nodeparamviewitem.h index 119b9d648..b327b8945 100644 --- a/app/widget/nodeparamview/nodeparamviewitem.h +++ b/app/widget/nodeparamview/nodeparamviewitem.h @@ -56,12 +56,16 @@ private: void AddAdditionalNode(Node* n); + void Retranslate(); + bool expanded_; NodeParamViewItemTitleBar* title_bar_; QLabel* title_bar_lbl_; + QVector param_lbls_; + QPushButton* title_bar_collapse_btn_; QWidget* contents_;