--- /dev/null
+#ifndef MSP_GL_RESOURCE_H_
+#define MSP_GL_RESOURCE_H_
+
+#include <msp/core/inttypes.h>
+#include <msp/io/seekable.h>
+
+namespace Msp {
+namespace GL {
+
+class ResourceManager;
+class Resources;
+
+class Resource
+{
+public:
+ class AsyncLoader
+ {
+ protected:
+ AsyncLoader() { }
+ public:
+ virtual ~AsyncLoader() { }
+
+ virtual bool needs_sync() const = 0;
+ virtual bool process() = 0;
+ };
+
+protected:
+ ResourceManager *manager;
+ void *manager_data;
+
+ Resource();
+public:
+ virtual ~Resource();
+
+ void set_manager(ResourceManager *);
+ ResourceManager *get_manager() const { return manager; }
+ void *get_manager_data() const { return manager_data; }
+ virtual int get_load_priority() const { return 0; }
+ virtual AsyncLoader *load(IO::Seekable &, const Resources * = 0) = 0;
+ virtual bool is_loaded() const;
+
+ /** Returns the amount of graphics memory used by this resource. The
+ returned value must not change while the resource is loaded. */
+ virtual UInt64 get_data_size() const = 0;
+
+ virtual void unload() = 0;
+};
+
+} // namespace GL
+} // namespace Msp
+
+#endif