From 5b730f1d4c398b5d33fcb8daf5d3a04728440302 Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 9 Jul 2013 01:06:11 +0200 Subject: [PATCH] ResourceListener no longer add a resource reference Former-commit-id: b249d472b4140b85e4e286552323fde6b9b66bd7 --- include/Nazara/Core/Resource.hpp | 2 +- include/Nazara/Utility/StaticMesh.hpp | 4 ++-- src/Nazara/Core/Resource.cpp | 11 +---------- src/Nazara/Utility/Mesh.cpp | 17 ++++++++++++++--- 4 files changed, 18 insertions(+), 16 deletions(-) diff --git a/include/Nazara/Core/Resource.hpp b/include/Nazara/Core/Resource.hpp index efc972d7b..1c7210bcf 100644 --- a/include/Nazara/Core/Resource.hpp +++ b/include/Nazara/Core/Resource.hpp @@ -49,7 +49,7 @@ class NAZARA_API NzResource bool IsPersistent() const; - bool RemoveResourceListener(NzResourceListener* listener) const; + void RemoveResourceListener(NzResourceListener* listener) const; bool RemoveResourceReference() const; bool SetPersistent(bool persistent = true, bool checkReferenceCount = false); diff --git a/include/Nazara/Utility/StaticMesh.hpp b/include/Nazara/Utility/StaticMesh.hpp index dbc9c1dc4..f952aac10 100644 --- a/include/Nazara/Utility/StaticMesh.hpp +++ b/include/Nazara/Utility/StaticMesh.hpp @@ -44,8 +44,8 @@ class NAZARA_API NzStaticMesh final : public NzSubMesh, NzResourceListener void OnResourceReleased(const NzResource* resource, int index) override; NzBoxf m_aabb; - const NzIndexBuffer* m_indexBuffer = nullptr; - NzVertexBuffer* m_vertexBuffer = nullptr; + NzIndexBufferConstRef m_indexBuffer = nullptr; + NzVertexBufferRef m_vertexBuffer = nullptr; }; #endif // NAZARA_STATICMESH_HPP diff --git a/src/Nazara/Core/Resource.cpp b/src/Nazara/Core/Resource.cpp index c3c744966..16ef80d6c 100644 --- a/src/Nazara/Core/Resource.cpp +++ b/src/Nazara/Core/Resource.cpp @@ -33,12 +33,7 @@ void NzResource::AddResourceListener(NzResourceListener* listener, int index) co NazaraLock(m_mutex) if (m_resourceListeners.insert(NzResourceEntry(listener, index)).second) - { m_resourceListenerUpdated = false; - - // AddResourceReference() - m_resourceReferenceCount++; - } } void NzResource::AddResourceReference() const @@ -56,16 +51,12 @@ bool NzResource::IsPersistent() const return m_resourcePersistent; } -bool NzResource::RemoveResourceListener(NzResourceListener* listener) const +void NzResource::RemoveResourceListener(NzResourceListener* listener) const { NazaraMutexLock(m_mutex); if (m_resourceListeners.erase(listener) != 0) m_resourceListenerUpdated = false; - else - NazaraError(NzString::Pointer(listener) + " is not a listener of " + NzString::Pointer(this)); - - return RemoveResourceReference(); } bool NzResource::RemoveResourceReference() const diff --git a/src/Nazara/Utility/Mesh.cpp b/src/Nazara/Utility/Mesh.cpp index 174595362..984bc8aed 100644 --- a/src/Nazara/Utility/Mesh.cpp +++ b/src/Nazara/Utility/Mesh.cpp @@ -92,6 +92,7 @@ void NzMesh::AddSubMesh(NzSubMesh* subMesh) #endif subMesh->AddResourceListener(this, m_impl->subMeshes.size()); + subMesh->AddResourceReference(); m_impl->aabbUpdated = false; // On invalide l'AABB m_impl->subMeshes.push_back(subMesh); @@ -135,6 +136,7 @@ void NzMesh::AddSubMesh(const NzString& identifier, NzSubMesh* subMesh) int index = m_impl->subMeshes.size(); subMesh->AddResourceListener(this, index); + subMesh->AddResourceReference(); m_impl->aabbUpdated = false; // On invalide l'AABB m_impl->subMeshes.push_back(subMesh); @@ -351,7 +353,10 @@ void NzMesh::Destroy() NotifyDestroy(); for (NzSubMesh* subMesh : m_impl->subMeshes) + { subMesh->RemoveResourceListener(this); + subMesh->RemoveResourceReference(); + } delete m_impl; m_impl = nullptr; @@ -838,10 +843,13 @@ void NzMesh::RemoveSubMesh(const NzString& identifier) // On déplace l'itérateur du début d'une distance de x auto it2 = m_impl->subMeshes.begin(); - std::advance(it, index); + std::advance(it2, index); // On libère la ressource - (*it2)->RemoveResourceListener(this); + NzSubMesh* subMesh = *it2; + subMesh->RemoveResourceListener(this); + subMesh->RemoveResourceReference(); + m_impl->subMeshes.erase(it2); m_impl->aabbUpdated = false; // On invalide l'AABB @@ -868,7 +876,10 @@ void NzMesh::RemoveSubMesh(unsigned int index) std::advance(it, index); // On libère la ressource - (*it)->RemoveResourceListener(this); + NzSubMesh* subMesh = *it; + subMesh->RemoveResourceListener(this); + subMesh->RemoveResourceReference(); + m_impl->subMeshes.erase(it); m_impl->aabbUpdated = false; // On invalide l'AABB