// Copyright (C) 2023 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_MATERIALINSTANCE_HPP #define NAZARA_GRAPHICS_MATERIALINSTANCE_HPP #include #include #include #include #include #include #include #include #include #include #include #include namespace Nz { struct NAZARA_GRAPHICS_API MaterialInstanceParams : ResourceParameters { MaterialLightingType lightingType = MaterialLightingType::None; bool IsValid() const; }; class Material; class MaterialInstance; class MaterialPipeline; class Texture; using MaterialInstanceLibrary = ObjectLibrary; using MaterialInstanceLoader = ResourceLoader; using MaterialInstanceManager = ResourceManager; using MaterialInstanceSaver = ResourceSaver; class NAZARA_GRAPHICS_API MaterialInstance : public Resource, public TransferInterface { struct CopyToken {}; public: using Params = MaterialInstanceParams; MaterialInstance(std::shared_ptr parent); MaterialInstance(const MaterialInstance&) = delete; MaterialInstance(const MaterialInstance& material, CopyToken); MaterialInstance(MaterialInstance&&) = delete; ~MaterialInstance(); inline std::shared_ptr Clone() const; void DisablePass(std::string_view passName); inline void DisablePass(std::size_t passIndex); void EnablePass(std::string_view passName, bool enable = true); inline void EnablePass(std::size_t passIndex, bool enable = true); void FillShaderBinding(std::vector& bindings) const; inline std::size_t FindTextureProperty(std::string_view propertyName) const; inline std::size_t FindValueProperty(std::string_view propertyName) const; inline const std::shared_ptr& GetParentMaterial() const; inline MaterialPassFlags GetPassFlags(std::size_t passIndex) const; const std::shared_ptr& GetPipeline(std::size_t passIndex) const; inline const std::shared_ptr* GetTextureProperty(std::string_view propertyName) const; inline const std::shared_ptr& GetTextureProperty(std::size_t textureIndex) const; inline const std::shared_ptr& GetTexturePropertyOverride(std::size_t textureIndex) const; inline const TextureSamplerInfo* GetTextureSamplerProperty(std::string_view propertyName) const; inline const TextureSamplerInfo& GetTextureSamplerProperty(std::size_t textureIndex) const; inline const MaterialSettings::Value* GetValueProperty(std::string_view propertyName) const; inline const MaterialSettings::Value& GetValueProperty(std::size_t valueIndex) const; inline const MaterialSettings::Value& GetValuePropertyOverride(std::size_t valueIndex) const; bool HasPass(std::string_view passName) const; inline bool HasPass(std::size_t passIndex) const; void OnTransfer(RenderFrame& renderFrame, CommandBufferBuilder& builder) override; inline void SetTextureProperty(std::string_view propertyName, std::shared_ptr texture); inline void SetTextureProperty(std::string_view propertyName, std::shared_ptr texture, const TextureSamplerInfo& samplerInfo); void SetTextureProperty(std::size_t textureIndex, std::shared_ptr texture); void SetTextureProperty(std::size_t textureIndex, std::shared_ptr texture, const TextureSamplerInfo& samplerInfo); inline void SetTextureSamplerProperty(std::string_view propertyName, const TextureSamplerInfo& samplerInfo); void SetTextureSamplerProperty(std::size_t textureIndex, const TextureSamplerInfo& samplerInfo); inline void SetValueProperty(std::string_view propertyName, const MaterialSettings::Value& value); void SetValueProperty(std::size_t valueIndex, const MaterialSettings::Value& value); void UpdateOptionValue(UInt32 optionHash, const nzsl::Ast::ConstantSingleValue& value); void UpdatePassFlags(std::string_view passName, MaterialPassFlags materialFlags); inline void UpdatePassFlags(std::size_t passName, MaterialPassFlags materialFlags); void UpdatePassStates(std::string_view passName, FunctionRef stateUpdater); template void UpdatePassStates(std::size_t passIndex, F&& stateUpdater); void UpdatePassesStates(std::initializer_list passesName, FunctionRef stateUpdater); template void UpdatePassesStates(std::initializer_list passesIndex, F&& stateUpdater); template void UpdatePassesStates(F&& stateUpdater, bool ignoreDisabled = true); void UpdateTextureBinding(std::size_t textureBinding, std::shared_ptr texture, std::shared_ptr textureSampler); void UpdateUniformBufferData(std::size_t uniformBufferIndex, std::size_t offset, std::size_t size, const void* data); MaterialInstance& operator=(const MaterialInstance&) = delete; MaterialInstance& operator=(MaterialInstance&&) = delete; static constexpr std::size_t InvalidPropertyIndex = MaterialSettings::InvalidPropertyIndex; static std::shared_ptr LoadFromFile(const std::filesystem::path& filePath, const MaterialInstanceParams& params = MaterialInstanceParams()); static std::shared_ptr LoadFromMemory(const void* data, std::size_t size, const MaterialInstanceParams& params = MaterialInstanceParams()); static std::shared_ptr LoadFromStream(Stream& stream, const MaterialInstanceParams& params = MaterialInstanceParams()); NazaraSignal(OnMaterialInstancePipelineInvalidated, const MaterialInstance* /*matInstance*/, std::size_t /*passIndex*/); NazaraSignal(OnMaterialInstanceShaderBindingInvalidated, const MaterialInstance* /*matInstance*/); private: inline void InvalidatePassPipeline(std::size_t passIndex); inline void InvalidateShaderBinding(); struct PassShader { std::shared_ptr shader; NazaraSlot(UberShader, OnShaderUpdated, onShaderUpdated); }; struct PassData { mutable MaterialPipelineInfo pipelineInfo; mutable std::shared_ptr pipeline; std::vector shaders; MaterialPassFlags flags; bool enabled = false; }; struct TextureBinding { std::shared_ptr texture; std::shared_ptr sampler; }; struct TextureProperty { std::shared_ptr texture; TextureSamplerInfo samplerInfo; }; struct UniformBuffer { std::size_t bufferIndex; std::vector values; RenderBufferView bufferView; bool dataInvalidated = true; }; std::shared_ptr m_parent; std::unordered_map m_optionValuesOverride; std::vector m_valueOverride; std::vector m_passes; std::vector m_textureBinding; std::vector m_textureOverride; std::vector m_uniformBuffers; const MaterialSettings& m_materialSettings; }; } #include #endif // NAZARA_GRAPHICS_MATERIALINSTANCE_HPP