// Copyright (C) 2017 Jérôme Leclercq // This file is part of the "Nazara Engine - Graphics module" // For conditions of distribution and use, see copyright notice in Config.hpp #pragma once #ifndef NAZARA_MATERIALSETTINGS_HPP #define NAZARA_MATERIALSETTINGS_HPP #include #include #include #include #include #include #include #include #include namespace Nz { class UberShader; class MaterialSettings { public: using PredefinedBinding = std::array; using Shaders = std::array, ShaderStageTypeCount>; struct Builder; struct Condition; struct SharedUniformBlock; struct Texture; struct UniformBlock; inline MaterialSettings(); inline MaterialSettings(Builder builder); MaterialSettings(const MaterialSettings&) = default; MaterialSettings(MaterialSettings&&) = delete; ~MaterialSettings() = default; inline const Builder& GetBuilderData() const; inline const std::vector& GetConditions() const; inline std::size_t GetConditionIndex(const std::string_view& name) const; inline std::size_t GetPredefinedBindingIndex(PredefinedShaderBinding binding) const; inline const std::shared_ptr& GetRenderPipelineLayout() const; inline const std::shared_ptr& GetShader(ShaderStageType stage) const; inline const Shaders& GetShaders() const; inline const std::vector& GetSharedUniformBlocks() const; inline std::size_t GetSharedUniformBlockIndex(const std::string_view& name) const; inline std::size_t GetSharedUniformBlockVariableOffset(std::size_t uniformBlockIndex, const std::string_view& name) const; inline const std::vector& GetTextures() const; inline std::size_t GetTextureIndex(const std::string_view& name) const; inline const std::vector& GetUniformBlocks() const; inline std::size_t GetUniformBlockIndex(const std::string_view& name) const; inline std::size_t GetUniformBlockVariableOffset(std::size_t uniformBlockIndex, const std::string_view& name) const; MaterialSettings& operator=(const MaterialSettings&) = delete; MaterialSettings& operator=(MaterialSettings&&) = delete; static constexpr std::size_t InvalidIndex = std::numeric_limits::max(); struct Builder { PredefinedBinding predefinedBinding; Shaders shaders; std::vector conditions; std::vector textures; std::vector uniformBlocks; std::vector sharedUniformBlocks; }; struct Condition { std::string name; std::array enabledConditions; }; struct UniformVariable { std::string name; std::size_t offset; }; struct SharedUniformBlock { std::string name; std::string bindingPoint; std::vector uniforms; }; struct Texture { std::string bindingPoint; std::string name; ImageType type; }; struct UniformBlock { std::size_t blockSize; std::string name; std::string bindingPoint; std::vector uniforms; std::vector defaultValues; }; private: std::shared_ptr m_pipelineLayout; Builder m_data; }; } #include #endif // NAZARA_MATERIALPIPELINESETTINGS_HPP