X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fresourcemanager.cpp;h=999b86c190451dae5a8d33967a3c461c5282862c;hb=946266e823c07025f115b5e4f5523b496dcb393e;hp=8b647f31f9ef24f5bd7d13d2ae5bb46f46b54c98;hpb=4d7f66ea28c788e12f700216b9c53af9e71b8390;p=libs%2Fgl.git diff --git a/source/resourcemanager.cpp b/source/resourcemanager.cpp index 8b647f31..999b86c1 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) @@ -76,15 +78,17 @@ void ResourceManager::load_resource(Resource &r) if(!managed.collection) throw runtime_error("no location"); - if(managed.loader) + if(managed.state!=ManagedResource::NOT_LOADED) return; - managed.start_loading(); - if(async_loads) + { + managed.state = ManagedResource::LOAD_QUEUED; queue.push_back(&managed); + } else { + managed.start_loading(); while(!managed.loader->process()) ; managed.finish_loading(); } @@ -93,7 +97,7 @@ void ResourceManager::load_resource(Resource &r) void ResourceManager::resource_used(const Resource &r) { ManagedResource *managed = reinterpret_cast(r.get_manager_data()); - if(!managed->loaded && !managed->loader && policy!=LOAD_MANUALLY) + if(managed->state==ManagedResource::NOT_LOADED && policy!=LOAD_MANUALLY) load_resource(*managed->resource); managed->last_used = frame; @@ -110,11 +114,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; @@ -133,7 +147,7 @@ void ResourceManager::tick() next_unload = 0; for(ResourceMap::iterator i=resources.begin(); i!=resources.end(); ++i) - if(i->second.loaded) + if(i->second.state==ManagedResource::LOADED) { if(i->second.last_used<=unload_limit) i->second.unload(); @@ -153,10 +167,10 @@ void ResourceManager::tick() ManagedResource *best = 0; UInt64 best_impact = 0; for(ResourceMap::iterator i=resources.begin(); i!=resources.end(); ++i) - if(i->second.loaded && i->second.last_usedsecond.state==ManagedResource::LOADED && i->second.last_usedsecond.data_size*(frame-i->second.last_used); - if(!best || impactbest_impact) { best = &i->second; best_impact = impact; @@ -175,7 +189,7 @@ UInt64 ResourceManager::get_total_data_size() const { UInt64 total = 0; for(ResourceMap::const_iterator i=resources.begin(); i!=resources.end(); ++i) - if(i->second.loaded) + if(i->second.state==ManagedResource::LOADED) total += i->second.data_size; return total; } @@ -186,7 +200,7 @@ ResourceManager::ManagedResource::ManagedResource(Resource &r): collection(0), io(0), loader(0), - loaded(false), + state(NOT_LOADED), last_used(0), data_size(0) { } @@ -201,22 +215,42 @@ void ResourceManager::ManagedResource::start_loading() io = 0; throw logic_error("no loader created"); } + state = LOADING; } void ResourceManager::ManagedResource::finish_loading() { delete loader; loader = 0; - loaded = true; + state = LOADED; 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; + state = NOT_LOADED; + + 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()); } @@ -261,8 +295,12 @@ void ResourceManager::LoadingThread::set_resource(ManagedResource *r) } resource = r; - state = BUSY; - sem.signal(); + if(resource) + { + resource->start_loading(); + state = BUSY; + sem.signal(); + } } void ResourceManager::LoadingThread::sync()