diff --git a/include/Nazara/Renderer/GlslWriter.hpp b/include/Nazara/Renderer/GlslWriter.hpp index 121f50ab7..bd1ab781b 100644 --- a/include/Nazara/Renderer/GlslWriter.hpp +++ b/include/Nazara/Renderer/GlslWriter.hpp @@ -44,7 +44,7 @@ namespace Nz void Append(ShaderAst::ExpressionType type); void Append(const String& txt); - void AppendFunction(const Function& func); + void AppendFunction(Function& func); void AppendLine(const Nz::String& txt = Nz::String()); void EnterScope(); @@ -52,6 +52,7 @@ namespace Nz struct Function { + std::set> variables; std::vector parameters; ShaderAst::ExpressionType retType; ShaderAst::StatementPtr node; @@ -60,12 +61,13 @@ namespace Nz struct State { - std::set> m_variables; + std::set> m_uniforms; StringStream stream; unsigned int indentLevel = 0; }; std::unordered_map m_functions; + Function* m_currentFunction; State* m_currentState; }; } diff --git a/src/Nazara/Renderer/GlslWriter.cpp b/src/Nazara/Renderer/GlslWriter.cpp index bbb542e21..588f0c886 100644 --- a/src/Nazara/Renderer/GlslWriter.cpp +++ b/src/Nazara/Renderer/GlslWriter.cpp @@ -9,6 +9,7 @@ namespace Nz { GlslWriter::GlslWriter() : + m_currentFunction(nullptr), m_currentState(nullptr) { } @@ -24,7 +25,7 @@ namespace Nz node->Register(*this); - for (const auto& pair : state.m_variables) + for (const auto& pair : state.m_uniforms) { Append(pair.first); Append(" "); @@ -59,7 +60,8 @@ namespace Nz { NazaraAssert(m_currentState, "This function should only be called while processing an AST"); - m_currentState->m_variables.insert(std::make_pair(type, name)); + if (m_currentFunction) + m_currentFunction->variables.insert(std::make_pair(type, name)); } void GlslWriter::Write(const ShaderAst::NodePtr& node) @@ -200,10 +202,19 @@ namespace Nz m_currentState->stream << txt; } - void GlslWriter::AppendFunction(const Function& func) + void GlslWriter::AppendFunction(Function& func) { + NazaraAssert(!m_currentFunction, "A function is already being processed"); NazaraAssert(m_currentState, "This function should only be called while processing an AST"); + m_currentFunction = &func; + CallOnExit onExit([this] () + { + m_currentFunction = nullptr; + }); + + func.node->Register(*this); + Append(func.retType); m_currentState->stream << ' '; @@ -222,7 +233,19 @@ namespace Nz m_currentState->stream << ")\n"; EnterScope(); + { + for (const auto& pair : func.variables) + { + Append(pair.first); + Append(" "); + Append(pair.second); + AppendLine(";"); + } + + AppendLine(); + Write(func.node); + } LeaveScope(); }