diff --git a/include/Nazara/Graphics/MaterialInstance.hpp b/include/Nazara/Graphics/MaterialInstance.hpp index 18260a562..033f038c4 100644 --- a/include/Nazara/Graphics/MaterialInstance.hpp +++ b/include/Nazara/Graphics/MaterialInstance.hpp @@ -96,10 +96,17 @@ namespace Nz 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); diff --git a/include/Nazara/Graphics/MaterialInstance.inl b/include/Nazara/Graphics/MaterialInstance.inl index d027991db..382fc176b 100644 --- a/include/Nazara/Graphics/MaterialInstance.inl +++ b/include/Nazara/Graphics/MaterialInstance.inl @@ -200,6 +200,25 @@ namespace Nz InvalidatePassPipeline(passIndex); } + template + void MaterialInstance::UpdatePassesStates(std::initializer_list passesIndex, F&& stateUpdater) + { + for (std::size_t passIndex : passesIndex) + UpdatePassStates(passIndex, stateUpdater); + } + + template + void MaterialInstance::UpdatePassesStates(F&& stateUpdater, bool ignoreDisabled) + { + for (std::size_t i = 0; i < m_passes.size(); ++i) + { + if (ignoreDisabled && !m_passes[i].enabled) + continue; + + UpdatePassStates(i, stateUpdater); + } + } + inline void MaterialInstance::InvalidatePassPipeline(std::size_t passIndex) { assert(passIndex < m_passes.size()); diff --git a/src/Nazara/Graphics/MaterialInstance.cpp b/src/Nazara/Graphics/MaterialInstance.cpp index 943595f3b..20d449231 100644 --- a/src/Nazara/Graphics/MaterialInstance.cpp +++ b/src/Nazara/Graphics/MaterialInstance.cpp @@ -253,6 +253,13 @@ namespace Nz return UpdatePassStates(passIndex, stateUpdater); } + void MaterialInstance::UpdatePassesStates(std::initializer_list passesName, FunctionRef stateUpdater) + { + auto& materialPassRegistry = Graphics::Instance()->GetMaterialPassRegistry(); + for (std::string_view passName : passesName) + UpdatePassStates(materialPassRegistry.GetPassIndex(passName), stateUpdater); + } + void MaterialInstance::SetTextureProperty(std::size_t textureIndex, std::shared_ptr texture) { assert(textureIndex < m_textureOverride.size());