// 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_BUILDER_HPP #define NAZARA_SHADER_BUILDER_HPP #include #include #include #include #include namespace Nz::ShaderBuilder { namespace Impl { struct AccessIndex { inline std::unique_ptr operator()(ShaderAst::ExpressionPtr structExpr, std::vector memberIndices) const; }; struct AccessMember { inline std::unique_ptr operator()(ShaderAst::ExpressionPtr structExpr, std::vector memberIdentifiers) const; }; struct Assign { inline std::unique_ptr operator()(ShaderAst::AssignType op, ShaderAst::ExpressionPtr left, ShaderAst::ExpressionPtr right) const; }; struct Binary { inline std::unique_ptr operator()(ShaderAst::BinaryType op, ShaderAst::ExpressionPtr left, ShaderAst::ExpressionPtr right) const; }; struct Branch { inline std::unique_ptr operator()(ShaderAst::ExpressionPtr condition, ShaderAst::StatementPtr truePath, ShaderAst::StatementPtr falsePath = nullptr) const; inline std::unique_ptr operator()(std::vector condStatements, ShaderAst::StatementPtr elseStatement = nullptr) const; }; struct CallFunction { inline std::unique_ptr operator()(std::string functionName, std::vector parameters) const; }; struct Cast { inline std::unique_ptr operator()(ShaderAst::ExpressionType targetType, std::array expressions) const; inline std::unique_ptr operator()(ShaderAst::ExpressionType targetType, std::vector expressions) const; }; struct ConditionalExpression { inline std::unique_ptr operator()(std::size_t optionIndex, ShaderAst::ExpressionPtr truePath, ShaderAst::ExpressionPtr falsePath) const; }; struct ConditionalStatement { inline std::unique_ptr operator()(std::size_t optionIndex, ShaderAst::StatementPtr statement) const; }; struct Constant { inline std::unique_ptr operator()(ShaderAst::ConstantValue value) const; }; struct DeclareFunction { inline std::unique_ptr operator()(std::string name, ShaderAst::StatementPtr statement) const; inline std::unique_ptr operator()(std::string name, std::vector parameters, std::vector statements, ShaderAst::ExpressionType returnType = ShaderAst::NoType{}) const; inline std::unique_ptr operator()(std::optional entryStage, std::string name, std::vector parameters, std::vector statements, ShaderAst::ExpressionType returnType = ShaderAst::NoType{}) const; }; struct DeclareOption { inline std::unique_ptr operator()(std::string name, ShaderAst::ExpressionType type, ShaderAst::ExpressionPtr initialValue = nullptr) const; }; struct DeclareStruct { inline std::unique_ptr operator()(ShaderAst::StructDescription description) const; }; struct DeclareVariable { inline std::unique_ptr operator()(std::string name, ShaderAst::ExpressionPtr initialValue) const; inline std::unique_ptr operator()(std::string name, ShaderAst::ExpressionType type, ShaderAst::ExpressionPtr initialValue = nullptr) const; }; struct ExpressionStatement { inline std::unique_ptr operator()(ShaderAst::ExpressionPtr expression) const; }; struct Identifier { inline std::unique_ptr operator()(std::string name) const; }; struct Intrinsic { inline std::unique_ptr operator()(ShaderAst::IntrinsicType intrinsicType, std::vector parameters) const; }; struct Multi { inline std::unique_ptr operator()(std::vector statements = {}) const; }; template struct NoParam { inline std::unique_ptr operator()() const; }; struct Return { inline std::unique_ptr operator()(ShaderAst::ExpressionPtr expr = nullptr) const; }; struct SelectOption { inline std::unique_ptr operator()(std::string optionName, ShaderAst::ExpressionPtr truePath, ShaderAst::ExpressionPtr falsePath) const; }; struct Swizzle { inline std::unique_ptr operator()(ShaderAst::ExpressionPtr expression, std::vector swizzleComponents) const; }; struct Unary { inline std::unique_ptr operator()(ShaderAst::UnaryType op, ShaderAst::ExpressionPtr expression) const; }; } constexpr Impl::AccessIndex AccessIndex; constexpr Impl::AccessMember AccessMember; constexpr Impl::Assign Assign; constexpr Impl::Binary Binary; constexpr Impl::Branch Branch; constexpr Impl::CallFunction CallFunction; constexpr Impl::Cast Cast; constexpr Impl::ConditionalExpression ConditionalExpression; constexpr Impl::ConditionalStatement ConditionalStatement; constexpr Impl::Constant Constant; constexpr Impl::DeclareFunction DeclareFunction; constexpr Impl::DeclareOption DeclareOption; constexpr Impl::DeclareStruct DeclareStruct; constexpr Impl::DeclareVariable DeclareVariable; constexpr Impl::ExpressionStatement ExpressionStatement; constexpr Impl::NoParam Discard; constexpr Impl::Identifier Identifier; constexpr Impl::Intrinsic Intrinsic; constexpr Impl::Multi MultiStatement; constexpr Impl::NoParam NoOp; constexpr Impl::Return Return; constexpr Impl::SelectOption SelectOption; constexpr Impl::Swizzle Swizzle; constexpr Impl::Unary Unary; } #include #endif // NAZARA_SHADER_BUILDER_HPP