X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Ftexture.h;h=af0844c55e26938f00b2201e2f10abd576ece537;hb=8d6ed0b5fb02e2a2f9142e869fd705c36f57a225;hp=28f9cb328979efdcefc0c6934e250da56748cdb7;hpb=a4ec5410595ddf37bfbc0e85ad87d31a9cbf94f1;p=libs%2Fgl.git diff --git a/source/texture.h b/source/texture.h index 28f9cb32..af0844c5 100644 --- a/source/texture.h +++ b/source/texture.h @@ -1,56 +1,154 @@ -/* $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 #include "gl.h" -#include "types.h" +#include "predicate.h" namespace Msp { namespace GL { enum TextureFilter { - NEAREST = GL_NEAREST, - LINEAR = GL_LINEAR, + /// No filtering + NEAREST = GL_NEAREST, + + /// Bilinear filtering + LINEAR = GL_LINEAR, + + /// Mipmapping without filtering NEAREST_MIPMAP_NEAREST = GL_NEAREST_MIPMAP_NEAREST, - NEAREST_MIPMAP_LINEAR = GL_NEAREST_MIPMAP_LINEAR, - LINEAR_MIPMAP_NEAREST = GL_LINEAR_MIPMAP_NEAREST, - LINEAR_MIPMAP_LINEAR = GL_LINEAR_MIPMAP_LINEAR + + /// Linear filtering between two mipmap levels + NEAREST_MIPMAP_LINEAR = GL_NEAREST_MIPMAP_LINEAR, + + /// Bilinear filtering on the closest mipmap level + LINEAR_MIPMAP_NEAREST = GL_LINEAR_MIPMAP_NEAREST, + + /// Trilinear filtering between two mipmap levels + LINEAR_MIPMAP_LINEAR = GL_LINEAR_MIPMAP_LINEAR +}; + + +enum TextureWrap +{ + /// Tile the texture infinitely + REPEAT = GL_REPEAT, + + /// Extend the texels at the edge of the texture to infinity + CLAMP_TO_EDGE = GL_CLAMP_TO_EDGE, + + /// Tile the texture, with every other repetition mirrored + 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. + +A texture is generally rendered at a size that's either smaller or larger than +its native size, so that the texture coordinates do not exactly correspond to +the texels of the texture. The kind of filtering used, if any, is determined +by the minification and magnification filter parameters. The default is LINEAR +for magnification and NEAREST_MIPMAP_LINEAR for minification. + +When a mipmapped filter is in use, the texture consists of a stack of mipmap +images. Level 0 is the base image. Each level above 0 has half the size of +the previous level, rounded down and clamped to 1. The level with size 1 in +all dimensions is the last mipmap level. All levels must be allocated for the +texture to be usable. + +If texture coordinates fall outside of the principal range of the texture, +wrapping is applied. The default for all directions is REPEAT. */ class Texture { -public: - ~Texture(); +protected: + class Loader: public DataFile::ObjectLoader + { + public: + Loader(Texture &); + private: + void generate_mipmap(bool); + void mag_filter(TextureFilter); + void max_anisotropy(float); + void min_filter(TextureFilter); + void wrap(TextureWrap); + void wrap_r(TextureWrap); + void wrap_s(TextureWrap); + void wrap_t(TextureWrap); + }; - 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; } + 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, + MAX_ANISOTROPY = 256 + }; - static void unbind(); -protected: - uint id; + unsigned id; GLenum target; + TextureFilter min_filter; + TextureFilter mag_filter; + float max_anisotropy; + TextureWrap wrap_s; + TextureWrap wrap_t; + TextureWrap wrap_r; + bool gen_mipmap; + bool compare; + Predicate cmp_func; + mutable int dirty_params; - Texture(); + Texture(GLenum); Texture(const Texture &); Texture &operator=(const Texture &); - void maybe_bind() const; +public: + ~Texture(); + +protected: + void update_parameter(int) const; +public: + void set_min_filter(TextureFilter); + void set_mag_filter(TextureFilter); + void set_max_anisotropy(float); + + /** Sets the wrapping mode for all coordinates. */ + void set_wrap(TextureWrap); + + void set_wrap_s(TextureWrap); + void set_wrap_t(TextureWrap); + void set_wrap_r(TextureWrap); + + /** Sets automatic mipmap generation. If enabled, mipmaps are generated + when a texture image is uploaded. */ + void set_generate_mipmap(bool); + + /** Sets depth texture comparison. Has no effect on other formats. When + comparison is enabled, the third component of the texture coordinate is + compared against the texel value, and the result is returned as the texture + sample. */ + void set_compare_enabled(bool); + + /** Sets the function to use for depth comparison. */ + 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; + + static const Texture *current(); + static void unbind(); + static void unbind_from(unsigned); }; } // namespace GL