// Copyright (C) 2020 Jérôme Leclercq // This file is part of the "Nazara Engine - Renderer module" // For conditions of distribution and use, see copyright notice in Config.hpp #pragma once #ifndef NAZARA_SHADER_AST_HPP #define NAZARA_SHADER_AST_HPP #include #include #include #include #include #include #include namespace Nz { class NAZARA_SHADER_API ShaderAst { public: struct Function; struct FunctionParameter; struct InputOutput; struct Struct; struct StructMember; struct Uniform; struct VariableBase; inline ShaderAst(ShaderStageType shaderStage); ShaderAst(const ShaderAst&) = default; ShaderAst(ShaderAst&&) = default; ~ShaderAst() = default; void AddFunction(std::string name, ShaderNodes::StatementPtr statement, std::vector parameters = {}, ShaderNodes::BasicType returnType = ShaderNodes::BasicType::Void); void AddInput(std::string name, ShaderExpressionType type, std::optional locationIndex = {}); void AddOutput(std::string name, ShaderExpressionType type, std::optional locationIndex = {}); void AddStruct(std::string name, std::vector members); void AddUniform(std::string name, ShaderExpressionType type, std::optional bindingIndex = {}, std::optional memoryLayout = {}); inline const Function& GetFunction(std::size_t i) const; inline std::size_t GetFunctionCount() const; inline const std::vector& GetFunctions() const; inline const InputOutput& GetInput(std::size_t i) const; inline std::size_t GetInputCount() const; inline const std::vector& GetInputs() const; inline const InputOutput& GetOutput(std::size_t i) const; inline std::size_t GetOutputCount() const; inline const std::vector& GetOutputs() const; inline ShaderStageType GetStage() const; inline const Struct& GetStruct(std::size_t i) const; inline std::size_t GetStructCount() const; inline const std::vector& GetStructs() const; inline const Uniform& GetUniform(std::size_t i) const; inline std::size_t GetUniformCount() const; inline const std::vector& GetUniforms() const; ShaderAst& operator=(const ShaderAst&) = default; ShaderAst& operator=(ShaderAst&&) = default; struct VariableBase { std::string name; ShaderExpressionType type; }; struct FunctionParameter : VariableBase { }; struct Function { std::string name; std::vector parameters; ShaderNodes::BasicType returnType; ShaderNodes::StatementPtr statement; }; struct InputOutput : VariableBase { std::optional locationIndex; }; struct Uniform : VariableBase { std::optional bindingIndex; std::optional memoryLayout; }; struct Struct { std::string name; std::vector members; }; struct StructMember { std::string name; ShaderExpressionType type; }; private: std::vector m_functions; std::vector m_inputs; std::vector m_outputs; std::vector m_structs; std::vector m_uniforms; ShaderStageType m_stage; }; } #include #endif // NAZARA_SHADER_AST_HPP