]> 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 7c29865747e79f6e7972bc329885303ea09fe52e..71fa34076cb46028c3ac7b440096ea8f9c1b6535 100644 (file)
@@ -1,8 +1,10 @@
 #ifndef MSP_GL_TEXTURE_H_
 #define MSP_GL_TEXTURE_H_
 
-#include <GL/gl.h>
-#include "types.h"
+#include <istream>
+#include <msp/datafile/objectloader.h>
+#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<Texture>
+       {
+       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