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)
{
m_renderLayer = renderLayer;
OnElementInvalidated(this);
if (m_renderLayer != renderLayer)
{
m_renderLayer = renderLayer;
OnElementInvalidated(this);
}
}
inline void InstancedRenderable::UpdateAABB(Boxf aabb)

View File

@ -9,6 +9,7 @@
#include <Nazara/Prerequisites.hpp>
#include <Nazara/Graphics/Thirdparty/robin_hood/robin_hood.h>
#include <set>
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<int> m_renderLayers;
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 RenderPipeline*, std::size_t> m_pipelineRegistry;

View File

@ -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)

View File

@ -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)