diff --git a/include/Nazara/Renderer/GlslWriter.hpp b/include/Nazara/Renderer/GlslWriter.hpp index d4042e882..13d7c8459 100644 --- a/include/Nazara/Renderer/GlslWriter.hpp +++ b/include/Nazara/Renderer/GlslWriter.hpp @@ -37,6 +37,7 @@ namespace Nz void Write(const ShaderAst::BuiltinVariable& node) override; void Write(const ShaderAst::Cast& node) override; void Write(const ShaderAst::Constant& node) override; + void Write(const ShaderAst::DeclareVariable& node) override; void Write(const ShaderAst::ExpressionStatement& node) override; void Write(const ShaderAst::NamedVariable& node) override; void Write(const ShaderAst::NodePtr& node) override; @@ -63,7 +64,6 @@ namespace Nz struct Function { - VariableContainer variables; std::vector parameters; ShaderAst::ExpressionType retType; ShaderAst::StatementPtr node; diff --git a/include/Nazara/Renderer/ShaderAst.hpp b/include/Nazara/Renderer/ShaderAst.hpp index dfe7639e4..28b808d6c 100644 --- a/include/Nazara/Renderer/ShaderAst.hpp +++ b/include/Nazara/Renderer/ShaderAst.hpp @@ -193,6 +193,18 @@ namespace Nz Nz::String name; }; + + class NAZARA_RENDERER_API DeclareVariable : public Statement + { + public: + inline DeclareVariable(NamedVariablePtr Variable, ExpressionPtr Expression = nullptr); + + void Register(ShaderWriter& visitor) override; + void Visit(ShaderWriter& visitor) override; + + NamedVariablePtr variable; + ExpressionPtr expression; + }; ////////////////////////////////////////////////////////////////////////// diff --git a/include/Nazara/Renderer/ShaderAst.inl b/include/Nazara/Renderer/ShaderAst.inl index b7d0a42d8..ea9e5cddf 100644 --- a/include/Nazara/Renderer/ShaderAst.inl +++ b/include/Nazara/Renderer/ShaderAst.inl @@ -82,6 +82,12 @@ namespace Nz { } + inline DeclareVariable::DeclareVariable(NamedVariablePtr Variable, ExpressionPtr Expression) : + expression(std::move(Expression)), + variable(std::move(Variable)) + { + } + inline AssignOp::AssignOp(AssignType Op, ExpressionPtr Left, ExpressionPtr Right) : op(Op), left(std::move(Left)), diff --git a/include/Nazara/Renderer/ShaderBuilder.hpp b/include/Nazara/Renderer/ShaderBuilder.hpp index b514b9c57..f8140ab42 100644 --- a/include/Nazara/Renderer/ShaderBuilder.hpp +++ b/include/Nazara/Renderer/ShaderBuilder.hpp @@ -11,7 +11,7 @@ #include #include -namespace Nz { namespace ShaderBuilder +namespace Nz::ShaderBuilder { template struct AssignOpBuilder @@ -49,7 +49,7 @@ namespace Nz { namespace ShaderBuilder { constexpr VarBuilder() {} - template std::shared_ptr operator()(Args&&... args) const; + template ShaderAst::NamedVariablePtr operator()(Args&&... args) const; }; constexpr BinOpBuilder Add; @@ -59,6 +59,7 @@ namespace Nz { namespace ShaderBuilder constexpr GenBuilder Branch; constexpr GenBuilder ConditionalStatement; constexpr GenBuilder Constant; + constexpr GenBuilder DeclareVariable; constexpr BinOpBuilder Divide; constexpr BinOpBuilder Equal; constexpr GenBuilder ExprStatement; @@ -73,7 +74,7 @@ namespace Nz { namespace ShaderBuilder constexpr VarBuilder Variable; template std::shared_ptr Cast(Args&&... args); -} } +} #include diff --git a/include/Nazara/Renderer/ShaderBuilder.inl b/include/Nazara/Renderer/ShaderBuilder.inl index 772c56583..76f00d394 100644 --- a/include/Nazara/Renderer/ShaderBuilder.inl +++ b/include/Nazara/Renderer/ShaderBuilder.inl @@ -44,7 +44,7 @@ namespace Nz { namespace ShaderBuilder template template - std::shared_ptr VarBuilder::operator()(Args&&... args) const + ShaderAst::NamedVariablePtr VarBuilder::operator()(Args&&... args) const { return std::make_shared(type, std::forward(args)...); } diff --git a/include/Nazara/Renderer/ShaderWriter.hpp b/include/Nazara/Renderer/ShaderWriter.hpp index 64dddcf9f..634c335ec 100644 --- a/include/Nazara/Renderer/ShaderWriter.hpp +++ b/include/Nazara/Renderer/ShaderWriter.hpp @@ -38,6 +38,7 @@ namespace Nz virtual void Write(const ShaderAst::BuiltinVariable& node) = 0; virtual void Write(const ShaderAst::Cast& node) = 0; virtual void Write(const ShaderAst::Constant& node) = 0; + virtual void Write(const ShaderAst::DeclareVariable& node) = 0; virtual void Write(const ShaderAst::ExpressionStatement& node) = 0; virtual void Write(const ShaderAst::NamedVariable& node) = 0; virtual void Write(const ShaderAst::NodePtr& node) = 0; diff --git a/src/Nazara/Renderer/GlslWriter.cpp b/src/Nazara/Renderer/GlslWriter.cpp index 685fc64af..73abec55f 100644 --- a/src/Nazara/Renderer/GlslWriter.cpp +++ b/src/Nazara/Renderer/GlslWriter.cpp @@ -66,6 +66,7 @@ namespace Nz switch (kind) { case ShaderAst::VariableType::Builtin: //< Only there to make compiler happy + case ShaderAst::VariableType::Variable: break; case ShaderAst::VariableType::Input: @@ -107,14 +108,6 @@ namespace Nz case ShaderAst::VariableType::Uniform: m_currentState->uniforms.emplace(type, name); break; - - case ShaderAst::VariableType::Variable: - { - if (m_currentFunction) - m_currentFunction->variables.emplace(type, name); - - break; - } } } @@ -262,6 +255,22 @@ namespace Nz } } + void GlslWriter::Write(const ShaderAst::DeclareVariable& node) + { + Append(node.variable->GetExpressionType()); + Append(" "); + Append(node.variable->name); + if (node.expression) + { + Append(" "); + Append("="); + Append(" "); + Write(node.expression); + } + + AppendLine(";"); + } + void GlslWriter::Write(const ShaderAst::ExpressionStatement& node) { Write(node.expression); @@ -404,8 +413,6 @@ namespace Nz EnterScope(); { - DeclareVariables(func.variables); - Write(func.node); } LeaveScope(); diff --git a/src/Nazara/Renderer/ShaderAst.cpp b/src/Nazara/Renderer/ShaderAst.cpp index 96dd0c7f3..0899cbdc7 100644 --- a/src/Nazara/Renderer/ShaderAst.cpp +++ b/src/Nazara/Renderer/ShaderAst.cpp @@ -69,6 +69,19 @@ namespace Nz::ShaderAst } + void DeclareVariable::Register(ShaderWriter& visitor) + { + variable->Register(visitor); + + if (expression) + expression->Register(visitor); + } + + void DeclareVariable::Visit(ShaderWriter& visitor) + { + visitor.Write(*this); + } + void BuiltinVariable::Register(ShaderWriter& /*visitor*/) { } diff --git a/src/ShaderNode/ShaderGraph.cpp b/src/ShaderNode/ShaderGraph.cpp index 6abfe5379..3ddffe365 100644 --- a/src/ShaderNode/ShaderGraph.cpp +++ b/src/ShaderNode/ShaderGraph.cpp @@ -107,7 +107,6 @@ Nz::ShaderAst::StatementPtr ShaderGraph::ToAst() { ShaderNode* shaderNode = static_cast(node->nodeDataModel()); - qDebug() << shaderNode->name() << node->id(); auto it = usageCount.find(node->id()); if (it == usageCount.end()) { @@ -166,8 +165,10 @@ Nz::ShaderAst::StatementPtr ShaderGraph::ToAst() Nz::ShaderAst::ExpressionPtr varExpression; if (expression->GetExpressionCategory() == Nz::ShaderAst::ExpressionCategory::RValue) { - varExpression = Nz::ShaderBuilder::Variable("var" + std::to_string(varCount++), expression->GetExpressionType()); - statements.emplace_back(Nz::ShaderBuilder::ExprStatement(Nz::ShaderBuilder::Assign(varExpression, expression))); + auto variable = Nz::ShaderBuilder::Variable("var" + std::to_string(varCount++), expression->GetExpressionType()); + statements.emplace_back(Nz::ShaderBuilder::DeclareVariable(variable, expression)); + + varExpression = variable; } else varExpression = expression;