Graphics: Fix render layer sorting

This commit is contained in:
Jérôme Leclercq 2021-12-01 20:25:55 +01:00
parent 8f897084d7
commit a483e16e15
4 changed files with 25 additions and 3 deletions

View File

@ -25,8 +25,11 @@ namespace Nz
inline void InstancedRenderable::UpdateRenderLayer(int renderLayer) inline void InstancedRenderable::UpdateRenderLayer(int renderLayer)
{ {
m_renderLayer = renderLayer; if (m_renderLayer != renderLayer)
OnElementInvalidated(this); {
m_renderLayer = renderLayer;
OnElementInvalidated(this);
}
} }
inline void InstancedRenderable::UpdateAABB(Boxf aabb) inline void InstancedRenderable::UpdateAABB(Boxf aabb)

View File

@ -9,6 +9,7 @@
#include <Nazara/Prerequisites.hpp> #include <Nazara/Prerequisites.hpp>
#include <Nazara/Graphics/Thirdparty/robin_hood/robin_hood.h> #include <Nazara/Graphics/Thirdparty/robin_hood/robin_hood.h>
#include <set>
namespace Nz namespace Nz
{ {
@ -31,6 +32,8 @@ namespace Nz
inline std::size_t FetchVertexBuffer(const AbstractBuffer* vertexBuffer) const; inline std::size_t FetchVertexBuffer(const AbstractBuffer* vertexBuffer) const;
inline std::size_t FetchVertexDeclaration(const VertexDeclaration* vertexDeclaration) const; inline std::size_t FetchVertexDeclaration(const VertexDeclaration* vertexDeclaration) const;
inline void Finalize();
inline void RegisterLayer(int renderLayer); inline void RegisterLayer(int renderLayer);
inline void RegisterMaterialPass(const MaterialPass* materialPass); inline void RegisterMaterialPass(const MaterialPass* materialPass);
inline void RegisterPipeline(const RenderPipeline* pipeline); inline void RegisterPipeline(const RenderPipeline* pipeline);
@ -38,6 +41,7 @@ namespace Nz
inline void RegisterVertexDeclaration(const VertexDeclaration* vertexDeclaration); inline void RegisterVertexDeclaration(const VertexDeclaration* vertexDeclaration);
private: private:
std::set<int> m_renderLayers;
robin_hood::unordered_map<int, std::size_t> m_renderLayerRegistry; robin_hood::unordered_map<int, std::size_t> m_renderLayerRegistry;
robin_hood::unordered_map<const MaterialPass*, std::size_t> m_materialPassRegistry; robin_hood::unordered_map<const MaterialPass*, std::size_t> m_materialPassRegistry;
robin_hood::unordered_map<const RenderPipeline*, std::size_t> m_pipelineRegistry; robin_hood::unordered_map<const RenderPipeline*, std::size_t> m_pipelineRegistry;

View File

@ -10,8 +10,12 @@ namespace Nz
{ {
inline void RenderQueueRegistry::Clear() inline void RenderQueueRegistry::Clear()
{ {
m_materialPassRegistry.clear();
m_renderLayers.clear();
m_renderLayerRegistry.clear(); m_renderLayerRegistry.clear();
m_pipelineRegistry.clear(); m_pipelineRegistry.clear();
m_vertexBufferRegistry.clear();
m_vertexDeclarationRegistry.clear();
} }
inline std::size_t RenderQueueRegistry::FetchLayerIndex(int renderLayer) const inline std::size_t RenderQueueRegistry::FetchLayerIndex(int renderLayer) const
@ -54,9 +58,16 @@ namespace Nz
return it->second; 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) 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) inline void RenderQueueRegistry::RegisterMaterialPass(const MaterialPass* materialPass)

View File

@ -260,6 +260,8 @@ namespace Nz
renderElement->Register(viewerData.depthPrepassRegistry); renderElement->Register(viewerData.depthPrepassRegistry);
viewerData.depthPrepassRenderQueue.Insert(renderElement.get()); viewerData.depthPrepassRenderQueue.Insert(renderElement.get());
} }
viewerData.depthPrepassRegistry.Finalize();
} }
viewerData.depthPrepassRenderQueue.Sort([&](const RenderElement* element) viewerData.depthPrepassRenderQueue.Sort([&](const RenderElement* element)
@ -282,6 +284,8 @@ namespace Nz
renderElement->Register(viewerData.forwardRegistry); renderElement->Register(viewerData.forwardRegistry);
viewerData.forwardRenderQueue.Insert(renderElement.get()); viewerData.forwardRenderQueue.Insert(renderElement.get());
} }
viewerData.forwardRegistry.Finalize();
} }
viewerData.forwardRenderQueue.Sort([&](const RenderElement* element) viewerData.forwardRenderQueue.Sort([&](const RenderElement* element)