// Copyright (C) 2021 Jérôme "Lynix" Leclercq (lynix680@gmail.com) // This file is part of the "Nazara Engine - Shader module" // For conditions of distribution and use, see copyright notice in Config.hpp #pragma once #ifndef NAZARA_SHADER_AST_NODES_HPP #define NAZARA_SHADER_AST_NODES_HPP #include #include #include #include #include #include #include #include #include #include #include #include #include namespace Nz::ShaderAst { class AstExpressionVisitor; class AstStatementVisitor; struct Node; using NodePtr = std::unique_ptr; struct NAZARA_SHADER_API Node { Node() = default; Node(const Node&) = delete; Node(Node&&) noexcept = default; virtual ~Node(); virtual NodeType GetType() const = 0; Node& operator=(const Node&) = delete; Node& operator=(Node&&) noexcept = default; }; // Expressions struct Expression; using ExpressionPtr = std::unique_ptr; struct NAZARA_SHADER_API Expression : Node { Expression() = default; Expression(const Expression&) = delete; Expression(Expression&&) noexcept = default; ~Expression() = default; virtual void Visit(AstExpressionVisitor& visitor) = 0; Expression& operator=(const Expression&) = delete; Expression& operator=(Expression&&) noexcept = default; std::optional cachedExpressionType; }; struct NAZARA_SHADER_API AccessIdentifierExpression : Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; ExpressionPtr expr; std::vector identifiers; }; struct NAZARA_SHADER_API AccessIndexExpression : Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; ExpressionPtr expr; std::vector indices; }; struct NAZARA_SHADER_API AssignExpression : Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; AssignType op; ExpressionPtr left; ExpressionPtr right; }; struct NAZARA_SHADER_API BinaryExpression : Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; BinaryType op; ExpressionPtr left; ExpressionPtr right; }; struct NAZARA_SHADER_API CallFunctionExpression : Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; std::variant targetFunction; std::vector parameters; }; struct NAZARA_SHADER_API CallMethodExpression : Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; ExpressionPtr object; std::string methodName; std::vector parameters; }; struct NAZARA_SHADER_API CastExpression : Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; ExpressionType targetType; std::array expressions; }; struct NAZARA_SHADER_API ConditionalExpression : Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; ExpressionPtr condition; ExpressionPtr falsePath; ExpressionPtr truePath; }; struct NAZARA_SHADER_API ConstantExpression : Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; std::size_t constantId; }; struct NAZARA_SHADER_API ConstantValueExpression : Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; ShaderAst::ConstantValue value; }; struct NAZARA_SHADER_API IdentifierExpression : Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; std::string identifier; }; struct NAZARA_SHADER_API IntrinsicExpression : Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; IntrinsicType intrinsic; std::vector parameters; }; struct NAZARA_SHADER_API SwizzleExpression : Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; std::array components; std::size_t componentCount; ExpressionPtr expression; }; struct NAZARA_SHADER_API VariableExpression : Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; std::size_t variableId; }; struct NAZARA_SHADER_API UnaryExpression : Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; UnaryType op; ExpressionPtr expression; }; // Statements struct Statement; using StatementPtr = std::unique_ptr; struct NAZARA_SHADER_API Statement : Node { Statement() = default; Statement(const Statement&) = delete; Statement(Statement&&) noexcept = default; ~Statement() = default; virtual void Visit(AstStatementVisitor& visitor) = 0; Statement& operator=(const Statement&) = delete; Statement& operator=(Statement&&) noexcept = default; }; struct NAZARA_SHADER_API BranchStatement : Statement { NodeType GetType() const override; void Visit(AstStatementVisitor& visitor) override; struct ConditionalStatement { ExpressionPtr condition; StatementPtr statement; }; std::vector condStatements; StatementPtr elseStatement; bool isConst = false; }; struct NAZARA_SHADER_API ConditionalStatement : Statement { NodeType GetType() const override; void Visit(AstStatementVisitor& visitor) override; ExpressionPtr condition; StatementPtr statement; }; struct NAZARA_SHADER_API DeclareConstStatement : Statement { NodeType GetType() const override; void Visit(AstStatementVisitor& visitor) override; std::optional constIndex; std::string name; ExpressionPtr expression; ExpressionType type; }; struct NAZARA_SHADER_API DeclareExternalStatement : Statement { NodeType GetType() const override; void Visit(AstStatementVisitor& visitor) override; struct ExternalVar { AttributeValue bindingIndex; AttributeValue bindingSet; std::string name; ExpressionType type; }; AttributeValue bindingSet; std::optional varIndex; std::vector externalVars; }; struct NAZARA_SHADER_API DeclareFunctionStatement : Statement { NodeType GetType() const override; void Visit(AstStatementVisitor& visitor) override; struct Parameter { std::string name; ExpressionType type; }; AttributeValue depthWrite; AttributeValue earlyFragmentTests; AttributeValue entryStage; std::optional funcIndex; std::optional varIndex; std::string name; std::vector parameters; std::vector statements; ExpressionType returnType; }; struct NAZARA_SHADER_API DeclareOptionStatement : Statement { NodeType GetType() const override; void Visit(AstStatementVisitor& visitor) override; std::optional optIndex; std::string optName; ExpressionPtr defaultValue; ExpressionType optType; }; struct NAZARA_SHADER_API DeclareStructStatement : Statement { NodeType GetType() const override; void Visit(AstStatementVisitor& visitor) override; std::optional structIndex; StructDescription description; }; struct NAZARA_SHADER_API DeclareVariableStatement : Statement { NodeType GetType() const override; void Visit(AstStatementVisitor& visitor) override; std::optional varIndex; std::string varName; ExpressionPtr initialExpression; ExpressionType varType; }; struct NAZARA_SHADER_API DiscardStatement : Statement { NodeType GetType() const override; void Visit(AstStatementVisitor& visitor) override; }; struct NAZARA_SHADER_API ExpressionStatement : Statement { NodeType GetType() const override; void Visit(AstStatementVisitor& visitor) override; ExpressionPtr expression; }; struct NAZARA_SHADER_API MultiStatement : Statement { NodeType GetType() const override; void Visit(AstStatementVisitor& visitor) override; std::vector statements; }; struct NAZARA_SHADER_API NoOpStatement : Statement { NodeType GetType() const override; void Visit(AstStatementVisitor& visitor) override; }; struct NAZARA_SHADER_API ReturnStatement : Statement { NodeType GetType() const override; void Visit(AstStatementVisitor& visitor) override; ExpressionPtr returnExpr; }; struct NAZARA_SHADER_API WhileStatement : Statement { NodeType GetType() const override; void Visit(AstStatementVisitor& visitor) override; ExpressionPtr condition; StatementPtr body; }; inline const ShaderAst::ExpressionType& GetExpressionType(ShaderAst::Expression& expr); inline bool IsExpression(NodeType nodeType); inline bool IsStatement(NodeType nodeType); } #include #endif // NAZARA_SHADER_AST_NODES_HPP