// Copyright (C) 2022 Jérôme "Lynix" Leclercq (lynix680@gmail.com) // 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_GRAPHICS_MATERIAL_HPP #define NAZARA_GRAPHICS_MATERIAL_HPP #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace Nz { struct NAZARA_GRAPHICS_API MaterialParams : ResourceParameters { bool IsValid() const; }; class Material; class MaterialInstance; class RenderPipelineLayout; using MaterialLibrary = ObjectLibrary; using MaterialLoader = ResourceLoader; using MaterialManager = ResourceManager; using MaterialSaver = ResourceSaver; class NAZARA_GRAPHICS_API Material : public Resource, public std::enable_shared_from_this { public: struct TextureData; struct UniformBlockData; Material(MaterialSettings settings, const std::string& referenceModuleName); Material(MaterialSettings settings, const nzsl::Ast::ModulePtr& referenceModule); ~Material() = default; std::shared_ptr GetDefaultInstance() const; inline std::size_t FindTextureByTag(const std::string& tag) const; inline std::size_t FindUniformBlockByTag(const std::string& tag) const; inline UInt32 GetEngineBindingIndex(EngineShaderBinding shaderBinding) const; inline const std::shared_ptr& GetRenderPipelineLayout() const; inline const MaterialSettings& GetSettings() const; inline const TextureData& GetTextureData(std::size_t textureIndex) const; inline std::size_t GetTextureCount() const; inline const UniformBlockData& GetUniformBlockData(std::size_t uniformBlockIndex) const; inline std::size_t GetUniformBlockCount() const; std::shared_ptr Instantiate() const; static std::shared_ptr Build(const ParameterList& materialData); static std::shared_ptr LoadFromFile(const std::filesystem::path& filePath, const MaterialParams& params = MaterialParams()); static std::shared_ptr LoadFromMemory(const void* data, std::size_t size, const MaterialParams& params = MaterialParams()); static std::shared_ptr LoadFromStream(Stream& stream, const MaterialParams& params = MaterialParams()); static inline ImageType ToImageType(nzsl::ImageType imageType); static constexpr UInt32 InvalidBindingIndex = std::numeric_limits::max(); static constexpr std::size_t InvalidIndex = std::numeric_limits::max(); struct TextureData { UInt32 bindingSet; UInt32 bindingIndex; ImageType imageType; }; struct UniformBlockData { UInt32 bindingSet; UInt32 bindingIndex; std::size_t structIndex; std::unique_ptr bufferPool; }; private: std::array m_engineShaderBindings; std::shared_ptr m_renderPipelineLayout; std::unordered_map m_optionValues; std::unordered_map m_textureByTag; std::unordered_map m_uniformBlockByTag; std::vector m_textures; std::vector m_uniformBlocks; mutable std::weak_ptr m_defaultInstance; MaterialSettings m_settings; ShaderReflection m_reflection; }; } #include #endif // NAZARA_GRAPHICS_MATERIAL_HPP