#ifndef MSP_GL_TEXTURE_H_
#define MSP_GL_TEXTURE_H_
+#include <msp/datafile/dynamicobjectloader.h>
#include <msp/datafile/objectloader.h>
#include <msp/graphics/image.h>
-#include "gl.h"
#include "pixelformat.h"
#include "resource.h"
+#include "texture_backend.h"
namespace Msp {
namespace GL {
of each mipmap level are half that of the previous level. The mipmap stack
can be used for texture minification; see the Sampler class for details.
*/
-class Texture: public Resource
+class Texture: public TextureBackend, public Resource
{
- friend class Framebuffer;
- friend class PipelineState;
+ friend TextureBackend;
+
protected:
class Loader: public DataFile::CollectionObjectLoader<Texture>
{
unsigned levels;
public:
- Loader(Texture &);
- Loader(Texture &, Collection &);
+ Loader(Texture &t): Loader(t, 0) { }
+ Loader(Texture &t, Collection &c): Loader(t, &c) { }
private:
- void init();
+ Loader(Texture &, Collection *);
virtual void finish();
void mipmap_levels(unsigned);
};
+public:
+ class GenericLoader: public DataFile::DynamicObjectLoader<Texture>
+ {
+ friend class Texture;
+
+ public:
+ GenericLoader(Collection &c): DynamicObjectLoader<Texture>(&c) { }
+
+ protected:
+ virtual const TypeRegistry &get_type_registry() const { return get_texture_registry(); }
+ };
+
+protected:
enum FormatSwizzle
{
NO_SWIZZLE,
RGB_TO_BGR
};
- unsigned id;
- GLenum target;
PixelFormat format;
PixelFormat storage_fmt;
FormatSwizzle swizzle;
bool use_srgb_format;
bool auto_gen_mipmap;
- std::string debug_name;
- static const int swizzle_orders[];
- static Texture *scratch_binding;
-
- Texture(GLenum, ResourceManager * = 0);
- Texture(const Texture &);
- Texture &operator=(const Texture &);
-public:
- ~Texture();
+ Texture(unsigned);
-protected:
- void generate_id();
void set_format(PixelFormat);
- void apply_swizzle();
- void set_parameter_i(GLenum, int) const;
public:
PixelFormat get_format() const { return format; }
- void generate_mipmap();
+ using TextureBackend::generate_mipmap;
/// Loads a Graphics::Image from a file and uploads it to the texture.
virtual void load_image(const std::string &, unsigned = 0);
virtual std::uint64_t get_data_size() const { return 0; }
- void set_debug_name(const std::string &);
+ using TextureBackend::set_debug_name;
-protected:
- void bind_scratch();
-public:
- static void unbind_scratch();
+private:
+ static GenericLoader::TypeRegistry &get_texture_registry();
};
} // namespace GL