]> git.tdb.fi Git - libs/gl.git/blobdiff - source/resourcemanager.h
Delay opening the resource file until loading actually starts
[libs/gl.git] / source / resourcemanager.h
index 49a4c0bde3a7d33b1a02da359c486257a2e9b735..244c67ec29cc5acda96ea303bddda0f7583cf1ee 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef MSP_GL_RESOURCEMANAGER_H_
 #define MSP_GL_RESOURCEMANAGER_H_
 
+#include <msp/core/inttypes.h>
 #include <msp/core/mutex.h>
 #include <msp/core/semaphore.h>
 #include <msp/core/thread.h>
@@ -10,6 +11,8 @@
 namespace Msp {
 namespace GL {
 
+class ResourceWatcher;
+
 class ResourceManager
 {
 public:
@@ -23,13 +26,32 @@ public:
 private:
        struct ManagedResource
        {
+               enum ResourceState
+               {
+                       NOT_LOADED,
+                       LOAD_QUEUED,
+                       LOADING,
+                       LOADED
+               };
+
                Resource *resource;
                DataFile::Collection *collection;
                std::string name;
                IO::Seekable *io;
                Resource::AsyncLoader *loader;
+               ResourceState state;
+               unsigned last_used;
+               UInt64 data_size;
+               std::vector<ResourceWatcher *> watchers;
 
                ManagedResource(Resource &);
+
+               void start_loading();
+               void finish_loading();
+               void unload();
+
+               void add_watcher(ResourceWatcher &);
+               void remove_watcher(ResourceWatcher &);
        };
 
        class LoadingThread: public Thread
@@ -72,6 +94,11 @@ private:
        bool async_loads;
        ResourceMap resources;
        LoadQueue queue;
+       UInt64 size_limit;
+       unsigned frame;
+       unsigned min_retain_frames;
+       unsigned max_retain_frames;
+       unsigned next_unload;
        LoadingThread thread;
 
 public:
@@ -80,13 +107,22 @@ public:
 
        void set_loading_policy(LoadingPolicy);
        void set_async_loads(bool);
+       void set_size_limit(UInt64);
+       void set_min_retain_frames(unsigned);
+       void set_max_retain_frames(unsigned);
 
        void add_resource(Resource &);
+       void *get_data_for_resource(const Resource &);
        void set_resource_location(Resource &, DataFile::Collection &, const std::string &);
-       void load_resource(const Resource &);
+       void load_resource(Resource &);
+       void resource_used(const Resource &);
        void remove_resource(Resource &);
 
+       void watch_resource(const Resource &, ResourceWatcher &);
+       void unwatch_resource(const Resource &, ResourceWatcher &);
+
        void tick();
+       UInt64 get_total_data_size() const;
 };
 
 } // namespace GL