X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Ftexture.h;h=71fa34076cb46028c3ac7b440096ea8f9c1b6535;hp=7c29865747e79f6e7972bc329885303ea09fe52e;hb=f14435e58bfa0fa697a06ba9a454bb30cd37d9d8;hpb=7adcad3b40a03000a82e32db4523761c218309b8 diff --git a/source/texture.h b/source/texture.h index 7c298657..71fa3407 100644 --- a/source/texture.h +++ b/source/texture.h @@ -1,8 +1,10 @@ #ifndef MSP_GL_TEXTURE_H_ #define MSP_GL_TEXTURE_H_ -#include -#include "types.h" +#include +#include +#include "gl.h" +#include "predicate.h" namespace Msp { namespace GL { @@ -17,36 +19,89 @@ enum TextureFilter LINEAR_MIPMAP_LINEAR = GL_LINEAR_MIPMAP_LINEAR }; -enum TextureFormat +std::istream &operator>>(std::istream &, TextureFilter &); + + +enum TextureWrap { - LUMINANCE8, - LUMINANCE8_ALPHA8, - RGB8, - RGBA8, - BGR8, - BGRA8 + REPEAT = GL_REPEAT, + CLAMP_TO_EDGE = GL_CLAMP_TO_EDGE, + MIRRORED_REPEAT = GL_MIRRORED_REPEAT }; + +/** +Base class for textures. This class only defines operations common for all +texture types and is not instantiable. For specifying images for textures, see +one of the dimensioned texture classes. +*/ class Texture { +protected: + class Loader: public DataFile::ObjectLoader + { + public: + Loader(Texture &); + void generate_mipmap(bool); + void mag_filter(TextureFilter); + void min_filter(TextureFilter); + void wrap(TextureWrap); + void wrap_r(TextureWrap); + void wrap_s(TextureWrap); + void wrap_t(TextureWrap); + }; + + enum ParameterMask + { + MIN_FILTER = 1, + MAG_FILTER = 2, + WRAP_S = 4, + WRAP_T = 8, + WRAP_R = 16, + GENERATE_MIPMAP = 32, + COMPARE = 64, + COMPARE_FUNC = 128 + }; + + unsigned id; + GLenum target; + TextureFilter min_filter; + TextureFilter mag_filter; + TextureWrap wrap_s; + TextureWrap wrap_t; + TextureWrap wrap_r; + bool gen_mipmap; + bool compare; + Predicate cmp_func; + mutable int dirty_params; + + Texture(GLenum); + Texture(const Texture &); + Texture &operator=(const Texture &); public: - void bind() const; - void parameter(GLenum, int); - void parameter(GLenum, float); - void set_min_filter(TextureFilter f) { parameter(GL_TEXTURE_MIN_FILTER, f); } - void set_mag_filter(TextureFilter f) { parameter(GL_TEXTURE_MAG_FILTER, f); } - uint get_id() const { return id; } - sizei get_width(int =0) const; - sizei get_height(int =0) const; - sizei get_depth(int =0) const; ~Texture(); + protected: - uint id; - GLenum target; + void update_parameter(int) const; +public: + void set_min_filter(TextureFilter); + void set_mag_filter(TextureFilter); + void set_wrap(TextureWrap); + void set_wrap_s(TextureWrap); + void set_wrap_t(TextureWrap); + void set_wrap_r(TextureWrap); + void set_generate_mipmap(bool); + void set_compare_enabled(bool); + void set_compare_func(Predicate); + GLenum get_target() const { return target; } + unsigned get_id() const { return id; } - Texture(); + void bind() const; + void bind_to(unsigned) const; - static const Texture *bound; + static const Texture *current(); + static void unbind(); + static void unbind_from(unsigned); }; } // namespace GL