diff --git a/include/Nazara/Shader/ShaderAstCloner.hpp b/include/Nazara/Shader/ShaderAstCloner.hpp index 08bb53227..8bd43c4fb 100644 --- a/include/Nazara/Shader/ShaderAstCloner.hpp +++ b/include/Nazara/Shader/ShaderAstCloner.hpp @@ -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 void PushExpression(ExpressionPtr expression); void PushStatement(StatementPtr statement); diff --git a/src/Nazara/Shader/ShaderAstCloner.cpp b/src/Nazara/Shader/ShaderAstCloner.cpp index 1a80e654f..efa5be3a5 100644 --- a/src/Nazara/Shader/ShaderAstCloner.cpp +++ b/src/Nazara/Shader/ShaderAstCloner.cpp @@ -42,6 +42,32 @@ namespace Nz::ShaderAst return PopStatement(); } + StatementPtr AstCloner::Clone(BranchStatement& node) + { + auto clone = std::make_unique(); + 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(); + clone->conditionName = node.conditionName; + clone->statement = CloneStatement(node.statement); + + return clone; + } + StatementPtr AstCloner::Clone(DeclareExternalStatement& node) { auto clone = std::make_unique(); @@ -88,6 +114,42 @@ namespace Nz::ShaderAst return clone; } + StatementPtr AstCloner::Clone(DiscardStatement& /*node*/) + { + return std::make_unique(); + } + + StatementPtr AstCloner::Clone(ExpressionStatement& node) + { + auto clone = std::make_unique(); + clone->expression = CloneExpression(node.expression); + + return clone; + } + + StatementPtr AstCloner::Clone(MultiStatement& node) + { + auto clone = std::make_unique(); + 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(); + } + + StatementPtr AstCloner::Clone(ReturnStatement& node) + { + auto clone = std::make_unique(); + clone->returnExpr = CloneExpression(node.returnExpr); + + return clone; + } + ExpressionPtr AstCloner::Clone(AccessMemberIdentifierExpression& node) { auto clone = std::make_unique(); @@ -110,6 +172,30 @@ namespace Nz::ShaderAst return clone; } + ExpressionPtr AstCloner::Clone(AssignExpression& node) + { + auto clone = std::make_unique(); + 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(); + 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(); @@ -129,6 +215,28 @@ namespace Nz::ShaderAst return clone; } + ExpressionPtr AstCloner::Clone(ConditionalExpression& node) + { + auto clone = std::make_unique(); + 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(); + clone->value = node.value; + + clone->cachedExpressionType = node.cachedExpressionType; + + return clone; + } + ExpressionPtr AstCloner::Clone(IdentifierExpression& node) { auto clone = std::make_unique(); @@ -139,6 +247,32 @@ namespace Nz::ShaderAst return clone; } + ExpressionPtr AstCloner::Clone(IntrinsicExpression& node) + { + auto clone = std::make_unique(); + 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(); + 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(); @@ -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(); - 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(); - 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(); - 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(); - 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(); - 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(); - 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(); - 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(); - 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()); - } - - void AstCloner::Visit(ExpressionStatement& node) - { - auto clone = std::make_unique(); - clone->expression = CloneExpression(node.expression); - - PushStatement(std::move(clone)); - } - - void AstCloner::Visit(MultiStatement& node) - { - auto clone = std::make_unique(); - 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()); - } - - void AstCloner::Visit(ReturnStatement& node) - { - auto clone = std::make_unique(); - clone->returnExpr = CloneExpression(node.returnExpr); - - PushStatement(std::move(clone)); - } +#include void AstCloner::PushExpression(ExpressionPtr expression) {