void NPatchData::AddObserver(TextureUploadObserver* textureObserver)
{
- if(mObserverNotifying)
- {
- // Do not add it into observer list during observer notifying.
- mQueuedObservers.PushBack(textureObserver);
- }
- else
+ if(textureObserver)
{
- mObserverList.PushBack(textureObserver);
+ if(mObserverNotifying)
+ {
+ // Do not add it into observer list during observer notifying.
+ mQueuedObservers.PushBack(textureObserver);
+ }
+ else
+ {
+ mObserverList.PushBack(textureObserver);
+ }
+ textureObserver->DestructionSignal().Connect(this, &NPatchData::ObserverDestroyed);
}
- textureObserver->DestructionSignal().Connect(this, &NPatchData::ObserverDestroyed);
}
void NPatchData::RemoveObserver(TextureUploadObserver* textureObserver)
{
- for(uint32_t index = 0; index < mObserverList.Count(); ++index)
+ if(textureObserver)
{
- if(textureObserver == mObserverList[index])
+ for(uint32_t index = 0; index < mObserverList.Count(); ++index)
{
- textureObserver->DestructionSignal().Disconnect(this, &NPatchData::ObserverDestroyed);
- mObserverList.Erase(mObserverList.begin() + index);
- break;
+ if(textureObserver == mObserverList[index])
+ {
+ textureObserver->DestructionSignal().Disconnect(this, &NPatchData::ObserverDestroyed);
+ mObserverList.Erase(mObserverList.begin() + index);
+ break;
+ }
}
}
}
void NPatchLoader::RequestRemove(NPatchData::NPatchDataId id, TextureUploadObserver* textureObserver)
{
- mRemoveQueue.push_back({id, textureObserver});
+ // Remove observer first
+ if(textureObserver)
+ {
+ int32_t cacheIndex = GetCacheIndexFromId(id);
+ if(cacheIndex != INVALID_CACHE_INDEX)
+ {
+ NPatchInfo& info(mCache[cacheIndex]);
+
+ info.mData->RemoveObserver(textureObserver);
+ }
+ }
+
+ mRemoveQueue.push_back({id, nullptr});
if(!mRemoveProcessorRegistered && Adaptor::IsAvailable())
{