From 18cc3b16dfbcb8e9c3b6a8bf4b7c168fa873a98e Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 9 Jul 2013 01:13:14 +0200 Subject: [PATCH] Fixed leaks Former-commit-id: 61b219e69fb048eef08ce03dca3a9cb2741760b4 --- .../Nazara/Graphics/ForwardRenderQueue.hpp | 23 +++---- src/Nazara/Graphics/ForwardRenderQueue.cpp | 64 +++++++++++++++++-- 2 files changed, 65 insertions(+), 22 deletions(-) diff --git a/include/Nazara/Graphics/ForwardRenderQueue.hpp b/include/Nazara/Graphics/ForwardRenderQueue.hpp index ca9578117..6a945658a 100644 --- a/include/Nazara/Graphics/ForwardRenderQueue.hpp +++ b/include/Nazara/Graphics/ForwardRenderQueue.hpp @@ -26,7 +26,7 @@ class NAZARA_API NzForwardRenderQueue : public NzAbstractRenderQueue, NzResource public: NzForwardRenderQueue() = default; - ~NzForwardRenderQueue() = default; + ~NzForwardRenderQueue(); void AddDrawable(const NzDrawable* drawable); void AddLight(const NzLight* light); @@ -39,14 +39,6 @@ class NAZARA_API NzForwardRenderQueue : public NzAbstractRenderQueue, NzResource private: void OnResourceDestroy(const NzResource* resource, int index); - struct BillboardData - { - NzColor color; - NzVector3f position; - NzVector2f size; - float rotation; - }; - struct MaterialComparator { bool operator()(const NzMaterial* mat1, const NzMaterial* mat2); @@ -85,17 +77,18 @@ class NAZARA_API NzForwardRenderQueue : public NzAbstractRenderQueue, NzResource NzStaticMesh* mesh; }; - typedef std::map, SkeletalMeshComparator> SkeletalMeshContainer; - typedef std::map, StaticMeshComparator> StaticMeshContainer; + typedef std::map, SkeletalMeshComparator> SkeletalMeshContainer; + typedef std::map, StaticMeshComparator> StaticMeshContainer; + typedef std::map, MaterialComparator> MeshContainer; - std::map, MaterialComparator> billboards; - std::map, MaterialComparator> visibleModels; - std::vector> visibleTransparentsModels; + std::map, MaterialComparator> billboards; + MeshContainer opaqueModels; + std::vector> transparentsModels; std::vector transparentSkeletalModels; std::vector transparentStaticModels; std::vector otherDrawables; std::vector directionnalLights; - std::vector visibleLights; + std::vector lights; }; #endif // NAZARA_FORWARDRENDERQUEUE_HPP diff --git a/src/Nazara/Graphics/ForwardRenderQueue.cpp b/src/Nazara/Graphics/ForwardRenderQueue.cpp index 0c325226f..57cf714d3 100644 --- a/src/Nazara/Graphics/ForwardRenderQueue.cpp +++ b/src/Nazara/Graphics/ForwardRenderQueue.cpp @@ -11,6 +11,21 @@ #include #include +namespace +{ + enum ResourceType + { + ResourceType_Material, + ResourceType_SkeletalMesh, + ResourceType_StaticMesh + }; +} + +NzForwardRenderQueue::~NzForwardRenderQueue() +{ + Clear(true); +} + void NzForwardRenderQueue::AddDrawable(const NzDrawable* drawable) { #if NAZARA_GRAPHICS_SAFE @@ -42,7 +57,7 @@ void NzForwardRenderQueue::AddLight(const NzLight* light) case nzLightType_Point: case nzLightType_Spot: - visibleLights.push_back(light); + lights.push_back(light); break; #ifdef NAZARA_DEBUG @@ -113,10 +128,22 @@ void NzForwardRenderQueue::AddModel(const NzModel* model) data.mesh = staticMesh; data.transformMatrix = transformMatrix; - visibleTransparentsModels.push_back(std::make_pair(index, true)); + transparentsModels.push_back(std::make_pair(index, true)); } else - visibleModels[material].second[staticMesh].push_back(transformMatrix); + { + auto pair = opaqueModels.insert(std::make_pair(material, MeshContainer::mapped_type())); + if (pair.second) + material->AddResourceListener(this, ResourceType_Material); + + auto& meshMap = pair.first->second.second; + + auto pair2 = meshMap.insert(std::make_pair(staticMesh, StaticMeshContainer::mapped_type())); + if (pair2.second) + staticMesh->AddResourceListener(this, ResourceType_StaticMesh); + + pair2.first->second.push_back(transformMatrix); + } break; } @@ -127,14 +154,14 @@ void NzForwardRenderQueue::AddModel(const NzModel* model) void NzForwardRenderQueue::Clear(bool fully) { directionnalLights.clear(); + lights.clear(); otherDrawables.clear(); - visibleLights.clear(); - visibleTransparentsModels.clear(); + transparentsModels.clear(); transparentSkeletalModels.clear(); transparentStaticModels.clear(); if (fully) - visibleModels.clear(); + opaqueModels.clear(); } void NzForwardRenderQueue::Sort(const NzCamera& camera) @@ -163,12 +190,35 @@ void NzForwardRenderQueue::Sort(const NzCamera& camera) }; TransparentModelComparator comparator {this, camera.GetFrustum().GetPlane(nzFrustumPlane_Near), camera.GetForward()}; - std::sort(visibleTransparentsModels.begin(), visibleTransparentsModels.end(), comparator); + std::sort(transparentsModels.begin(), transparentsModels.end(), comparator); } void NzForwardRenderQueue::OnResourceDestroy(const NzResource* resource, int index) { + switch (index) + { + case ResourceType_Material: + opaqueModels.erase(static_cast(resource)); + break; + case ResourceType_SkeletalMesh: + { + for (auto& pair : opaqueModels) + pair.second.first.erase(static_cast(resource)); + + break; + } + + case ResourceType_StaticMesh: + { + for (auto& pair : opaqueModels) + pair.second.second.erase(static_cast(resource)); + + break; + } + } + + resource->RemoveResourceListener(this); } bool NzForwardRenderQueue::SkeletalMeshComparator::operator()(const NzSkeletalMesh* subMesh1, const NzSkeletalMesh* subMesh2)