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)
|
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)
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue