From 65c4409f9c5746ce870d6993f37ba2b99a7fdb7b Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 7 Jun 2015 18:09:37 +0200 Subject: [PATCH] Graphics/DeferredRenderQueue: Replace listener by signals Former-commit-id: b874409b523a1bfd6d9dd0d74c0f28189411bcca --- .../Nazara/Graphics/DeferredRenderQueue.hpp | 23 +-- .../Nazara/Graphics/ForwardRenderQueue.hpp | 12 +- src/Nazara/Graphics/DeferredRenderQueue.cpp | 135 ++++-------------- 3 files changed, 42 insertions(+), 128 deletions(-) diff --git a/include/Nazara/Graphics/DeferredRenderQueue.hpp b/include/Nazara/Graphics/DeferredRenderQueue.hpp index f3714b9a5..1d37c1162 100644 --- a/include/Nazara/Graphics/DeferredRenderQueue.hpp +++ b/include/Nazara/Graphics/DeferredRenderQueue.hpp @@ -22,7 +22,7 @@ class NzForwardRenderQueue; -class NAZARA_API NzDeferredRenderQueue : public NzAbstractRenderQueue, NzObjectListener +class NAZARA_API NzDeferredRenderQueue : public NzAbstractRenderQueue { public: NzDeferredRenderQueue(NzForwardRenderQueue* forwardQueue); @@ -50,15 +50,10 @@ class NAZARA_API NzDeferredRenderQueue : public NzAbstractRenderQueue, NzObjectL struct MeshInstanceEntry { - MeshInstanceEntry(NzObjectListener* listener, int indexBufferValue, int vertexBufferValue) : - indexBufferListener(listener, indexBufferValue), - vertexBufferListener(listener, vertexBufferValue) - { - } + NazaraSlot(NzIndexBuffer, OnIndexBufferRelease, indexBufferReleaseSlot); + NazaraSlot(NzVertexBuffer, OnVertexBufferRelease, vertexBufferReleaseSlot); std::vector instances; - NzIndexBufferConstListener indexBufferListener; - NzVertexBufferConstListener vertexBufferListener; }; typedef std::map MeshInstanceContainer; @@ -70,12 +65,8 @@ class NAZARA_API NzDeferredRenderQueue : public NzAbstractRenderQueue, NzObjectL struct BatchedModelEntry { - BatchedModelEntry(NzObjectListener* listener, int materialValue) : - materialListener(listener, materialValue) - { - } + NazaraSlot(NzMaterial, OnMaterialRelease, materialReleaseSlot); - NzMaterialConstListener materialListener; MeshInstanceContainer meshMap; bool enabled = false; bool instancingEnabled = false; @@ -86,9 +77,9 @@ class NAZARA_API NzDeferredRenderQueue : public NzAbstractRenderQueue, NzObjectL ModelBatches opaqueModels; NzForwardRenderQueue* m_forwardQueue; - private: - bool OnObjectDestroy(const NzRefCounted* object, int index) override; - void OnObjectReleased(const NzRefCounted* object, int index) override; + void OnIndexBufferInvalidation(const NzIndexBuffer* indexBuffer); + void OnMaterialInvalidation(const NzMaterial* material); + void OnVertexBufferInvalidation(const NzVertexBuffer* vertexBuffer); }; #endif // NAZARA_DEFERREDRENDERQUEUE_HPP diff --git a/include/Nazara/Graphics/ForwardRenderQueue.hpp b/include/Nazara/Graphics/ForwardRenderQueue.hpp index 6f9ce0487..ba214ee34 100644 --- a/include/Nazara/Graphics/ForwardRenderQueue.hpp +++ b/include/Nazara/Graphics/ForwardRenderQueue.hpp @@ -47,12 +47,6 @@ class NAZARA_API NzForwardRenderQueue : public NzAbstractRenderQueue void Sort(const NzAbstractViewer* viewer); - private: - void OnIndexBufferInvalidation(const NzIndexBuffer* indexBuffer); - void OnMaterialInvalidation(const NzMaterial* material); - void OnTextureInvalidation(const NzTexture* texture); - void OnVertexBufferInvalidation(const NzVertexBuffer* vertexBuffer); - /// Billboards struct BillboardData { @@ -156,6 +150,12 @@ class NAZARA_API NzForwardRenderQueue : public NzAbstractRenderQueue TransparentModelContainer transparentModels; std::vector transparentModelData; std::vector otherDrawables; + + private: + void OnIndexBufferInvalidation(const NzIndexBuffer* indexBuffer); + void OnMaterialInvalidation(const NzMaterial* material); + void OnTextureInvalidation(const NzTexture* texture); + void OnVertexBufferInvalidation(const NzVertexBuffer* vertexBuffer); }; #endif // NAZARA_FORWARDRENDERQUEUE_HPP diff --git a/src/Nazara/Graphics/DeferredRenderQueue.cpp b/src/Nazara/Graphics/DeferredRenderQueue.cpp index ceccdff52..319b66aad 100644 --- a/src/Nazara/Graphics/DeferredRenderQueue.cpp +++ b/src/Nazara/Graphics/DeferredRenderQueue.cpp @@ -10,16 +10,6 @@ ///TODO: Rendre les billboards via Deferred Shading si possible -namespace -{ - enum ObjectType - { - ObjectType_IndexBuffer, - ObjectType_Material, - ObjectType_VertexBuffer - }; -} - NzDeferredRenderQueue::NzDeferredRenderQueue(NzForwardRenderQueue* forwardQueue) : m_forwardQueue(forwardQueue) { @@ -85,8 +75,8 @@ void NzDeferredRenderQueue::AddMesh(const NzMaterial* material, const NzMeshData auto it = opaqueModels.find(material); if (it == opaqueModels.end()) { - BatchedModelEntry entry(this, ObjectType_Material); - entry.materialListener = material; + BatchedModelEntry entry; + entry.materialReleaseSlot.Connect(material->OnMaterialRelease, this, OnMaterialInvalidation); it = opaqueModels.insert(std::make_pair(material, std::move(entry))).first; } @@ -99,9 +89,11 @@ void NzDeferredRenderQueue::AddMesh(const NzMaterial* material, const NzMeshData auto it2 = meshMap.find(meshData); if (it2 == meshMap.end()) { - MeshInstanceEntry instanceEntry(this, ObjectType_IndexBuffer, ObjectType_VertexBuffer); - instanceEntry.indexBufferListener = meshData.indexBuffer; - instanceEntry.vertexBufferListener = meshData.vertexBuffer; + MeshInstanceEntry instanceEntry; + if (meshData.indexBuffer) + instanceEntry.indexBufferReleaseSlot.Connect(meshData.indexBuffer->OnIndexBufferRelease, this, OnIndexBufferInvalidation); + + instanceEntry.vertexBufferReleaseSlot.Connect(meshData.vertexBuffer->OnVertexBufferRelease, this, OnVertexBufferInvalidation); it2 = meshMap.insert(std::make_pair(meshData, std::move(instanceEntry))).first; } @@ -131,108 +123,39 @@ void NzDeferredRenderQueue::Clear(bool fully) m_forwardQueue->Clear(fully); } -bool NzDeferredRenderQueue::OnObjectDestroy(const NzRefCounted* object, int index) +void NzDeferredRenderQueue::OnIndexBufferInvalidation(const NzIndexBuffer* indexBuffer) { - switch (index) + for (auto& modelPair : opaqueModels) { - case ObjectType_IndexBuffer: + MeshInstanceContainer& meshes = modelPair.second.meshMap; + for (auto it = meshes.begin(); it != meshes.end();) { - for (auto& modelPair : opaqueModels) - { - MeshInstanceContainer& meshes = modelPair.second.meshMap; - for (auto it = meshes.begin(); it != meshes.end();) - { - const NzMeshData& renderData = it->first; - if (renderData.indexBuffer == object) - it = meshes.erase(it); - else - ++it; - } - } - break; - } - - case ObjectType_Material: - { - const NzMaterial* material = static_cast(object); - - opaqueModels.erase(material); - break; - } - - case ObjectType_VertexBuffer: - { - for (auto& modelPair : opaqueModels) - { - MeshInstanceContainer& meshes = modelPair.second.meshMap; - for (auto it = meshes.begin(); it != meshes.end();) - { - const NzMeshData& renderData = it->first; - if (renderData.vertexBuffer == object) - it = meshes.erase(it); - else - ++it; - } - } - break; + const NzMeshData& renderData = it->first; + if (renderData.indexBuffer == indexBuffer) + it = meshes.erase(it); + else + ++it; } } - - return false; // Nous ne voulons plus recevoir d'évènement de cette ressource } -void NzDeferredRenderQueue::OnObjectReleased(const NzRefCounted* object, int index) +void NzDeferredRenderQueue::OnMaterialInvalidation(const NzMaterial* material) { - // La ressource vient d'être libérée, nous ne pouvons donc plus utiliser la méthode traditionnelle de recherche - // des pointeurs stockés (À cause de la fonction de triage utilisant des spécificités des ressources) + opaqueModels.erase(material); +} - switch (index) +void NzDeferredRenderQueue::OnVertexBufferInvalidation(const NzVertexBuffer* vertexBuffer) +{ + for (auto& modelPair : opaqueModels) { - case ObjectType_IndexBuffer: + MeshInstanceContainer& meshes = modelPair.second.meshMap; + for (auto it = meshes.begin(); it != meshes.end();) { - for (auto& modelPair : opaqueModels) - { - MeshInstanceContainer& meshes = modelPair.second.meshMap; - for (auto it = meshes.begin(); it != meshes.end();) - { - const NzMeshData& renderData = it->first; - if (renderData.indexBuffer == object) - it = meshes.erase(it); - else - ++it; - } - } - break; - } - - case ObjectType_Material: - { - for (auto it = opaqueModels.begin(); it != opaqueModels.end(); ++it) - { - if (it->first == object) - { - opaqueModels.erase(it); - break; - } - } - break; - } - - case ObjectType_VertexBuffer: - { - for (auto& modelPair : opaqueModels) - { - MeshInstanceContainer& meshes = modelPair.second.meshMap; - for (auto it = meshes.begin(); it != meshes.end();) - { - const NzMeshData& renderData = it->first; - if (renderData.vertexBuffer == object) - it = meshes.erase(it); - else - ++it; - } - } - break; + const NzMeshData& renderData = it->first; + if (renderData.vertexBuffer == vertexBuffer) + it = meshes.erase(it); + else + ++it; } } }