// Copyright (C) 2020 Jérôme Leclercq // This file is part of the "Nazara Engine - Shader generator" // 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 AccessMemberIdentifierExpression : public Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; ExpressionPtr structExpr; std::vector memberIdentifiers; }; struct NAZARA_SHADER_API AccessMemberIndexExpression : public Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; ExpressionPtr structExpr; std::vector memberIndices; }; struct NAZARA_SHADER_API AssignExpression : public Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; AssignType op; ExpressionPtr left; ExpressionPtr right; }; struct NAZARA_SHADER_API BinaryExpression : public Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; BinaryType op; ExpressionPtr left; ExpressionPtr right; }; struct NAZARA_SHADER_API CastExpression : public Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; ExpressionType targetType; std::array expressions; }; struct NAZARA_SHADER_API ConditionalExpression : public Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; std::size_t optionIndex; ExpressionPtr falsePath; ExpressionPtr truePath; }; struct NAZARA_SHADER_API ConstantExpression : public Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; ExpressionType GetExpressionType() const; ShaderAst::ConstantValue value; }; struct NAZARA_SHADER_API IdentifierExpression : public Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; std::string identifier; }; struct NAZARA_SHADER_API IntrinsicExpression : public Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; IntrinsicType intrinsic; std::vector parameters; }; struct NAZARA_SHADER_API SelectOptionExpression : public Expression { NodeType GetType() const override; void Visit(AstExpressionVisitor& visitor) override; std::string optionName; ExpressionPtr falsePath; ExpressionPtr truePath; }; struct NAZARA_SHADER_API SwizzleExpression : public 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; }; // 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 : public Statement { NodeType GetType() const override; void Visit(AstStatementVisitor& visitor) override; struct ConditionalStatement { ExpressionPtr condition; StatementPtr statement; }; std::vector condStatements; StatementPtr elseStatement; }; struct NAZARA_SHADER_API ConditionalStatement : Statement { NodeType GetType() const override; void Visit(AstStatementVisitor& visitor) override; std::size_t optionIndex; StatementPtr statement; }; struct NAZARA_SHADER_API DeclareExternalStatement : Statement { NodeType GetType() const override; void Visit(AstStatementVisitor& visitor) override; struct ExternalVar { std::optional bindingIndex; std::string name; ExpressionType type; }; 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; }; std::optional entryStage; std::optional funcIndex; std::optional varIndex; std::string optionName; 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 initialValue; 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; }; inline const ShaderAst::ExpressionType& GetExpressionType(ShaderAst::Expression& expr); inline bool IsExpression(NodeType nodeType); inline bool IsStatement(NodeType nodeType); } #include #endif