ShaderNode: Add possibility to set variable name (+ force variables)

This commit is contained in:
Lynix 2020-05-29 18:22:58 +02:00
parent eabb8a630d
commit 0a0dce4109
7 changed files with 55 additions and 7 deletions

View File

@ -4,5 +4,6 @@ inline FragmentOutput::FragmentOutput(ShaderGraph& graph) :
ShaderNode(graph) ShaderNode(graph)
{ {
SetPreviewSize({ 128, 128 }); SetPreviewSize({ 128, 128 });
DisableCustomVariableName();
EnablePreview(true); EnablePreview(true);
} }

View File

@ -21,6 +21,7 @@ ShaderNode(graph)
m_currentInputText = firstInput.name; m_currentInputText = firstInput.name;
} }
DisableCustomVariableName();
UpdatePreview(); UpdatePreview();
} }

View File

@ -3,12 +3,13 @@
#include <QtWidgets/QComboBox> #include <QtWidgets/QComboBox>
#include <QtWidgets/QFormLayout> #include <QtWidgets/QFormLayout>
#include <QtWidgets/QLabel> #include <QtWidgets/QLabel>
#include <QtWidgets/QLineEdit>
ShaderNode::ShaderNode(ShaderGraph& graph) : ShaderNode::ShaderNode(ShaderGraph& graph) :
m_previewSize(64, 64), m_previewSize(64, 64),
m_pixmapLabel(nullptr), m_pixmapLabel(nullptr),
m_graph(graph), m_graph(graph),
m_forceVariable(false), m_enableCustomVariableName(true),
m_isPreviewEnabled(false) m_isPreviewEnabled(false)
{ {
m_pixmapLabel = new QLabel; m_pixmapLabel = new QLabel;
@ -51,6 +52,16 @@ void ShaderNode::BuildNodeEdition(QFormLayout* layout)
}); });
layout->addRow(tr("Preview size"), previewSize); 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) void ShaderNode::EnablePreview(bool enable)

View File

@ -27,13 +27,16 @@ class ShaderNode : public QtNodes::NodeDataModel
inline const ShaderGraph& GetGraph() const; inline const ShaderGraph& GetGraph() const;
inline const std::string& GetVariableName() 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; QWidget* embeddedWidget() final;
void setInData(std::shared_ptr<QtNodes::NodeData>, int) override; void setInData(std::shared_ptr<QtNodes::NodeData>, int) override;
protected: protected:
inline void DisableCustomVariableName();
inline void EnableCustomVariableName(bool enable = true);
void UpdatePreview(); void UpdatePreview();
private: private:
@ -44,7 +47,7 @@ class ShaderNode : public QtNodes::NodeDataModel
std::optional<QPixmap> m_pixmap; std::optional<QPixmap> m_pixmap;
std::string m_variableName; std::string m_variableName;
ShaderGraph& m_graph; ShaderGraph& m_graph;
bool m_forceVariable; bool m_enableCustomVariableName;
bool m_isPreviewEnabled; bool m_isPreviewEnabled;
}; };

View File

@ -24,3 +24,20 @@ inline void ShaderNode::SetPreviewSize(const Nz::Vector2i& size)
embeddedWidgetSizeUpdated(); 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();
}

View File

@ -22,6 +22,7 @@ ShaderNode(graph)
m_currentTextureText = firstInput.name; m_currentTextureText = firstInput.name;
} }
DisableCustomVariableName();
EnablePreview(true); EnablePreview(true);
} }

View File

@ -16,6 +16,7 @@
#include <nodes/FlowScene> #include <nodes/FlowScene>
#include <nodes/FlowView> #include <nodes/FlowView>
#include <nodes/DataModelRegistry> #include <nodes/DataModelRegistry>
#include <unordered_set>
namespace namespace
{ {
@ -105,8 +106,6 @@ Nz::ShaderAst::StatementPtr ShaderGraph::ToAst()
std::vector<Nz::ShaderAst::StatementPtr> statements; std::vector<Nz::ShaderAst::StatementPtr> statements;
QHash<QUuid, unsigned int> usageCount; QHash<QUuid, unsigned int> usageCount;
unsigned int varCount = 0;
std::function<void(QtNodes::Node*)> DetectVariables; std::function<void(QtNodes::Node*)> DetectVariables;
DetectVariables = [&](QtNodes::Node* node) DetectVariables = [&](QtNodes::Node* node)
{ {
@ -135,6 +134,9 @@ Nz::ShaderAst::StatementPtr ShaderGraph::ToAst()
QHash<QUuid, Nz::ShaderAst::ExpressionPtr> variableExpressions; QHash<QUuid, Nz::ShaderAst::ExpressionPtr> variableExpressions;
unsigned int varCount = 0;
std::unordered_set<std::string> usedVariableNames;
std::function<Nz::ShaderAst::ExpressionPtr(QtNodes::Node*)> HandleNode; std::function<Nz::ShaderAst::ExpressionPtr(QtNodes::Node*)> HandleNode;
HandleNode = [&](QtNodes::Node* node) -> Nz::ShaderAst::ExpressionPtr HandleNode = [&](QtNodes::Node* node) -> Nz::ShaderAst::ExpressionPtr
{ {
@ -163,12 +165,24 @@ Nz::ShaderAst::StatementPtr ShaderGraph::ToAst()
auto expression = shaderNode->GetExpression(expressions.data(), expressions.size()); 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; Nz::ShaderAst::ExpressionPtr varExpression;
if (expression->GetExpressionCategory() == Nz::ShaderAst::ExpressionCategory::RValue) 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)); statements.emplace_back(Nz::ShaderBuilder::DeclareVariable(variable, expression));
varExpression = variable; varExpression = variable;