ShaderGraph: Improve GLSL generation by introducing DeclareVariable statement

This commit is contained in:
Lynix
2020-05-27 20:08:41 +02:00
parent e4348349da
commit 3fc4de26e3
9 changed files with 59 additions and 18 deletions

View File

@@ -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();

View File

@@ -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*/)
{
}

View File

@@ -107,7 +107,6 @@ Nz::ShaderAst::StatementPtr ShaderGraph::ToAst()
{
ShaderNode* shaderNode = static_cast<ShaderNode*>(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;