X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Ftexture.h;h=35f70ad693e51f7e567639dd89ae28ce5b4bd160;hb=5172d32d67595ea0b70184fadcfcb8e023cccbc8;hp=61b1bebdbac92611e9fcc853eea99a4a4e19a5a4;hpb=d16a4ab73f87d177296b59f04880ef7eba593df7;p=libs%2Fgl.git diff --git a/source/texture.h b/source/texture.h index 61b1bebd..35f70ad6 100644 --- a/source/texture.h +++ b/source/texture.h @@ -9,9 +9,9 @@ Distributed under the LGPL #define MSP_GL_TEXTURE_H_ #include -#include +#include #include "gl.h" -#include "types.h" +#include "predicate.h" namespace Msp { namespace GL { @@ -29,6 +29,15 @@ enum TextureFilter std::istream &operator>>(std::istream &, TextureFilter &); +enum TextureWrap +{ + REPEAT = GL_REPEAT, + CLAMP_TO_EDGE = GL_CLAMP_TO_EDGE, + CLAMP_TO_BORDER = GL_CLAMP_TO_BORDER, + 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 @@ -37,11 +46,8 @@ one of the dimensioned texture classes. class Texture { protected: - class Loader: public DataFile::Loader + class Loader: public DataFile::ObjectLoader { - protected: - Texture &tex; - public: Loader(Texture &); void min_filter(TextureFilter); @@ -49,27 +55,57 @@ protected: void generate_mipmap(bool); }; + 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: ~Texture(); +protected: + 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; } + void bind() const; void bind_to(unsigned) 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); } - GLenum get_target() const { return target; } - uint get_id() const { return id; } + static const Texture *current(); static void unbind(); -protected: - uint id; - GLenum target; - - Texture(); - Texture(const Texture &); - Texture &operator=(const Texture &); - void maybe_bind() const; + static void unbind_from(unsigned); }; } // namespace GL