]> git.tdb.fi Git - libs/gl.git/blob - source/core/texture.h
Add push_back_nocopy to NodeContainer for clarity
[libs/gl.git] / source / core / texture.h
1 #ifndef MSP_GL_TEXTURE_H_
2 #define MSP_GL_TEXTURE_H_
3
4 #include <msp/core/attributes.h>
5 #include <msp/datafile/objectloader.h>
6 #include <msp/graphics/image.h>
7 #include "datatype.h"
8 #include "gl.h"
9 #include "pixelformat.h"
10 #include "predicate.h"
11 #include "sampler.h"
12 #include "resource.h"
13
14 namespace Msp {
15 namespace GL {
16
17 /**
18 Base class for textures.  This class only defines operations common for all
19 texture types and is not instantiable.  For specifying images for textures,
20 see one of the dimensioned texture classes.
21
22 A texture can consinst of a stack of images, called a mipmap.  The dimensions
23 of each mipmap level are half that of the previous level.  The mipmap stack
24 can be used for texture minification; see the Sampler class for details.
25 */
26 class Texture: public Resource
27 {
28 protected:
29         class Loader: public DataFile::CollectionObjectLoader<Texture>
30         {
31         protected:
32                 unsigned levels;
33
34         public:
35                 Loader(Texture &);
36                 Loader(Texture &, Collection &);
37         private:
38                 void init();
39
40                 unsigned get_levels() const;
41         protected:
42                 void load_external_image(Graphics::Image &, const std::string &);
43
44         private:
45                 void external_image(const std::string &);
46                 void external_image_srgb(const std::string &);
47                 void external_image_common(const std::string &);
48                 void filter(TextureFilter);
49                 void generate_mipmap(bool);
50                 void image_data(const std::string &);
51                 void mag_filter(TextureFilter);
52                 void max_anisotropy(float);
53                 void min_filter(TextureFilter);
54                 void mipmap_levels(unsigned);
55                 void sampler();
56                 void wrap(TextureWrap);
57                 void wrap_r(TextureWrap);
58                 void wrap_s(TextureWrap);
59                 void wrap_t(TextureWrap);
60         };
61
62         enum ParameterMask
63         {
64                 FORMAT_SWIZZLE = 512
65         };
66
67         enum FormatSwizzle
68         {
69                 NO_SWIZZLE,
70                 R_TO_LUMINANCE,
71                 RG_TO_LUMINANCE_ALPHA,
72                 RGB_TO_BGR
73         };
74
75         unsigned id;
76         GLenum target;
77         PixelFormat format;
78         PixelFormat storage_fmt;
79         FormatSwizzle swizzle;
80         bool use_srgb_format;
81         bool auto_gen_mipmap;
82         Sampler default_sampler;
83
84         static int swizzle_orders[];
85
86         Texture(GLenum, ResourceManager * = 0);
87         Texture(const Texture &);
88         Texture &operator=(const Texture &);
89 public:
90         ~Texture();
91
92 protected:
93         void set_format(PixelFormat);
94         void apply_swizzle();
95         void set_parameter_i(GLenum, int) const;
96
97 public:
98         Sampler &get_default_sampler() { return default_sampler; }
99         const Sampler &get_default_sampler() const { return default_sampler; }
100
101         DEPRECATED void set_min_filter(TextureFilter);
102         DEPRECATED void set_mag_filter(TextureFilter);
103
104         /** Sets filter for both minification and magnification.  Since mipmapping
105         is not applicable to magnification, LINEAR is used instead. */
106         DEPRECATED void set_filter(TextureFilter);
107
108         DEPRECATED void set_mipmap_levels(unsigned) { }
109
110         DEPRECATED void set_max_anisotropy(float);
111
112         /** Sets the wrapping mode for all coordinates. */
113         DEPRECATED void set_wrap(TextureWrap);
114
115         DEPRECATED void set_wrap_s(TextureWrap);
116         DEPRECATED void set_wrap_t(TextureWrap);
117         DEPRECATED void set_wrap_r(TextureWrap);
118
119         static bool can_generate_mipmap();
120
121         void generate_mipmap();
122
123         /** Sets automatic mipmap generation.  If enabled, mipmaps are generated
124         when a texture image is uploaded. */
125         void set_auto_generate_mipmap(bool);
126
127         /// Deprecated.  Use set_auto_generate_mipmap instead.
128         DEPRECATED void set_generate_mipmap(bool g) { set_auto_generate_mipmap(g); }
129
130         /** Sets depth texture comparison.  Has no effect on other formats.  When
131         comparison is enabled, the third component of the texture coordinate is
132         compared against the texel value, and the result is returned as the texture
133         sample. */
134         DEPRECATED void set_compare_enabled(bool);
135
136         /** Sets the function to use for depth comparison. */
137         DEPRECATED void set_compare_func(Predicate);
138
139         /// Loads a Graphics::Image from a file and uploads it to the texture.
140         virtual void load_image(const std::string &, unsigned = 0);
141
142         DEPRECATED void load_image(const std::string &, bool srgb);
143
144         /** Uploads an image to the texture.  If storage has not been defined, it
145         will be set to match the image.  Otherwise the image must be compatible
146         with the defined storage.  Semantics depend on the type of texture.  */
147         virtual void image(const Graphics::Image &, unsigned = 0) = 0;
148
149         DEPRECATED void image(const Graphics::Image &, bool srgb);
150
151         GLenum get_target() const { return target; }
152         unsigned get_id() const { return id; }
153
154         void bind() const { bind_to(0); }
155         void bind_to(unsigned) const;
156
157         static const Texture *current(unsigned = 0);
158         static void unbind() { unbind_from(0); }
159         static void unbind_from(unsigned);
160
161         virtual UInt64 get_data_size() const { return 0; }
162 };
163
164 } // namespace GL
165 } // namespace Msp
166
167 #endif