// Copyright (C) 2022 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_SHADERBUILDER_HPP #define NAZARA_SHADER_SHADERBUILDER_HPP #include #include #include #include #include namespace Nz::ShaderBuilder { namespace Impl { struct AccessIndex { inline std::unique_ptr operator()(ShaderAst::ExpressionPtr expr, Int32 index) const; inline std::unique_ptr operator()(ShaderAst::ExpressionPtr expr, const std::vector& indexConstants) const; inline std::unique_ptr operator()(ShaderAst::ExpressionPtr expr, ShaderAst::ExpressionPtr indexExpression) const; inline std::unique_ptr operator()(ShaderAst::ExpressionPtr expr, std::vector indexExpressions) const; }; struct AccessMember { inline std::unique_ptr operator()(ShaderAst::ExpressionPtr expr, 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; }; template 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; inline std::unique_ptr operator()(ShaderAst::ExpressionPtr functionExpr, std::vector parameters) const; }; struct Cast { inline std::unique_ptr operator()(ShaderAst::ExpressionValue targetType, ShaderAst::ExpressionPtr expression) const; inline std::unique_ptr operator()(ShaderAst::ExpressionValue targetType, std::array expressions) const; inline std::unique_ptr operator()(ShaderAst::ExpressionValue targetType, std::vector expressions) const; }; struct ConditionalExpression { inline std::unique_ptr operator()(ShaderAst::ExpressionPtr condition, ShaderAst::ExpressionPtr truePath, ShaderAst::ExpressionPtr falsePath) const; }; struct ConditionalStatement { inline std::unique_ptr operator()(ShaderAst::ExpressionPtr condition, ShaderAst::StatementPtr statement) const; }; struct Constant { inline std::unique_ptr operator()(ShaderAst::ConstantValue value) const; template std::unique_ptr operator()(ShaderAst::ExpressionType type, T value) const; }; struct DeclareConst { inline std::unique_ptr operator()(std::string name, ShaderAst::ExpressionPtr initialValue) const; inline std::unique_ptr operator()(std::string name, ShaderAst::ExpressionValue type, ShaderAst::ExpressionPtr initialValue = nullptr) 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::ExpressionValue returnType = ShaderAst::ExpressionType{ ShaderAst::NoType{} }) const; inline std::unique_ptr operator()(std::optional entryStage, std::string name, ShaderAst::StatementPtr statement) const; inline std::unique_ptr operator()(std::optional entryStage, std::string name, std::vector parameters, std::vector statements, ShaderAst::ExpressionValue returnType = ShaderAst::ExpressionType{ ShaderAst::NoType{} }) const; }; struct DeclareOption { inline std::unique_ptr operator()(std::string name, ShaderAst::ExpressionValue 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::ExpressionValue type, ShaderAst::ExpressionPtr initialValue = nullptr) const; }; struct ExpressionStatement { inline std::unique_ptr operator()(ShaderAst::ExpressionPtr expression) const; }; struct For { inline std::unique_ptr operator()(std::string varName, ShaderAst::ExpressionPtr fromExpression, ShaderAst::ExpressionPtr toExpression, ShaderAst::StatementPtr statement) const; inline std::unique_ptr operator()(std::string varName, ShaderAst::ExpressionPtr fromExpression, ShaderAst::ExpressionPtr toExpression, ShaderAst::ExpressionPtr stepExpression, ShaderAst::StatementPtr statement) const; }; struct ForEach { inline std::unique_ptr operator()(std::string varName, ShaderAst::ExpressionPtr expression, ShaderAst::StatementPtr statement) 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 Scoped { inline std::unique_ptr operator()(ShaderAst::StatementPtr statement) const; }; struct Swizzle { inline std::unique_ptr operator()(ShaderAst::ExpressionPtr expression, std::array swizzleComponents, std::size_t componentCount) const; 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; }; struct Variable { inline std::unique_ptr operator()(std::size_t variableId, ShaderAst::ExpressionType expressionType) const; }; struct While { inline std::unique_ptr operator()(ShaderAst::ExpressionPtr condition, ShaderAst::StatementPtr body) 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::Branch ConstBranch; constexpr Impl::DeclareConst DeclareConst; 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::For For; constexpr Impl::ForEach ForEach; constexpr Impl::Identifier Identifier; constexpr Impl::Intrinsic Intrinsic; constexpr Impl::Multi MultiStatement; constexpr Impl::NoParam NoOp; constexpr Impl::Return Return; constexpr Impl::Scoped Scoped; constexpr Impl::Swizzle Swizzle; constexpr Impl::Unary Unary; constexpr Impl::Variable Variable; constexpr Impl::While While; } #include #endif // NAZARA_SHADER_SHADERBUILDER_HPP