Renderer/GlslWriter: Add support for Uniform and Parameters variables
This commit is contained in:
parent
5c3e67bb26
commit
d538a7ddf5
|
|
@ -28,7 +28,7 @@ namespace Nz
|
||||||
Nz::String Generate(const ShaderAst::StatementPtr& node) override;
|
Nz::String Generate(const ShaderAst::StatementPtr& node) override;
|
||||||
|
|
||||||
void RegisterFunction(const String& name, ShaderAst::StatementPtr statement, std::initializer_list<ShaderAst::VariablePtr> parameters, ShaderAst::ExpressionType ret) override;
|
void RegisterFunction(const String& name, ShaderAst::StatementPtr statement, std::initializer_list<ShaderAst::VariablePtr> 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::AssignOp& node) override;
|
||||||
void Write(const ShaderAst::Branch& node) override;
|
void Write(const ShaderAst::Branch& node) override;
|
||||||
|
|
|
||||||
|
|
@ -62,6 +62,8 @@ namespace Nz { namespace ShaderBuilder
|
||||||
constexpr GenBuilder<Nz::ShaderAst::Branch> Branch;
|
constexpr GenBuilder<Nz::ShaderAst::Branch> Branch;
|
||||||
constexpr GenBuilder<Nz::ShaderAst::Constant> Constant;
|
constexpr GenBuilder<Nz::ShaderAst::Constant> Constant;
|
||||||
constexpr GenBuilder<Nz::ShaderAst::ExpressionStatement> ExprStatement;
|
constexpr GenBuilder<Nz::ShaderAst::ExpressionStatement> ExprStatement;
|
||||||
|
constexpr VarBuilder<Nz::ShaderAst::VariableType::Parameter> Parameter;
|
||||||
|
constexpr VarBuilder<Nz::ShaderAst::VariableType::Uniform> Uniform;
|
||||||
constexpr VarBuilder<Nz::ShaderAst::VariableType::Variable> Variable;
|
constexpr VarBuilder<Nz::ShaderAst::VariableType::Variable> Variable;
|
||||||
} }
|
} }
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ namespace Nz
|
||||||
virtual Nz::String Generate(const ShaderAst::StatementPtr& node) = 0;
|
virtual Nz::String Generate(const ShaderAst::StatementPtr& node) = 0;
|
||||||
|
|
||||||
virtual void RegisterFunction(const String& name, ShaderAst::StatementPtr node, std::initializer_list<ShaderAst::VariablePtr> parameters, ShaderAst::ExpressionType ret) = 0;
|
virtual void RegisterFunction(const String& name, ShaderAst::StatementPtr node, std::initializer_list<ShaderAst::VariablePtr> 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::AssignOp& node) = 0;
|
||||||
virtual void Write(const ShaderAst::Branch& node) = 0;
|
virtual void Write(const ShaderAst::Branch& node) = 0;
|
||||||
|
|
|
||||||
|
|
@ -25,15 +25,20 @@ namespace Nz
|
||||||
|
|
||||||
node->Register(*this);
|
node->Register(*this);
|
||||||
|
|
||||||
for (const auto& pair : state.m_uniforms)
|
// Uniforms
|
||||||
|
if (state.m_uniforms.empty())
|
||||||
{
|
{
|
||||||
Append(pair.first);
|
for (const auto& pair : state.m_uniforms)
|
||||||
Append(" ");
|
{
|
||||||
Append(pair.second);
|
Append("uniform ");
|
||||||
AppendLine(";");
|
Append(pair.first);
|
||||||
}
|
Append(" ");
|
||||||
|
Append(pair.second);
|
||||||
|
AppendLine(";");
|
||||||
|
}
|
||||||
|
|
||||||
AppendLine();
|
AppendLine();
|
||||||
|
}
|
||||||
|
|
||||||
Function entryPoint;
|
Function entryPoint;
|
||||||
entryPoint.name = "main"; //< GLSL has only one entry point name possible
|
entryPoint.name = "main"; //< GLSL has only one entry point name possible
|
||||||
|
|
@ -56,12 +61,52 @@ namespace Nz
|
||||||
m_functions[name] = std::move(func);
|
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");
|
NazaraAssert(m_currentState, "This function should only be called while processing an AST");
|
||||||
|
|
||||||
if (m_currentFunction)
|
switch (kind)
|
||||||
m_currentFunction->variables.insert(std::make_pair(type, name));
|
{
|
||||||
|
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)
|
void GlslWriter::Write(const ShaderAst::NodePtr& node)
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,7 @@ namespace Nz { namespace ShaderAst
|
||||||
|
|
||||||
void Variable::Register(ShaderWriter& visitor)
|
void Variable::Register(ShaderWriter& visitor)
|
||||||
{
|
{
|
||||||
visitor.RegisterVariable(name, type);
|
visitor.RegisterVariable(kind, name, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Variable::Visit(ShaderWriter& visitor)
|
void Variable::Visit(ShaderWriter& visitor)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue