Graphics/ForwardFramePipeline: Fix unregister + register the same renderable pointer not invalidating rendering
This can happen with ECS components which are mostly stable in memory, when destroying a graphics entity and recreating it (even with a different mesh) its pointer may not change due to memory recycling, especially on simple scenes. A UInt8 generation counter helps prevents this
This commit is contained in:
parent
f2f90e2ca3
commit
cff918f6a3
|
|
@ -108,6 +108,7 @@ namespace Nz
|
||||||
const InstancedRenderable* renderable;
|
const InstancedRenderable* renderable;
|
||||||
Recti scissorBox;
|
Recti scissorBox;
|
||||||
UInt32 renderMask = 0;
|
UInt32 renderMask = 0;
|
||||||
|
UInt8 generation;
|
||||||
|
|
||||||
NazaraSlot(InstancedRenderable, OnElementInvalidated, onElementInvalidated);
|
NazaraSlot(InstancedRenderable, OnElementInvalidated, onElementInvalidated);
|
||||||
NazaraSlot(InstancedRenderable, OnMaterialInvalidated, onMaterialInvalidated);
|
NazaraSlot(InstancedRenderable, OnMaterialInvalidated, onMaterialInvalidated);
|
||||||
|
|
@ -169,6 +170,7 @@ namespace Nz
|
||||||
MemoryPool<ViewerData> m_viewerPool;
|
MemoryPool<ViewerData> m_viewerPool;
|
||||||
MemoryPool<WorldInstanceData> m_worldInstances;
|
MemoryPool<WorldInstanceData> m_worldInstances;
|
||||||
RenderFrame* m_currentRenderFrame;
|
RenderFrame* m_currentRenderFrame;
|
||||||
|
UInt8 m_generationCounter;
|
||||||
bool m_rebuildFrameGraph;
|
bool m_rebuildFrameGraph;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,7 @@ namespace Nz
|
||||||
m_skeletonInstances(1024),
|
m_skeletonInstances(1024),
|
||||||
m_viewerPool(8),
|
m_viewerPool(8),
|
||||||
m_worldInstances(2048),
|
m_worldInstances(2048),
|
||||||
|
m_generationCounter(0),
|
||||||
m_rebuildFrameGraph(true)
|
m_rebuildFrameGraph(true)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
@ -76,7 +77,7 @@ namespace Nz
|
||||||
else
|
else
|
||||||
visibleRenderable.skeletonInstance = nullptr;
|
visibleRenderable.skeletonInstance = nullptr;
|
||||||
|
|
||||||
visibilityHash = CombineHash(visibilityHash, std::hash<const void*>()(&renderableData));
|
visibilityHash = CombineHash(visibilityHash, std::hash<const void*>()(&renderableData) + renderableData.generation);
|
||||||
}
|
}
|
||||||
|
|
||||||
return m_visibleRenderables;
|
return m_visibleRenderables;
|
||||||
|
|
@ -148,6 +149,7 @@ namespace Nz
|
||||||
{
|
{
|
||||||
std::size_t renderableIndex;
|
std::size_t renderableIndex;
|
||||||
RenderableData* renderableData = m_renderablePool.Allocate(renderableIndex);
|
RenderableData* renderableData = m_renderablePool.Allocate(renderableIndex);
|
||||||
|
renderableData->generation = m_generationCounter++;
|
||||||
renderableData->renderable = instancedRenderable;
|
renderableData->renderable = instancedRenderable;
|
||||||
renderableData->renderMask = renderMask;
|
renderableData->renderMask = renderMask;
|
||||||
renderableData->scissorBox = scissorBox;
|
renderableData->scissorBox = scissorBox;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue