private:
Texture2D &texture;
IO::Seekable &io;
+ bool srgb_conversion;
Buffer pixel_buffer;
char *mapped_address;
Graphics::Image image;
public:
AsyncLoader(Texture2D &, IO::Seekable &);
+ void set_srgb_conversion(bool);
virtual bool needs_sync() const;
virtual bool process();
};
Texture2D::Texture2D(ResourceManager *m):
Texture(GL_TEXTURE_2D, m),
+ ifmt(RGB),
width(0),
height(0),
allocated(0)
{ }
+Texture2D::~Texture2D()
+{
+ set_manager(0);
+}
+
void Texture2D::storage(PixelFormat fmt, unsigned wd, unsigned ht)
{
if(width>0)
if(allocated&(1<<level))
return;
- image(level, get_base_pixelformat(ifmt), UNSIGNED_BYTE, 0);
+ PixelFormat base_fmt = get_base_pixelformat(ifmt);
+ image(level, base_fmt, get_alloc_type(base_fmt), 0);
}
void Texture2D::image(unsigned level, PixelFormat fmt, DataType type, const void *data)
allocated |= 1<<level;
if(gen_mipmap && level==0)
{
+ auto_generate_mipmap();
for(; (w || h); w>>=1, h>>=1, ++level) ;
allocated |= (1<<level)-1;
}
h = 1;
}
-Resource::AsyncLoader *Texture2D::load(IO::Seekable &io)
+Resource::AsyncLoader *Texture2D::load(IO::Seekable &io, const Resources *res)
+{
+ AsyncLoader *ldr = new AsyncLoader(*this, io);
+ if(res)
+ ldr->set_srgb_conversion(res->get_srgb_conversion());
+ return ldr;
+}
+
+UInt64 Texture2D::get_data_size() const
{
- return new AsyncLoader(*this, io);
+ return id ? width*height*get_component_count(ifmt) : 0;
}
void Texture2D::unload()
Texture2D::AsyncLoader::AsyncLoader(Texture2D &t, IO::Seekable &i):
texture(t),
io(i),
+ srgb_conversion(false),
pixel_buffer(PIXEL_UNPACK_BUFFER),
mapped_address(0),
phase(0)
+{ }
+
+void Texture2D::AsyncLoader::set_srgb_conversion(bool c)
{
- if(!texture.id)
- glGenTextures(1, &texture.id);
+ srgb_conversion = c;
}
bool Texture2D::AsyncLoader::needs_sync() const
return false;
}
- texture.image(image, false, true);
+ if(!texture.id)
+ glGenTextures(1, &texture.id);
+ texture.image(image, srgb_conversion, true);
}
++phase;