X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;ds=sidebyside;f=source%2Fresourcemanager.cpp;h=7d5d752b2351a3607e17b953212d981cde1c1792;hb=fbd600202a0d935381132f24c8dafa7b6093b596;hp=40dcff9bc36876b649edaec7c0aeecca0aee45c1;hpb=0071618b8eb3553948a2601b6f9e28bd7d2cd817;p=libs%2Fgl.git diff --git a/source/resourcemanager.cpp b/source/resourcemanager.cpp index 40dcff9b..7d5d752b 100644 --- a/source/resourcemanager.cpp +++ b/source/resourcemanager.cpp @@ -4,6 +4,7 @@ #include #include #include "resourcemanager.h" +#include "resources.h" #include "resourcewatcher.h" using namespace std; @@ -11,6 +12,10 @@ using namespace std; namespace Msp { namespace GL { +resource_load_error::resource_load_error(const string &name, const string &err): + runtime_error(format("%s: %s", name, err)) +{ } + resource_load_error::resource_load_error(const string &name, const exception &exc): runtime_error(format("%s: %s: %s", name, Debug::demangle(typeid(exc).name()), exc.what())) { } @@ -101,7 +106,9 @@ void ResourceManager::load_resource(Resource &r) if(async_loads) { managed.state = ManagedResource::LOAD_QUEUED; - queue.push_back(&managed); + LoadQueue::iterator i; + for(i=queue.begin(); (i!=queue.end() && (*i)->load_priority>=managed.load_priority); ++i) ; + queue.insert(i, &managed); } else { @@ -111,7 +118,7 @@ void ResourceManager::load_resource(Resource &r) } } -bool ResourceManager::is_resource_loaded(const Resource &r) +bool ResourceManager::is_resource_loaded(const Resource &r) const { ManagedResource *managed = reinterpret_cast(r.get_manager_data()); return managed ? managed->state==ManagedResource::LOADED : false; @@ -120,6 +127,8 @@ bool ResourceManager::is_resource_loaded(const Resource &r) void ResourceManager::resource_used(const Resource &r) { ManagedResource *managed = reinterpret_cast(r.get_manager_data()); + if(!managed) + return; if(managed->state==ManagedResource::NOT_LOADED && policy!=LOAD_MANUALLY) load_resource(*managed->resource); @@ -264,6 +273,7 @@ ResourceManager::ResourceLocation::ResourceLocation(DataFile::Collection &c, con ResourceManager::ManagedResource::ManagedResource(Resource &r): resource(&r), + load_priority(r.get_load_priority()), io(0), loader(0), state(NOT_LOADED), @@ -274,7 +284,11 @@ ResourceManager::ManagedResource::ManagedResource(Resource &r): void ResourceManager::ManagedResource::start_loading() { io = location.collection->open_raw(location.name); - loader = resource->load(*io); + if(!io) + throw resource_load_error(location.name, "open failed"); + + const Resources *res = dynamic_cast(location.collection); + loader = resource->load(*io, res); if(!loader) { delete io;