diff --git a/include/Nazara/Renderer/GlslWriter.hpp b/include/Nazara/Renderer/GlslWriter.hpp index bd1ab781b..20e4cacc7 100644 --- a/include/Nazara/Renderer/GlslWriter.hpp +++ b/include/Nazara/Renderer/GlslWriter.hpp @@ -28,7 +28,7 @@ namespace Nz Nz::String Generate(const ShaderAst::StatementPtr& node) override; void RegisterFunction(const String& name, ShaderAst::StatementPtr statement, std::initializer_list parameters, ShaderAst::ExpressionType ret) override; - void RegisterVariable(const String& name, ShaderAst::ExpressionType type) override; + void RegisterVariable(ShaderAst::VariableType kind, const String& name, ShaderAst::ExpressionType type) override; void Write(const ShaderAst::AssignOp& node) override; void Write(const ShaderAst::Branch& node) override; diff --git a/include/Nazara/Renderer/ShaderBuilder.hpp b/include/Nazara/Renderer/ShaderBuilder.hpp index 75d43ae8b..9f9d5f820 100644 --- a/include/Nazara/Renderer/ShaderBuilder.hpp +++ b/include/Nazara/Renderer/ShaderBuilder.hpp @@ -62,6 +62,8 @@ namespace Nz { namespace ShaderBuilder constexpr GenBuilder Branch; constexpr GenBuilder Constant; constexpr GenBuilder ExprStatement; + constexpr VarBuilder Parameter; + constexpr VarBuilder Uniform; constexpr VarBuilder Variable; } } diff --git a/include/Nazara/Renderer/ShaderWriter.hpp b/include/Nazara/Renderer/ShaderWriter.hpp index 4e006ffb4..9b87ca5f7 100644 --- a/include/Nazara/Renderer/ShaderWriter.hpp +++ b/include/Nazara/Renderer/ShaderWriter.hpp @@ -24,7 +24,7 @@ namespace Nz virtual Nz::String Generate(const ShaderAst::StatementPtr& node) = 0; virtual void RegisterFunction(const String& name, ShaderAst::StatementPtr node, std::initializer_list parameters, ShaderAst::ExpressionType ret) = 0; - virtual void RegisterVariable(const String& name, ShaderAst::ExpressionType type) = 0; + virtual void RegisterVariable(ShaderAst::VariableType kind, const String& name, ShaderAst::ExpressionType type) = 0; virtual void Write(const ShaderAst::AssignOp& node) = 0; virtual void Write(const ShaderAst::Branch& node) = 0; diff --git a/src/Nazara/Renderer/GlslWriter.cpp b/src/Nazara/Renderer/GlslWriter.cpp index 588f0c886..b1d4dc32a 100644 --- a/src/Nazara/Renderer/GlslWriter.cpp +++ b/src/Nazara/Renderer/GlslWriter.cpp @@ -25,15 +25,20 @@ namespace Nz node->Register(*this); - for (const auto& pair : state.m_uniforms) + // Uniforms + if (state.m_uniforms.empty()) { - Append(pair.first); - Append(" "); - Append(pair.second); - AppendLine(";"); - } + for (const auto& pair : state.m_uniforms) + { + Append("uniform "); + Append(pair.first); + Append(" "); + Append(pair.second); + AppendLine(";"); + } - AppendLine(); + AppendLine(); + } Function entryPoint; entryPoint.name = "main"; //< GLSL has only one entry point name possible @@ -56,12 +61,52 @@ namespace Nz m_functions[name] = std::move(func); } - void GlslWriter::RegisterVariable(const String& name, ShaderAst::ExpressionType type) + void GlslWriter::RegisterVariable(ShaderAst::VariableType kind, const String& name, ShaderAst::ExpressionType type) { NazaraAssert(m_currentState, "This function should only be called while processing an AST"); - if (m_currentFunction) - m_currentFunction->variables.insert(std::make_pair(type, name)); + switch (kind) + { + case ShaderAst::VariableType::Parameter: + { + if (m_currentFunction) + { + bool found = false; + for (const auto& varPtr : m_currentFunction->parameters) + { + if (varPtr->name == name) + { + found = true; + if (varPtr->type != type) + { + //TODO: AstParseError + throw std::runtime_error("Function uses parameter \"" + name + "\" with a different type than specified in the function arguments"); + } + + break; + } + } + + if (!found) + //TODO: AstParseError + throw std::runtime_error("Function has no parameter \"" + name + "\""); + } + + break; + } + + case ShaderAst::VariableType::Uniform: + m_currentState->m_uniforms.insert(std::make_pair(type, name)); + break; + + case ShaderAst::VariableType::Variable: + { + if (m_currentFunction) + m_currentFunction->variables.insert(std::make_pair(type, name)); + + break; + } + } } void GlslWriter::Write(const ShaderAst::NodePtr& node) diff --git a/src/Nazara/Renderer/ShaderAst.cpp b/src/Nazara/Renderer/ShaderAst.cpp index 3402eb987..7de149699 100644 --- a/src/Nazara/Renderer/ShaderAst.cpp +++ b/src/Nazara/Renderer/ShaderAst.cpp @@ -33,7 +33,7 @@ namespace Nz { namespace ShaderAst void Variable::Register(ShaderWriter& visitor) { - visitor.RegisterVariable(name, type); + visitor.RegisterVariable(kind, name, type); } void Variable::Visit(ShaderWriter& visitor)