X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fresourcemanager.cpp;h=cdd032264345dae5d81d11bf17f10e3da9ed09d3;hb=d42fdf115dfd6f3e5e2f83f2c2f905fb02fc1af4;hp=8b647f31f9ef24f5bd7d13d2ae5bb46f46b54c98;hpb=4d7f66ea28c788e12f700216b9c53af9e71b8390;p=libs%2Fgl.git diff --git a/source/resourcemanager.cpp b/source/resourcemanager.cpp index 8b647f31..cdd03226 100644 --- a/source/resourcemanager.cpp +++ b/source/resourcemanager.cpp @@ -1,5 +1,7 @@ +#include #include #include "resourcemanager.h" +#include "resourcewatcher.h" using namespace std; @@ -21,8 +23,8 @@ ResourceManager::~ResourceManager() { thread.terminate(); - for(ResourceMap::iterator i=resources.begin(); i!=resources.end(); ++i) - i->second.resource->set_manager(0); + while(!resources.empty()) + resources.begin()->second.resource->set_manager(0); } void ResourceManager::set_loading_policy(LoadingPolicy p) @@ -110,11 +112,21 @@ void ResourceManager::remove_resource(Resource &r) remove_existing(resources, &r); } +void ResourceManager::watch_resource(const Resource &r, ResourceWatcher &w) +{ + get_item(resources, &r).add_watcher(w); +} + +void ResourceManager::unwatch_resource(const Resource &r, ResourceWatcher &w) +{ + get_item(resources, &r).remove_watcher(w); +} + void ResourceManager::tick() { LoadingThread::State thread_state = thread.get_state(); bool check_total_size = false; - if(thread_state==LoadingThread::SYNC_PENDING) + if(thread_state==LoadingThread::SYNC_PENDING || thread_state==LoadingThread::LOAD_FINISHED) { thread.sync(); check_total_size = true; @@ -156,7 +168,7 @@ void ResourceManager::tick() if(i->second.loaded && i->second.last_usedsecond.data_size*(frame-i->second.last_used); - if(!best || impactbest_impact) { best = &i->second; best_impact = impact; @@ -211,12 +223,31 @@ void ResourceManager::ManagedResource::finish_loading() delete io; io = 0; data_size = resource->get_data_size(); + + for(vector::const_iterator i=watchers.begin(); i!=watchers.end(); ++i) + (*i)->resource_loaded(*resource); } void ResourceManager::ManagedResource::unload() { resource->unload(); loaded = false; + + for(vector::const_iterator i=watchers.begin(); i!=watchers.end(); ++i) + (*i)->resource_unloaded(*resource); +} + +void ResourceManager::ManagedResource::add_watcher(ResourceWatcher &w) +{ + if(find(watchers.begin(), watchers.end(), &w)==watchers.end()) + watchers.push_back(&w); +} + +void ResourceManager::ManagedResource::remove_watcher(ResourceWatcher &w) +{ + vector::iterator end = remove(watchers.begin(), watchers.end(), &w); + if(end!=watchers.end()) + watchers.erase(end, watchers.end()); }