Shader: Improve ShaderAstCloner
This commit is contained in:
parent
0bb9c37a38
commit
8515c9cea1
|
|
@ -33,43 +33,33 @@ namespace Nz::ShaderAst
|
|||
virtual ExpressionPtr CloneExpression(ExpressionPtr& expr);
|
||||
virtual StatementPtr CloneStatement(StatementPtr& statement);
|
||||
|
||||
|
||||
virtual ExpressionPtr Clone(AccessMemberIdentifierExpression& node);
|
||||
virtual ExpressionPtr Clone(AccessMemberIndexExpression& node);
|
||||
virtual ExpressionPtr Clone(AssignExpression& node);
|
||||
virtual ExpressionPtr Clone(BinaryExpression& node);
|
||||
virtual ExpressionPtr Clone(CastExpression& node);
|
||||
virtual ExpressionPtr Clone(ConditionalExpression& node);
|
||||
virtual ExpressionPtr Clone(ConstantExpression& node);
|
||||
virtual ExpressionPtr Clone(IdentifierExpression& node);
|
||||
virtual ExpressionPtr Clone(IntrinsicExpression& node);
|
||||
virtual ExpressionPtr Clone(SwizzleExpression& node);
|
||||
virtual ExpressionPtr Clone(VariableExpression& node);
|
||||
|
||||
virtual StatementPtr Clone(BranchStatement& node);
|
||||
virtual StatementPtr Clone(ConditionalStatement& node);
|
||||
virtual StatementPtr Clone(DeclareExternalStatement& node);
|
||||
virtual StatementPtr Clone(DeclareFunctionStatement& node);
|
||||
virtual StatementPtr Clone(DeclareStructStatement& node);
|
||||
virtual StatementPtr Clone(DeclareVariableStatement& node);
|
||||
virtual StatementPtr Clone(DiscardStatement& node);
|
||||
virtual StatementPtr Clone(ExpressionStatement& node);
|
||||
virtual StatementPtr Clone(MultiStatement& node);
|
||||
virtual StatementPtr Clone(NoOpStatement& node);
|
||||
virtual StatementPtr Clone(ReturnStatement& node);
|
||||
|
||||
virtual ExpressionPtr Clone(AccessMemberIdentifierExpression& node);
|
||||
virtual ExpressionPtr Clone(AccessMemberIndexExpression& node);
|
||||
virtual ExpressionPtr Clone(CastExpression& node);
|
||||
virtual ExpressionPtr Clone(IdentifierExpression& node);
|
||||
virtual ExpressionPtr Clone(VariableExpression& node);
|
||||
|
||||
using AstExpressionVisitor::Visit;
|
||||
using AstStatementVisitor::Visit;
|
||||
|
||||
void Visit(AccessMemberIdentifierExpression& node) override;
|
||||
void Visit(AccessMemberIndexExpression& node) override;
|
||||
void Visit(AssignExpression& node) override;
|
||||
void Visit(BinaryExpression& node) override;
|
||||
void Visit(CastExpression& node) override;
|
||||
void Visit(ConditionalExpression& node) override;
|
||||
void Visit(ConstantExpression& node) override;
|
||||
void Visit(IdentifierExpression& node) override;
|
||||
void Visit(IntrinsicExpression& node) override;
|
||||
void Visit(SwizzleExpression& node) override;
|
||||
void Visit(VariableExpression& node) override;
|
||||
|
||||
void Visit(BranchStatement& node) override;
|
||||
void Visit(ConditionalStatement& node) override;
|
||||
void Visit(DeclareExternalStatement& node) override;
|
||||
void Visit(DeclareFunctionStatement& node) override;
|
||||
void Visit(DeclareStructStatement& node) override;
|
||||
void Visit(DeclareVariableStatement& node) override;
|
||||
void Visit(DiscardStatement& node) override;
|
||||
void Visit(ExpressionStatement& node) override;
|
||||
void Visit(MultiStatement& node) override;
|
||||
void Visit(NoOpStatement& node) override;
|
||||
void Visit(ReturnStatement& node) override;
|
||||
#define NAZARA_SHADERAST_NODE(NodeType) void Visit(NodeType& node) override;
|
||||
#include <Nazara/Shader/ShaderAstNodes.hpp>
|
||||
|
||||
void PushExpression(ExpressionPtr expression);
|
||||
void PushStatement(StatementPtr statement);
|
||||
|
|
|
|||
|
|
@ -42,6 +42,32 @@ namespace Nz::ShaderAst
|
|||
return PopStatement();
|
||||
}
|
||||
|
||||
StatementPtr AstCloner::Clone(BranchStatement& node)
|
||||
{
|
||||
auto clone = std::make_unique<BranchStatement>();
|
||||
clone->condStatements.reserve(node.condStatements.size());
|
||||
|
||||
for (auto& cond : node.condStatements)
|
||||
{
|
||||
auto& condStatement = clone->condStatements.emplace_back();
|
||||
condStatement.condition = CloneExpression(cond.condition);
|
||||
condStatement.statement = CloneStatement(cond.statement);
|
||||
}
|
||||
|
||||
clone->elseStatement = CloneStatement(node.elseStatement);
|
||||
|
||||
return clone;
|
||||
}
|
||||
|
||||
StatementPtr AstCloner::Clone(ConditionalStatement& node)
|
||||
{
|
||||
auto clone = std::make_unique<ConditionalStatement>();
|
||||
clone->conditionName = node.conditionName;
|
||||
clone->statement = CloneStatement(node.statement);
|
||||
|
||||
return clone;
|
||||
}
|
||||
|
||||
StatementPtr AstCloner::Clone(DeclareExternalStatement& node)
|
||||
{
|
||||
auto clone = std::make_unique<DeclareExternalStatement>();
|
||||
|
|
@ -88,6 +114,42 @@ namespace Nz::ShaderAst
|
|||
return clone;
|
||||
}
|
||||
|
||||
StatementPtr AstCloner::Clone(DiscardStatement& /*node*/)
|
||||
{
|
||||
return std::make_unique<DiscardStatement>();
|
||||
}
|
||||
|
||||
StatementPtr AstCloner::Clone(ExpressionStatement& node)
|
||||
{
|
||||
auto clone = std::make_unique<ExpressionStatement>();
|
||||
clone->expression = CloneExpression(node.expression);
|
||||
|
||||
return clone;
|
||||
}
|
||||
|
||||
StatementPtr AstCloner::Clone(MultiStatement& node)
|
||||
{
|
||||
auto clone = std::make_unique<MultiStatement>();
|
||||
clone->statements.reserve(node.statements.size());
|
||||
for (auto& statement : node.statements)
|
||||
clone->statements.push_back(CloneStatement(statement));
|
||||
|
||||
return clone;
|
||||
}
|
||||
|
||||
StatementPtr AstCloner::Clone(NoOpStatement& /*node*/)
|
||||
{
|
||||
return std::make_unique<NoOpStatement>();
|
||||
}
|
||||
|
||||
StatementPtr AstCloner::Clone(ReturnStatement& node)
|
||||
{
|
||||
auto clone = std::make_unique<ReturnStatement>();
|
||||
clone->returnExpr = CloneExpression(node.returnExpr);
|
||||
|
||||
return clone;
|
||||
}
|
||||
|
||||
ExpressionPtr AstCloner::Clone(AccessMemberIdentifierExpression& node)
|
||||
{
|
||||
auto clone = std::make_unique<AccessMemberIdentifierExpression>();
|
||||
|
|
@ -110,6 +172,30 @@ namespace Nz::ShaderAst
|
|||
return clone;
|
||||
}
|
||||
|
||||
ExpressionPtr AstCloner::Clone(AssignExpression& node)
|
||||
{
|
||||
auto clone = std::make_unique<AssignExpression>();
|
||||
clone->op = node.op;
|
||||
clone->left = CloneExpression(node.left);
|
||||
clone->right = CloneExpression(node.right);
|
||||
|
||||
clone->cachedExpressionType = node.cachedExpressionType;
|
||||
|
||||
return clone;
|
||||
}
|
||||
|
||||
ExpressionPtr AstCloner::Clone(BinaryExpression& node)
|
||||
{
|
||||
auto clone = std::make_unique<BinaryExpression>();
|
||||
clone->op = node.op;
|
||||
clone->left = CloneExpression(node.left);
|
||||
clone->right = CloneExpression(node.right);
|
||||
|
||||
clone->cachedExpressionType = node.cachedExpressionType;
|
||||
|
||||
return clone;
|
||||
}
|
||||
|
||||
ExpressionPtr AstCloner::Clone(CastExpression& node)
|
||||
{
|
||||
auto clone = std::make_unique<CastExpression>();
|
||||
|
|
@ -129,6 +215,28 @@ namespace Nz::ShaderAst
|
|||
return clone;
|
||||
}
|
||||
|
||||
ExpressionPtr AstCloner::Clone(ConditionalExpression& node)
|
||||
{
|
||||
auto clone = std::make_unique<ConditionalExpression>();
|
||||
clone->conditionName = node.conditionName;
|
||||
clone->falsePath = CloneExpression(node.falsePath);
|
||||
clone->truePath = CloneExpression(node.truePath);
|
||||
|
||||
clone->cachedExpressionType = node.cachedExpressionType;
|
||||
|
||||
return clone;
|
||||
}
|
||||
|
||||
ExpressionPtr AstCloner::Clone(ConstantExpression& node)
|
||||
{
|
||||
auto clone = std::make_unique<ConstantExpression>();
|
||||
clone->value = node.value;
|
||||
|
||||
clone->cachedExpressionType = node.cachedExpressionType;
|
||||
|
||||
return clone;
|
||||
}
|
||||
|
||||
ExpressionPtr AstCloner::Clone(IdentifierExpression& node)
|
||||
{
|
||||
auto clone = std::make_unique<IdentifierExpression>();
|
||||
|
|
@ -139,6 +247,32 @@ namespace Nz::ShaderAst
|
|||
return clone;
|
||||
}
|
||||
|
||||
ExpressionPtr AstCloner::Clone(IntrinsicExpression& node)
|
||||
{
|
||||
auto clone = std::make_unique<IntrinsicExpression>();
|
||||
clone->intrinsic = node.intrinsic;
|
||||
|
||||
clone->parameters.reserve(node.parameters.size());
|
||||
for (auto& parameter : node.parameters)
|
||||
clone->parameters.push_back(CloneExpression(parameter));
|
||||
|
||||
clone->cachedExpressionType = node.cachedExpressionType;
|
||||
|
||||
return clone;
|
||||
}
|
||||
|
||||
ExpressionPtr AstCloner::Clone(SwizzleExpression& node)
|
||||
{
|
||||
auto clone = std::make_unique<SwizzleExpression>();
|
||||
clone->componentCount = node.componentCount;
|
||||
clone->components = node.components;
|
||||
clone->expression = CloneExpression(node.expression);
|
||||
|
||||
clone->cachedExpressionType = node.cachedExpressionType;
|
||||
|
||||
return clone;
|
||||
}
|
||||
|
||||
ExpressionPtr AstCloner::Clone(VariableExpression& node)
|
||||
{
|
||||
auto clone = std::make_unique<VariableExpression>();
|
||||
|
|
@ -149,184 +283,17 @@ namespace Nz::ShaderAst
|
|||
return clone;
|
||||
}
|
||||
|
||||
void AstCloner::Visit(AccessMemberIdentifierExpression& node)
|
||||
{
|
||||
return PushExpression(Clone(node));
|
||||
#define NAZARA_SHADERAST_EXPRESSION(NodeType) void AstCloner::Visit(NodeType& node) \
|
||||
{ \
|
||||
PushExpression(Clone(node)); \
|
||||
}
|
||||
|
||||
void AstCloner::Visit(AccessMemberIndexExpression& node)
|
||||
{
|
||||
return PushExpression(Clone(node));
|
||||
#define NAZARA_SHADERAST_STATEMENT(NodeType) void AstCloner::Visit(NodeType& node) \
|
||||
{ \
|
||||
PushStatement(Clone(node)); \
|
||||
}
|
||||
|
||||
void AstCloner::Visit(AssignExpression& node)
|
||||
{
|
||||
auto clone = std::make_unique<AssignExpression>();
|
||||
clone->op = node.op;
|
||||
clone->left = CloneExpression(node.left);
|
||||
clone->right = CloneExpression(node.right);
|
||||
|
||||
clone->cachedExpressionType = node.cachedExpressionType;
|
||||
|
||||
PushExpression(std::move(clone));
|
||||
}
|
||||
|
||||
void AstCloner::Visit(BinaryExpression& node)
|
||||
{
|
||||
auto clone = std::make_unique<BinaryExpression>();
|
||||
clone->op = node.op;
|
||||
clone->left = CloneExpression(node.left);
|
||||
clone->right = CloneExpression(node.right);
|
||||
|
||||
clone->cachedExpressionType = node.cachedExpressionType;
|
||||
|
||||
PushExpression(std::move(clone));
|
||||
}
|
||||
|
||||
void AstCloner::Visit(CastExpression& node)
|
||||
{
|
||||
PushExpression(Clone(node));
|
||||
}
|
||||
|
||||
void AstCloner::Visit(ConditionalExpression& node)
|
||||
{
|
||||
auto clone = std::make_unique<ConditionalExpression>();
|
||||
clone->conditionName = node.conditionName;
|
||||
clone->falsePath = CloneExpression(node.falsePath);
|
||||
clone->truePath = CloneExpression(node.truePath);
|
||||
|
||||
clone->cachedExpressionType = node.cachedExpressionType;
|
||||
|
||||
PushExpression(std::move(clone));
|
||||
}
|
||||
|
||||
void AstCloner::Visit(ConstantExpression& node)
|
||||
{
|
||||
auto clone = std::make_unique<ConstantExpression>();
|
||||
clone->value = node.value;
|
||||
|
||||
clone->cachedExpressionType = node.cachedExpressionType;
|
||||
|
||||
PushExpression(std::move(clone));
|
||||
}
|
||||
|
||||
void AstCloner::Visit(IdentifierExpression& node)
|
||||
{
|
||||
PushExpression(Clone(node));
|
||||
}
|
||||
|
||||
void AstCloner::Visit(IntrinsicExpression& node)
|
||||
{
|
||||
auto clone = std::make_unique<IntrinsicExpression>();
|
||||
clone->intrinsic = node.intrinsic;
|
||||
|
||||
clone->parameters.reserve(node.parameters.size());
|
||||
for (auto& parameter : node.parameters)
|
||||
clone->parameters.push_back(CloneExpression(parameter));
|
||||
|
||||
clone->cachedExpressionType = node.cachedExpressionType;
|
||||
|
||||
PushExpression(std::move(clone));
|
||||
}
|
||||
|
||||
void AstCloner::Visit(SwizzleExpression& node)
|
||||
{
|
||||
auto clone = std::make_unique<SwizzleExpression>();
|
||||
clone->componentCount = node.componentCount;
|
||||
clone->components = node.components;
|
||||
clone->expression = CloneExpression(node.expression);
|
||||
|
||||
clone->cachedExpressionType = node.cachedExpressionType;
|
||||
|
||||
PushExpression(std::move(clone));
|
||||
}
|
||||
|
||||
void AstCloner::Visit(VariableExpression& node)
|
||||
{
|
||||
PushExpression(Clone(node));
|
||||
}
|
||||
|
||||
void AstCloner::Visit(BranchStatement& node)
|
||||
{
|
||||
auto clone = std::make_unique<BranchStatement>();
|
||||
clone->condStatements.reserve(node.condStatements.size());
|
||||
|
||||
for (auto& cond : node.condStatements)
|
||||
{
|
||||
auto& condStatement = clone->condStatements.emplace_back();
|
||||
condStatement.condition = CloneExpression(cond.condition);
|
||||
condStatement.statement = CloneStatement(cond.statement);
|
||||
}
|
||||
|
||||
clone->elseStatement = CloneStatement(node.elseStatement);
|
||||
|
||||
PushStatement(std::move(clone));
|
||||
}
|
||||
|
||||
void AstCloner::Visit(ConditionalStatement& node)
|
||||
{
|
||||
auto clone = std::make_unique<ConditionalStatement>();
|
||||
clone->conditionName = node.conditionName;
|
||||
clone->statement = CloneStatement(node.statement);
|
||||
|
||||
PushStatement(std::move(clone));
|
||||
}
|
||||
|
||||
void AstCloner::Visit(DeclareExternalStatement& node)
|
||||
{
|
||||
PushStatement(Clone(node));
|
||||
}
|
||||
|
||||
void AstCloner::Visit(DeclareFunctionStatement& node)
|
||||
{
|
||||
PushStatement(Clone(node));
|
||||
}
|
||||
|
||||
void AstCloner::Visit(DeclareStructStatement& node)
|
||||
{
|
||||
PushStatement(Clone(node));
|
||||
}
|
||||
|
||||
void AstCloner::Visit(DeclareVariableStatement& node)
|
||||
{
|
||||
PushStatement(Clone(node));
|
||||
}
|
||||
|
||||
void AstCloner::Visit(DiscardStatement& /*node*/)
|
||||
{
|
||||
PushStatement(std::make_unique<DiscardStatement>());
|
||||
}
|
||||
|
||||
void AstCloner::Visit(ExpressionStatement& node)
|
||||
{
|
||||
auto clone = std::make_unique<ExpressionStatement>();
|
||||
clone->expression = CloneExpression(node.expression);
|
||||
|
||||
PushStatement(std::move(clone));
|
||||
}
|
||||
|
||||
void AstCloner::Visit(MultiStatement& node)
|
||||
{
|
||||
auto clone = std::make_unique<MultiStatement>();
|
||||
clone->statements.reserve(node.statements.size());
|
||||
for (auto& statement : node.statements)
|
||||
clone->statements.push_back(CloneStatement(statement));
|
||||
|
||||
PushStatement(std::move(clone));
|
||||
}
|
||||
|
||||
void AstCloner::Visit(NoOpStatement& /*node*/)
|
||||
{
|
||||
PushStatement(std::make_unique<NoOpStatement>());
|
||||
}
|
||||
|
||||
void AstCloner::Visit(ReturnStatement& node)
|
||||
{
|
||||
auto clone = std::make_unique<ReturnStatement>();
|
||||
clone->returnExpr = CloneExpression(node.returnExpr);
|
||||
|
||||
PushStatement(std::move(clone));
|
||||
}
|
||||
#include <Nazara/Shader/ShaderAstNodes.hpp>
|
||||
|
||||
void AstCloner::PushExpression(ExpressionPtr expression)
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue