]> git.tdb.fi Git - libs/gl.git/blobdiff - source/texture.h
Drop Id tags and copyright notices from files
[libs/gl.git] / source / texture.h
index 6dd729b4d23a546f0c50bc92a4aa2cb73291652d..71fa34076cb46028c3ac7b440096ea8f9c1b6535 100644 (file)
@@ -1,17 +1,10 @@
-/* $Id$
-
-This file is part of libmspgl
-Copyright © 2007  Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
-
 #ifndef MSP_GL_TEXTURE_H_
 #define MSP_GL_TEXTURE_H_
 
 #include <istream>
-#include <msp/datafile/loader.h>
+#include <msp/datafile/objectloader.h>
 #include "gl.h"
-#include "types.h"
+#include "predicate.h"
 
 namespace Msp {
 namespace GL {
@@ -29,6 +22,14 @@ enum TextureFilter
 std::istream &operator>>(std::istream &, TextureFilter &);
 
 
+enum TextureWrap
+{
+       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
@@ -37,38 +38,70 @@ one of the dimensioned texture classes.
 class Texture
 {
 protected:
-       class Loader: public DataFile::Loader
+       class Loader: public DataFile::ObjectLoader<Texture>
        {
-       protected:
-               Texture &tex;
-
        public:
                Loader(Texture &);
-               void min_filter(TextureFilter);
-               void mag_filter(TextureFilter);
                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:
        ~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 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; }
+       void bind_to(unsigned) const;
 
+       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