diff --git a/include/Nazara/Graphics/InstancedRenderable.inl b/include/Nazara/Graphics/InstancedRenderable.inl index e1760966b..410451aac 100644 --- a/include/Nazara/Graphics/InstancedRenderable.inl +++ b/include/Nazara/Graphics/InstancedRenderable.inl @@ -25,8 +25,11 @@ namespace Nz inline void InstancedRenderable::UpdateRenderLayer(int renderLayer) { - m_renderLayer = renderLayer; - OnElementInvalidated(this); + if (m_renderLayer != renderLayer) + { + m_renderLayer = renderLayer; + OnElementInvalidated(this); + } } inline void InstancedRenderable::UpdateAABB(Boxf aabb) diff --git a/include/Nazara/Graphics/RenderQueueRegistry.hpp b/include/Nazara/Graphics/RenderQueueRegistry.hpp index 7c383e10f..fb4d048ec 100644 --- a/include/Nazara/Graphics/RenderQueueRegistry.hpp +++ b/include/Nazara/Graphics/RenderQueueRegistry.hpp @@ -9,6 +9,7 @@ #include #include +#include namespace Nz { @@ -31,6 +32,8 @@ namespace Nz inline std::size_t FetchVertexBuffer(const AbstractBuffer* vertexBuffer) const; inline std::size_t FetchVertexDeclaration(const VertexDeclaration* vertexDeclaration) const; + inline void Finalize(); + inline void RegisterLayer(int renderLayer); inline void RegisterMaterialPass(const MaterialPass* materialPass); inline void RegisterPipeline(const RenderPipeline* pipeline); @@ -38,6 +41,7 @@ namespace Nz inline void RegisterVertexDeclaration(const VertexDeclaration* vertexDeclaration); private: + std::set m_renderLayers; robin_hood::unordered_map m_renderLayerRegistry; robin_hood::unordered_map m_materialPassRegistry; robin_hood::unordered_map m_pipelineRegistry; diff --git a/include/Nazara/Graphics/RenderQueueRegistry.inl b/include/Nazara/Graphics/RenderQueueRegistry.inl index fde43e418..885149482 100644 --- a/include/Nazara/Graphics/RenderQueueRegistry.inl +++ b/include/Nazara/Graphics/RenderQueueRegistry.inl @@ -10,8 +10,12 @@ namespace Nz { inline void RenderQueueRegistry::Clear() { + m_materialPassRegistry.clear(); + m_renderLayers.clear(); m_renderLayerRegistry.clear(); m_pipelineRegistry.clear(); + m_vertexBufferRegistry.clear(); + m_vertexDeclarationRegistry.clear(); } inline std::size_t RenderQueueRegistry::FetchLayerIndex(int renderLayer) const @@ -54,9 +58,16 @@ namespace Nz return it->second; } + inline void RenderQueueRegistry::Finalize() + { + for (int renderLayer : m_renderLayers) + m_renderLayerRegistry.emplace(renderLayer, m_renderLayerRegistry.size()); + } + inline void RenderQueueRegistry::RegisterLayer(int renderLayer) { - m_renderLayerRegistry.try_emplace(renderLayer, m_renderLayerRegistry.size()); + assert(m_renderLayerRegistry.empty()); + m_renderLayers.insert(renderLayer); } inline void RenderQueueRegistry::RegisterMaterialPass(const MaterialPass* materialPass) diff --git a/src/Nazara/Graphics/ForwardFramePipeline.cpp b/src/Nazara/Graphics/ForwardFramePipeline.cpp index 9eb31f203..57894c153 100644 --- a/src/Nazara/Graphics/ForwardFramePipeline.cpp +++ b/src/Nazara/Graphics/ForwardFramePipeline.cpp @@ -260,6 +260,8 @@ namespace Nz renderElement->Register(viewerData.depthPrepassRegistry); viewerData.depthPrepassRenderQueue.Insert(renderElement.get()); } + + viewerData.depthPrepassRegistry.Finalize(); } viewerData.depthPrepassRenderQueue.Sort([&](const RenderElement* element) @@ -282,6 +284,8 @@ namespace Nz renderElement->Register(viewerData.forwardRegistry); viewerData.forwardRenderQueue.Insert(renderElement.get()); } + + viewerData.forwardRegistry.Finalize(); } viewerData.forwardRenderQueue.Sort([&](const RenderElement* element)