]> git.tdb.fi Git - libs/gl.git/blobdiff - source/resourcemanager.cpp
Rework ProgramData to do less unnecessary work
[libs/gl.git] / source / resourcemanager.cpp
index 8b647f31f9ef24f5bd7d13d2ae5bb46f46b54c98..cdd032264345dae5d81d11bf17f10e3da9ed09d3 100644 (file)
@@ -1,5 +1,7 @@
+#include <algorithm>
 #include <msp/time/utils.h>
 #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_used<unload_limit)
                                {
                                        UInt64 impact = i->second.data_size*(frame-i->second.last_used);
-                                       if(!best || impact<best_impact)
+                                       if(!best || impact>best_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<ResourceWatcher *>::const_iterator i=watchers.begin(); i!=watchers.end(); ++i)
+               (*i)->resource_loaded(*resource);
 }
 
 void ResourceManager::ManagedResource::unload()
 {
        resource->unload();
        loaded = false;
+
+       for(vector<ResourceWatcher *>::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<ResourceWatcher *>::iterator end = remove(watchers.begin(), watchers.end(), &w);
+       if(end!=watchers.end())
+               watchers.erase(end, watchers.end());
 }