ShaderGraph: Improve GLSL generation by introducing DeclareVariable statement
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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*/)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user