X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Ftexture.h;h=6c0fbf2574b6cb6f8a897e62f0977b8db9486e4f;hb=2edfcf08707c3627b6b27289ba607a7183d63b01;hp=8aac05927288cfcbcdb8253230f8df97829f6c82;hpb=aead6d04308d7873dc99aa4572ce1590a89ebcbd;p=libs%2Fgl.git diff --git a/source/texture.h b/source/texture.h index 8aac0592..6c0fbf25 100644 --- a/source/texture.h +++ b/source/texture.h @@ -8,65 +8,20 @@ #include "gl.h" #include "pixelformat.h" #include "predicate.h" +#include "sampler.h" #include "resource.h" namespace Msp { namespace GL { -enum TextureFilter -{ - /// No filtering - NEAREST = GL_NEAREST, - - /// Bilinear filtering - LINEAR = GL_LINEAR, - - /// Mipmapping without filtering - NEAREST_MIPMAP_NEAREST = GL_NEAREST_MIPMAP_NEAREST, - - /// 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. +texture types and is not instantiable. For specifying images for textures, +see one of the dimensioned texture classes. + +A texture can consinst of a stack of images, called a mipmap. The dimensions +of each mipmap level are half that of the previous level. The mipmap stack +can be used for texture minification; see the Sampler class for details. */ class Texture: public Resource { @@ -83,6 +38,8 @@ protected: private: void init(); + unsigned get_levels() const; + void external_image(const std::string &); void filter(TextureFilter); void generate_mipmap(bool); @@ -91,6 +48,7 @@ protected: void max_anisotropy(float); void min_filter(TextureFilter); void mipmap_levels(unsigned); + void sampler(); void wrap(TextureWrap); void wrap_r(TextureWrap); void wrap_s(TextureWrap); @@ -99,14 +57,6 @@ protected: enum ParameterMask { - MIN_FILTER = 1, - MAG_FILTER = 2, - WRAP_S = 4, - WRAP_T = 8, - WRAP_R = 16, - COMPARE = 64, - COMPARE_FUNC = 128, - MAX_ANISOTROPY = 256, FORMAT_SWIZZLE = 512 }; @@ -114,23 +64,16 @@ protected: { NO_SWIZZLE, R_TO_LUMINANCE, - RG_TO_LUMINANCE_ALPHA + RG_TO_LUMINANCE_ALPHA, + RGB_TO_BGR }; unsigned id; GLenum target; PixelFormat ifmt; FormatSwizzle swizzle; - TextureFilter min_filter; - TextureFilter mag_filter; - float max_anisotropy; - TextureWrap wrap_s; - TextureWrap wrap_t; - TextureWrap wrap_r; bool auto_gen_mipmap; - bool compare; - Predicate cmp_func; - mutable int dirty_params; + Sampler default_sampler; static int swizzle_orders[]; @@ -141,31 +84,32 @@ public: ~Texture(); protected: - static DataType get_alloc_type(PixelFormat); void set_internal_format(PixelFormat); - PixelFormat get_upload_format(PixelFormat) const; - - void update_parameter(int) const; + PixelComponents get_upload_components(PixelComponents) const; + void apply_swizzle(); void set_parameter_i(GLenum, int) const; - void set_parameter_f(GLenum, float) const; + public: - void set_min_filter(TextureFilter); - void set_mag_filter(TextureFilter); + Sampler &get_default_sampler() { return default_sampler; } + const Sampler &get_default_sampler() const { return default_sampler; } + + DEPRECATED void set_min_filter(TextureFilter); + DEPRECATED void set_mag_filter(TextureFilter); /** Sets filter for both minification and magnification. Since mipmapping is not applicable to magnification, LINEAR is used instead. */ - void set_filter(TextureFilter); + DEPRECATED void set_filter(TextureFilter); DEPRECATED void set_mipmap_levels(unsigned) { } - void set_max_anisotropy(float); + DEPRECATED void set_max_anisotropy(float); /** Sets the wrapping mode for all coordinates. */ - void set_wrap(TextureWrap); + DEPRECATED void set_wrap(TextureWrap); - void set_wrap_s(TextureWrap); - void set_wrap_t(TextureWrap); - void set_wrap_r(TextureWrap); + DEPRECATED void set_wrap_s(TextureWrap); + DEPRECATED void set_wrap_t(TextureWrap); + DEPRECATED void set_wrap_r(TextureWrap); static bool can_generate_mipmap(); @@ -182,10 +126,10 @@ public: 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); + DEPRECATED void set_compare_enabled(bool); /** Sets the function to use for depth comparison. */ - void set_compare_func(Predicate); + DEPRECATED void set_compare_func(Predicate); /// Loads a Graphics::Image from a file and uploads it to the texture. virtual void load_image(const std::string &, bool srgb = false); @@ -215,9 +159,6 @@ public: virtual UInt64 get_data_size() const { return 0; } }; - -bool is_mipmapped(TextureFilter); - } // namespace GL } // namespace Msp