Graphics: Fix render layer sorting
This commit is contained in:
parent
8f897084d7
commit
a483e16e15
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in New Issue