From f7cd52d94721104acc612f5cbd256c852d5abd2e Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 17 Apr 2017 17:39:26 +0200 Subject: [PATCH] Small update --- .../NDK/Components/GraphicsComponent.hpp | 4 ++- .../NDK/Components/GraphicsComponent.inl | 2 +- SDK/src/NDK/Components/GraphicsComponent.cpp | 31 ++++++++++++++++--- include/Nazara/Graphics/Material.hpp | 3 +- include/Nazara/Graphics/Material.inl | 2 +- 5 files changed, 33 insertions(+), 9 deletions(-) diff --git a/SDK/include/NDK/Components/GraphicsComponent.hpp b/SDK/include/NDK/Components/GraphicsComponent.hpp index f7cc20c5c..a69456e25 100644 --- a/SDK/include/NDK/Components/GraphicsComponent.hpp +++ b/SDK/include/NDK/Components/GraphicsComponent.hpp @@ -65,6 +65,7 @@ namespace Ndk void InvalidateRenderableData(const Nz::InstancedRenderable* renderable, Nz::UInt32 flags, std::size_t index); void InvalidateRenderableMaterial(const Nz::InstancedRenderable* renderable, std::size_t skinIndex, std::size_t matIndex, const Nz::MaterialRef& newMat); inline void InvalidateRenderables(); + void InvalidateReflectionMap(); inline void InvalidateTransformMatrix(); void RegisterMaterial(Nz::Material* material, std::size_t count = 1); @@ -140,9 +141,10 @@ namespace Ndk std::unordered_map m_materialEntries; mutable Nz::BoundingVolumef m_boundingVolume; mutable Nz::Matrix4f m_transformMatrix; + Nz::TextureRef m_reflectionMap; mutable bool m_boundingVolumeUpdated; - bool m_shouldRenderReflectionMap; mutable bool m_transformMatrixUpdated; + unsigned int m_reflectionMapSize; }; } diff --git a/SDK/include/NDK/Components/GraphicsComponent.inl b/SDK/include/NDK/Components/GraphicsComponent.inl index f6bc01f2e..b580cb73f 100644 --- a/SDK/include/NDK/Components/GraphicsComponent.inl +++ b/SDK/include/NDK/Components/GraphicsComponent.inl @@ -93,7 +93,7 @@ namespace Ndk */ inline bool GraphicsComponent::DoesRequireRealTimeReflections() const { - return m_reflectiveMaterialCount != 0; + return m_reflectiveMaterialCount != 0 && m_reflectionMap; } /*! diff --git a/SDK/src/NDK/Components/GraphicsComponent.cpp b/SDK/src/NDK/Components/GraphicsComponent.cpp index aaab86b43..73f6ca7f4 100644 --- a/SDK/src/NDK/Components/GraphicsComponent.cpp +++ b/SDK/src/NDK/Components/GraphicsComponent.cpp @@ -88,6 +88,7 @@ namespace Ndk void GraphicsComponent::InvalidateRenderableMaterial(const Nz::InstancedRenderable* renderable, std::size_t skinIndex, std::size_t matIndex, const Nz::MaterialRef& newMat) { + // Don't listen to dormant materials if (renderable->GetSkin() != skinIndex) return; @@ -97,19 +98,39 @@ namespace Ndk UnregisterMaterial(oldMat); } + void Ndk::GraphicsComponent::InvalidateReflectionMap() + { + m_entity->Invalidate(); + + if (m_reflectiveMaterialCount > 0) + { + if (!m_reflectionMap) + { + m_reflectionMap = Nz::Texture::New(); + if (!m_reflectionMap->Create(Nz::ImageType_Cubemap, Nz::PixelFormatType_RGB8, m_reflectionMapSize, m_reflectionMapSize)) + { + NazaraWarning("Failed to create reflection map, reflections will be disabled for this entity"); + return; + } + } + } + else + m_reflectionMap.Reset(); + } + void GraphicsComponent::RegisterMaterial(Nz::Material* material, std::size_t count) { auto it = m_materialEntries.find(material); if (it == m_materialEntries.end()) { MaterialEntry matEntry; - matEntry.reflectionModelChangeSlot.Connect(material->OnMaterialReflectionChange, this, &GraphicsComponent::OnMaterialReflectionChange); + matEntry.reflectionModelChangeSlot.Connect(material->OnMaterialReflectionModeChange, this, &GraphicsComponent::OnMaterialReflectionChange); matEntry.renderableCounter = count; if (material->GetReflectionMode() == Nz::ReflectionMode_RealTime) { if (m_reflectiveMaterialCount++ == 0) - m_entity->Invalidate(); + InvalidateReflectionMap(); } m_materialEntries.emplace(material, std::move(matEntry)); @@ -199,12 +220,12 @@ namespace Ndk if (material->GetReflectionMode() == Nz::ReflectionMode_RealTime) { if (--m_reflectiveMaterialCount == 0) - m_entity->Invalidate(); + InvalidateReflectionMap(); } else if (reflectionMode == Nz::ReflectionMode_RealTime) { if (m_reflectiveMaterialCount++ == 0) - m_entity->Invalidate(); + InvalidateReflectionMap(); } } @@ -231,7 +252,7 @@ namespace Ndk if (material->GetReflectionMode() == Nz::ReflectionMode_RealTime) { if (--m_reflectiveMaterialCount == 0) - m_entity->Invalidate(); + InvalidateReflectionMap(); } m_materialEntries.erase(it); diff --git a/include/Nazara/Graphics/Material.hpp b/include/Nazara/Graphics/Material.hpp index 13a9476ea..3d32a7014 100644 --- a/include/Nazara/Graphics/Material.hpp +++ b/include/Nazara/Graphics/Material.hpp @@ -182,7 +182,7 @@ namespace Nz template static MaterialRef New(Args&&... args); // Signals: - NazaraSignal(OnMaterialReflectionChange, const Material* /*material*/, ReflectionMode /*newReflectionMode*/); + NazaraSignal(OnMaterialReflectionModeChange, const Material* /*material*/, ReflectionMode /*newReflectionMode*/); NazaraSignal(OnMaterialRelease, const Material* /*material*/); NazaraSignal(OnMaterialReset, const Material* /*material*/); @@ -213,6 +213,7 @@ namespace Nz bool m_shadowCastingEnabled; float m_alphaThreshold; float m_shininess; + unsigned int m_reflectionSize; static std::array s_textureUnits; static MaterialLibrary::LibraryMap s_library; diff --git a/include/Nazara/Graphics/Material.inl b/include/Nazara/Graphics/Material.inl index b19a1bc19..00e5be457 100644 --- a/include/Nazara/Graphics/Material.inl +++ b/include/Nazara/Graphics/Material.inl @@ -1277,7 +1277,7 @@ namespace Nz { if (m_reflectionMode != reflectionMode) { - OnMaterialReflectionChange(this, reflectionMode); + OnMaterialReflectionModeChange(this, reflectionMode); m_reflectionMode = reflectionMode; }