From 0a0dce4109a5a49270d1ed2a2f496e1529d94cab Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 29 May 2020 18:22:58 +0200 Subject: [PATCH] ShaderNode: Add possibility to set variable name (+ force variables) --- src/ShaderNode/DataModels/FragmentOutput.inl | 1 + src/ShaderNode/DataModels/InputValue.cpp | 1 + src/ShaderNode/DataModels/ShaderNode.cpp | 13 +++++++++++- src/ShaderNode/DataModels/ShaderNode.hpp | 7 +++++-- src/ShaderNode/DataModels/ShaderNode.inl | 17 +++++++++++++++ src/ShaderNode/DataModels/TextureValue.cpp | 1 + src/ShaderNode/ShaderGraph.cpp | 22 ++++++++++++++++---- 7 files changed, 55 insertions(+), 7 deletions(-) diff --git a/src/ShaderNode/DataModels/FragmentOutput.inl b/src/ShaderNode/DataModels/FragmentOutput.inl index 24fc6cbf9..5b93f6699 100644 --- a/src/ShaderNode/DataModels/FragmentOutput.inl +++ b/src/ShaderNode/DataModels/FragmentOutput.inl @@ -4,5 +4,6 @@ inline FragmentOutput::FragmentOutput(ShaderGraph& graph) : ShaderNode(graph) { SetPreviewSize({ 128, 128 }); + DisableCustomVariableName(); EnablePreview(true); } diff --git a/src/ShaderNode/DataModels/InputValue.cpp b/src/ShaderNode/DataModels/InputValue.cpp index c36c4a256..fb53ba0a8 100644 --- a/src/ShaderNode/DataModels/InputValue.cpp +++ b/src/ShaderNode/DataModels/InputValue.cpp @@ -21,6 +21,7 @@ ShaderNode(graph) m_currentInputText = firstInput.name; } + DisableCustomVariableName(); UpdatePreview(); } diff --git a/src/ShaderNode/DataModels/ShaderNode.cpp b/src/ShaderNode/DataModels/ShaderNode.cpp index 62236ddc0..b955c3c42 100644 --- a/src/ShaderNode/DataModels/ShaderNode.cpp +++ b/src/ShaderNode/DataModels/ShaderNode.cpp @@ -3,12 +3,13 @@ #include #include #include +#include ShaderNode::ShaderNode(ShaderGraph& graph) : m_previewSize(64, 64), m_pixmapLabel(nullptr), m_graph(graph), -m_forceVariable(false), +m_enableCustomVariableName(true), m_isPreviewEnabled(false) { m_pixmapLabel = new QLabel; @@ -51,6 +52,16 @@ void ShaderNode::BuildNodeEdition(QFormLayout* layout) }); layout->addRow(tr("Preview size"), previewSize); + + if (m_enableCustomVariableName) + { + QLineEdit* lineEdit = new QLineEdit(QString::fromStdString(m_variableName)); + connect(lineEdit, &QLineEdit::textChanged, [&](const QString& text) + { + SetVariableName(text.toStdString()); + }); + layout->addRow(tr("Variable name"), lineEdit); + } } void ShaderNode::EnablePreview(bool enable) diff --git a/src/ShaderNode/DataModels/ShaderNode.hpp b/src/ShaderNode/DataModels/ShaderNode.hpp index 6d64c33bd..9d82851e2 100644 --- a/src/ShaderNode/DataModels/ShaderNode.hpp +++ b/src/ShaderNode/DataModels/ShaderNode.hpp @@ -27,13 +27,16 @@ class ShaderNode : public QtNodes::NodeDataModel inline const ShaderGraph& GetGraph() const; inline const std::string& GetVariableName() const; - void SetPreviewSize(const Nz::Vector2i& size); + inline void SetPreviewSize(const Nz::Vector2i& size); + inline void SetVariableName(std::string variableName); QWidget* embeddedWidget() final; void setInData(std::shared_ptr, int) override; protected: + inline void DisableCustomVariableName(); + inline void EnableCustomVariableName(bool enable = true); void UpdatePreview(); private: @@ -44,7 +47,7 @@ class ShaderNode : public QtNodes::NodeDataModel std::optional m_pixmap; std::string m_variableName; ShaderGraph& m_graph; - bool m_forceVariable; + bool m_enableCustomVariableName; bool m_isPreviewEnabled; }; diff --git a/src/ShaderNode/DataModels/ShaderNode.inl b/src/ShaderNode/DataModels/ShaderNode.inl index d1a92bf73..1fb9bf67a 100644 --- a/src/ShaderNode/DataModels/ShaderNode.inl +++ b/src/ShaderNode/DataModels/ShaderNode.inl @@ -24,3 +24,20 @@ inline void ShaderNode::SetPreviewSize(const Nz::Vector2i& size) embeddedWidgetSizeUpdated(); } } + +inline void ShaderNode::SetVariableName(std::string variableName) +{ + m_variableName = std::move(variableName); +} + +inline void ShaderNode::DisableCustomVariableName() +{ + return EnableCustomVariableName(false); +} + +inline void ShaderNode::EnableCustomVariableName(bool enable) +{ + m_enableCustomVariableName = enable; + if (!m_enableCustomVariableName) + m_variableName.clear(); +} diff --git a/src/ShaderNode/DataModels/TextureValue.cpp b/src/ShaderNode/DataModels/TextureValue.cpp index 57127005b..976ec7dd7 100644 --- a/src/ShaderNode/DataModels/TextureValue.cpp +++ b/src/ShaderNode/DataModels/TextureValue.cpp @@ -22,6 +22,7 @@ ShaderNode(graph) m_currentTextureText = firstInput.name; } + DisableCustomVariableName(); EnablePreview(true); } diff --git a/src/ShaderNode/ShaderGraph.cpp b/src/ShaderNode/ShaderGraph.cpp index 6db88c2f0..1a80b9cbe 100644 --- a/src/ShaderNode/ShaderGraph.cpp +++ b/src/ShaderNode/ShaderGraph.cpp @@ -16,6 +16,7 @@ #include #include #include +#include namespace { @@ -105,8 +106,6 @@ Nz::ShaderAst::StatementPtr ShaderGraph::ToAst() std::vector statements; QHash usageCount; - unsigned int varCount = 0; - std::function DetectVariables; DetectVariables = [&](QtNodes::Node* node) { @@ -135,6 +134,9 @@ Nz::ShaderAst::StatementPtr ShaderGraph::ToAst() QHash variableExpressions; + unsigned int varCount = 0; + std::unordered_set usedVariableNames; + std::function HandleNode; HandleNode = [&](QtNodes::Node* node) -> Nz::ShaderAst::ExpressionPtr { @@ -163,12 +165,24 @@ Nz::ShaderAst::StatementPtr ShaderGraph::ToAst() auto expression = shaderNode->GetExpression(expressions.data(), expressions.size()); - if (*it > 1) + const std::string& variableName = shaderNode->GetVariableName(); + if (*it > 1 || !variableName.empty()) { Nz::ShaderAst::ExpressionPtr varExpression; if (expression->GetExpressionCategory() == Nz::ShaderAst::ExpressionCategory::RValue) { - auto variable = Nz::ShaderBuilder::Variable("var" + std::to_string(varCount++), expression->GetExpressionType()); + std::string name; + if (variableName.empty()) + name = "var" + std::to_string(varCount++); + else + name = variableName; + + if (usedVariableNames.find(name) != usedVariableNames.end()) + throw std::runtime_error("duplicate variable found: " + name); + + usedVariableNames.insert(name); + + auto variable = Nz::ShaderBuilder::Variable(std::move(name), expression->GetExpressionType()); statements.emplace_back(Nz::ShaderBuilder::DeclareVariable(variable, expression)); varExpression = variable;