ResourceListener no longer add a resource reference

Former-commit-id: b249d472b4140b85e4e286552323fde6b9b66bd7
This commit is contained in:
Lynix 2013-07-09 01:06:11 +02:00
parent 588077396c
commit 5b730f1d4c
4 changed files with 18 additions and 16 deletions

View File

@ -49,7 +49,7 @@ class NAZARA_API NzResource
bool IsPersistent() const; bool IsPersistent() const;
bool RemoveResourceListener(NzResourceListener* listener) const; void RemoveResourceListener(NzResourceListener* listener) const;
bool RemoveResourceReference() const; bool RemoveResourceReference() const;
bool SetPersistent(bool persistent = true, bool checkReferenceCount = false); bool SetPersistent(bool persistent = true, bool checkReferenceCount = false);

View File

@ -44,8 +44,8 @@ class NAZARA_API NzStaticMesh final : public NzSubMesh, NzResourceListener
void OnResourceReleased(const NzResource* resource, int index) override; void OnResourceReleased(const NzResource* resource, int index) override;
NzBoxf m_aabb; NzBoxf m_aabb;
const NzIndexBuffer* m_indexBuffer = nullptr; NzIndexBufferConstRef m_indexBuffer = nullptr;
NzVertexBuffer* m_vertexBuffer = nullptr; NzVertexBufferRef m_vertexBuffer = nullptr;
}; };
#endif // NAZARA_STATICMESH_HPP #endif // NAZARA_STATICMESH_HPP

View File

@ -33,12 +33,7 @@ void NzResource::AddResourceListener(NzResourceListener* listener, int index) co
NazaraLock(m_mutex) NazaraLock(m_mutex)
if (m_resourceListeners.insert(NzResourceEntry(listener, index)).second) if (m_resourceListeners.insert(NzResourceEntry(listener, index)).second)
{
m_resourceListenerUpdated = false; m_resourceListenerUpdated = false;
// AddResourceReference()
m_resourceReferenceCount++;
}
} }
void NzResource::AddResourceReference() const void NzResource::AddResourceReference() const
@ -56,16 +51,12 @@ bool NzResource::IsPersistent() const
return m_resourcePersistent; return m_resourcePersistent;
} }
bool NzResource::RemoveResourceListener(NzResourceListener* listener) const void NzResource::RemoveResourceListener(NzResourceListener* listener) const
{ {
NazaraMutexLock(m_mutex); NazaraMutexLock(m_mutex);
if (m_resourceListeners.erase(listener) != 0) if (m_resourceListeners.erase(listener) != 0)
m_resourceListenerUpdated = false; m_resourceListenerUpdated = false;
else
NazaraError(NzString::Pointer(listener) + " is not a listener of " + NzString::Pointer(this));
return RemoveResourceReference();
} }
bool NzResource::RemoveResourceReference() const bool NzResource::RemoveResourceReference() const

View File

@ -92,6 +92,7 @@ void NzMesh::AddSubMesh(NzSubMesh* subMesh)
#endif #endif
subMesh->AddResourceListener(this, m_impl->subMeshes.size()); subMesh->AddResourceListener(this, m_impl->subMeshes.size());
subMesh->AddResourceReference();
m_impl->aabbUpdated = false; // On invalide l'AABB m_impl->aabbUpdated = false; // On invalide l'AABB
m_impl->subMeshes.push_back(subMesh); m_impl->subMeshes.push_back(subMesh);
@ -135,6 +136,7 @@ void NzMesh::AddSubMesh(const NzString& identifier, NzSubMesh* subMesh)
int index = m_impl->subMeshes.size(); int index = m_impl->subMeshes.size();
subMesh->AddResourceListener(this, index); subMesh->AddResourceListener(this, index);
subMesh->AddResourceReference();
m_impl->aabbUpdated = false; // On invalide l'AABB m_impl->aabbUpdated = false; // On invalide l'AABB
m_impl->subMeshes.push_back(subMesh); m_impl->subMeshes.push_back(subMesh);
@ -351,7 +353,10 @@ void NzMesh::Destroy()
NotifyDestroy(); NotifyDestroy();
for (NzSubMesh* subMesh : m_impl->subMeshes) for (NzSubMesh* subMesh : m_impl->subMeshes)
{
subMesh->RemoveResourceListener(this); subMesh->RemoveResourceListener(this);
subMesh->RemoveResourceReference();
}
delete m_impl; delete m_impl;
m_impl = nullptr; 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 // On déplace l'itérateur du début d'une distance de x
auto it2 = m_impl->subMeshes.begin(); auto it2 = m_impl->subMeshes.begin();
std::advance(it, index); std::advance(it2, index);
// On libère la ressource // On libère la ressource
(*it2)->RemoveResourceListener(this); NzSubMesh* subMesh = *it2;
subMesh->RemoveResourceListener(this);
subMesh->RemoveResourceReference();
m_impl->subMeshes.erase(it2); m_impl->subMeshes.erase(it2);
m_impl->aabbUpdated = false; // On invalide l'AABB m_impl->aabbUpdated = false; // On invalide l'AABB
@ -868,7 +876,10 @@ void NzMesh::RemoveSubMesh(unsigned int index)
std::advance(it, index); std::advance(it, index);
// On libère la ressource // On libère la ressource
(*it)->RemoveResourceListener(this); NzSubMesh* subMesh = *it;
subMesh->RemoveResourceListener(this);
subMesh->RemoveResourceReference();
m_impl->subMeshes.erase(it); m_impl->subMeshes.erase(it);
m_impl->aabbUpdated = false; // On invalide l'AABB m_impl->aabbUpdated = false; // On invalide l'AABB