X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Ftexture.h;h=774b7e83610b17ea8ea1a861c23b41917ea256c1;hb=47f817343df1d06d91a4f7c4d5b47df40b24366c;hp=c091c884cacfd592833120b785c7f83ff2fe303e;hpb=6fd9b09f47ff6a07bd5ca7f9e8887db3486bfcb1;p=libs%2Fgl.git diff --git a/source/texture.h b/source/texture.h index c091c884..774b7e83 100644 --- a/source/texture.h +++ b/source/texture.h @@ -1,9 +1,14 @@ #ifndef MSP_GL_TEXTURE_H_ #define MSP_GL_TEXTURE_H_ +#include #include +#include +#include "datatype.h" #include "gl.h" +#include "pixelformat.h" #include "predicate.h" +#include "resource.h" namespace Msp { namespace GL { @@ -63,19 +68,31 @@ texture to be usable. If texture coordinates fall outside of the principal range of the texture, wrapping is applied. The default for all directions is REPEAT. */ -class Texture +class Texture: public Resource { protected: - class Loader: public DataFile::ObjectLoader + class Loader: public DataFile::CollectionObjectLoader { + protected: + unsigned levels; + bool srgb; + public: Loader(Texture &); + Loader(Texture &, Collection &); private: + void init(); + + unsigned get_levels() const; + + void external_image(const std::string &); void filter(TextureFilter); void generate_mipmap(bool); + void image_data(const std::string &); void mag_filter(TextureFilter); void max_anisotropy(float); void min_filter(TextureFilter); + void mipmap_levels(unsigned); void wrap(TextureWrap); void wrap_r(TextureWrap); void wrap_s(TextureWrap); @@ -89,33 +106,50 @@ protected: WRAP_S = 4, WRAP_T = 8, WRAP_R = 16, - GENERATE_MIPMAP = 32, COMPARE = 64, COMPARE_FUNC = 128, - MAX_ANISOTROPY = 256 + MAX_ANISOTROPY = 256, + FORMAT_SWIZZLE = 512 + }; + + enum FormatSwizzle + { + NO_SWIZZLE, + R_TO_LUMINANCE, + RG_TO_LUMINANCE_ALPHA }; unsigned id; GLenum target; + PixelFormat ifmt; + FormatSwizzle swizzle; TextureFilter min_filter; TextureFilter mag_filter; float max_anisotropy; TextureWrap wrap_s; TextureWrap wrap_t; TextureWrap wrap_r; - bool gen_mipmap; + bool auto_gen_mipmap; bool compare; Predicate cmp_func; mutable int dirty_params; - Texture(GLenum); + static int swizzle_orders[]; + + Texture(GLenum, ResourceManager * = 0); Texture(const Texture &); Texture &operator=(const Texture &); public: ~Texture(); protected: + static DataType get_alloc_type(PixelFormat); + void set_internal_format(PixelFormat); + PixelFormat get_upload_format(PixelFormat) const; + void update_parameter(int) const; + void set_parameter_i(GLenum, int) const; + void set_parameter_f(GLenum, float) const; public: void set_min_filter(TextureFilter); void set_mag_filter(TextureFilter); @@ -124,6 +158,8 @@ public: is not applicable to magnification, LINEAR is used instead. */ void set_filter(TextureFilter); + DEPRECATED void set_mipmap_levels(unsigned) { } + void set_max_anisotropy(float); /** Sets the wrapping mode for all coordinates. */ @@ -133,9 +169,16 @@ public: void set_wrap_t(TextureWrap); void set_wrap_r(TextureWrap); + static bool can_generate_mipmap(); + + void generate_mipmap(); + /** Sets automatic mipmap generation. If enabled, mipmaps are generated when a texture image is uploaded. */ - void set_generate_mipmap(bool); + void set_auto_generate_mipmap(bool); + + /// Deprecated. Use set_auto_generate_mipmap instead. + DEPRECATED void set_generate_mipmap(bool g) { set_auto_generate_mipmap(g); } /** Sets depth texture comparison. Has no effect on other formats. When comparison is enabled, the third component of the texture coordinate is @@ -146,6 +189,21 @@ public: /** Sets the function to use for depth comparison. */ void set_compare_func(Predicate); + /// Loads a Graphics::Image from a file and uploads it to the texture. + virtual void load_image(const std::string &, bool srgb = false); + + virtual void load_image(const std::string &, unsigned, bool srgb = false); + + /** 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 the defined storage. Semantics depend on the type of texture. + + 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, bool srgb = false) = 0; + GLenum get_target() const { return target; } unsigned get_id() const { return id; } @@ -155,8 +213,13 @@ public: static const Texture *current(unsigned = 0); static void unbind() { unbind_from(0); } static void unbind_from(unsigned); + + virtual UInt64 get_data_size() const { return 0; } }; + +bool is_mipmapped(TextureFilter); + } // namespace GL } // namespace Msp