// Copyright (C) 2024 Jérôme "SirLynix" 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 #include #include #include #include #include namespace Nz { bool TexturePropertyHandler::NeedsUpdateOnTextureUpdate(std::size_t updatedPropertyIndex) const { return m_propertyIndex == updatedPropertyIndex; } void TexturePropertyHandler::Setup(const Material& material, const ShaderReflection& reflection) { m_propertyIndex = MaterialSettings::InvalidPropertyIndex; const MaterialSettings& settings = material.GetSettings(); std::size_t propertyIndex = settings.FindTextureProperty(m_propertyName); if (propertyIndex == MaterialSettings::InvalidPropertyIndex) return; const auto& textureProperty = settings.GetTextureProperty(propertyIndex); m_textureIndex = material.FindTextureByTag(m_samplerTag); if (m_textureIndex == Material::InvalidIndex) return; const auto& textureData = material.GetTextureData(m_textureIndex); if (textureProperty.type != textureData.imageType) { // TODO: Use EnumToString to show image type as string NazaraErrorFmt("unmatching texture type: material property is of type {0} but shader sampler is of type {1}", UnderlyingCast(textureProperty.type), UnderlyingCast(textureData.imageType)); return; } m_propertyIndex = propertyIndex; m_optionHash = 0; if (!m_optionName.empty()) { if (const ShaderReflection::OptionData* optionData = reflection.GetOptionByName(m_optionName)) { if (IsPrimitiveType(optionData->type) && std::get(optionData->type) == nzsl::Ast::PrimitiveType::Boolean) { NazaraAssert(optionData->hash != 0, "unexpected option hash"); m_optionHash = optionData->hash; } else NazaraErrorFmt("option {0} is not a boolean option (got {1})", m_optionName, nzsl::Ast::ToString(optionData->type)); } else NazaraWarningFmt("option {0} not found in shader for property {1}", m_optionName, m_propertyName); } } void TexturePropertyHandler::Update(MaterialInstance& materialInstance) const { if (m_propertyIndex == MaterialSettings::InvalidPropertyIndex) return; const std::shared_ptr& texture = materialInstance.GetTextureProperty(m_propertyIndex); const std::shared_ptr& sampler = Graphics::Instance()->GetSamplerCache().Get(materialInstance.GetTextureSamplerProperty(m_propertyIndex)); materialInstance.UpdateTextureBinding(m_textureIndex, texture, sampler); if (m_optionHash != 0) materialInstance.UpdateOptionValue(m_optionHash, texture != nullptr); } }