]> git.tdb.fi Git - libs/gl.git/blobdiff - source/texture.h
Get rid of the generic Texture::parameter method
[libs/gl.git] / source / texture.h
index 848517eb45c99da20a67c8261ed81488b7902ea3..35f70ad693e51f7e567639dd89ae28ce5b4bd160 100644 (file)
@@ -11,6 +11,7 @@ Distributed under the LGPL
 #include <istream>
 #include <msp/datafile/objectloader.h>
 #include "gl.h"
+#include "predicate.h"
 
 namespace Msp {
 namespace GL {
@@ -28,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
@@ -45,28 +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; }
-       unsigned  get_id() const                 { return id; }
 
+       static const Texture *current();
        static void unbind();
        static void unbind_from(unsigned);
-protected:
-       unsigned   id;
-       GLenum target;
-
-       Texture();
-       Texture(const Texture &);
-       Texture &operator=(const Texture &);
-       void maybe_bind() const;
 };
 
 } // namespace GL