#include <string>
#include <msp/graphics/image.h>
-#include "resource.h"
#include "texture.h"
namespace Msp {
void raw_data(const std::string &);
void storage(PixelFormat, unsigned, unsigned);
+ void storage_levels(PixelFormat, unsigned, unsigned, unsigned);
};
private:
class AsyncLoader;
- PixelFormat ifmt;
unsigned width;
unsigned height;
+ unsigned levels;
unsigned allocated;
public:
Texture2D(ResourceManager * = 0);
virtual ~Texture2D();
- /** Defines storage structure for the texture. Must be called before an
- image can be uploaded. Once storage is defined, it can't be changed. */
- void storage(PixelFormat fmt, unsigned wd, unsigned ht);
+ /** Defines storage structure for the texture. If lv is zero, the number
+ of mipmap levels is automatically determined from storage dimensions.
+
+ Must be called before an image can be uploaded. Once storage is defined,
+ it can't be changed. */
+ void storage(PixelFormat fmt, unsigned wd, unsigned ht, unsigned lv = 0);
+
+ DEPRECATED void storage(PixelComponents cm, unsigned wd, unsigned ht, unsigned lv = 0)
+ { storage(make_pixelformat(cm, UNSIGNED_BYTE), wd, ht, lv); }
/** Allocates storage for the texture. The contents are initially
undefined. If storage has already been allocated, does nothing. */
/** Uploads an image to the texture. Storage must be defined beforehand.
The image data must have dimensions and format compatible with the defined
storage. */
- void image(unsigned level, PixelFormat fmt, DataType type, const void *data);
+ void image(unsigned level, PixelComponents fmt, DataType type, const void *data);
/** Updates a rectangular region of the texture. Storage must be defined
and allocated beforehand. The update region must be fully inside the
texture. */
void sub_image(unsigned level, int x, int y, unsigned wd, unsigned ht,
- PixelFormat fmt, DataType type, const void *data);
+ PixelComponents fmt, DataType type, const void *data);
/** Uploads an image to the texture. If storage has not been defined, it
will be set to match the image. Otherwise the image must be compatible with
If srgb is true and storage is determined by this call, then an sRGB pixel
format will be used. */
- virtual void image(const Graphics::Image &, bool srgb = false);
+ virtual void image(const Graphics::Image &, unsigned lv, bool srgb = false);
+
+ using Texture::image;
private:
- void image(const Graphics::Image &, bool, bool);
+ void image(const Graphics::Image &, unsigned, bool, bool);
public:
unsigned get_width() const { return width; }
unsigned get_height() const { return height; }
private:
- void get_level_size(unsigned, unsigned &, unsigned &);
+ unsigned get_n_levels() const;
+ void get_level_size(unsigned, unsigned &, unsigned &) const;
public:
virtual Resource::AsyncLoader *load(IO::Seekable &, const Resources * = 0);