root/OpenSceneGraph/trunk/include/osg/Texture @ 10934

Revision 10934, 52.0 kB (checked in by robert, 5 years ago)

From Rob Radtke, "I recently ran into some issues trying to save/load a scene graph as a .ive file. The problems came about because the scene graph contained depth textures in it. I have attached a patch (against the current revision: 10919) that fixes the issues that I encountered. Both attachments contain the same patch--one is a .zip file that contains the modified files and the other is a text patch file. Here is a summary of the changes I made:

1) Add getShadowComparison() accessor function to osg::Texture class
2) Modify ReaderWriterTiff::writeTifStream() and _readColor() (in Image.cpp) to handle pixelFormat==GL_DEPTH_COMPONENT as if it were GL_LUMINANCE
3) Modify the Texture classes of the ive and osg plug-ins so that they save/load the following Texture members: _use_shadow_comparison, _shadow_compare_func and _shadow_texture_mode
"

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
2 *
3 * This library is open source and may be redistributed and/or modified under 
4 * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
5 * (at your option) any later version.  The full license is in LICENSE file
6 * included with this distribution, and on the openscenegraph.org website.
7 *
8 * This library is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 * OpenSceneGraph Public License for more details.
12*/
13
14#ifndef OSG_TEXTURE
15#define OSG_TEXTURE 1
16
17#include <osg/GL>
18#include <osg/Image>
19#include <osg/StateAttribute>
20#include <osg/GraphicsContext>
21#include <osg/ref_ptr>
22#include <osg/Vec4>
23#include <osg/Vec4d>
24#include <osg/buffered_value>
25#include <osg/GL2Extensions>
26
27#include <list>
28#include <map>
29
30// If not defined by gl.h use the definition found in:
31// http://oss.sgi.com/projects/ogl-sample/registry/EXT/texture_filter_anisotropic.txt
32#ifndef GL_TEXTURE_MAX_ANISOTROPY_EXT
33    #define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE
34#endif
35
36#ifndef GL_ARB_texture_compression
37    #define GL_COMPRESSED_ALPHA_ARB                 0x84E9
38    #define GL_COMPRESSED_LUMINANCE_ARB             0x84EA
39    #define GL_COMPRESSED_LUMINANCE_ALPHA_ARB       0x84EB
40    #define GL_COMPRESSED_INTENSITY_ARB             0x84EC
41    #define GL_COMPRESSED_RGB_ARB                   0x84ED
42    #define GL_COMPRESSED_RGBA_ARB                  0x84EE
43    #define GL_TEXTURE_COMPRESSION_HINT_ARB         0x84EF
44    #define GL_TEXTURE_COMPRESSED_ARB               0x86A1
45    #define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB   0x86A2
46    #define GL_COMPRESSED_TEXTURE_FORMATS_ARB       0x86A3
47#endif
48
49#ifndef GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB
50    #define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB    0x86A0
51#endif
52
53#ifndef GL_EXT_texture_compression_s3tc
54    #define GL_COMPRESSED_RGB_S3TC_DXT1_EXT         0x83F0
55    #define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT        0x83F1
56    #define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT        0x83F2
57    #define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT        0x83F3
58#endif
59
60#ifndef GL_ARB_INTERNAL_TEXTURE_FORMAT
61    #define GL_RGBA32F_ARB                           0x8814
62    #define GL_RGB32F_ARB                            0x8815
63    #define GL_ALPHA32F_ARB                          0x8816
64    #define GL_INTENSITY32F_ARB                      0x8817
65    #define GL_LUMINANCE32F_ARB                      0x8818
66    #define GL_LUMINANCE_ALPHA32F_ARB                0x8819
67    #define GL_RGBA16F_ARB                           0x881A
68    #define GL_RGB16F_ARB                            0x881B
69    #define GL_ALPHA16F_ARB                          0x881C
70    #define GL_INTENSITY16F_ARB                      0x881D
71    #define GL_LUMINANCE16F_ARB                      0x881E
72    #define GL_LUMINANCE_ALPHA16F_ARB                0x881F
73#endif
74
75#ifndef GL_ARB_PIXEL_DATA
76    #define GL_HALF_FLOAT_ARB                        0x140B
77#endif
78
79#ifndef GL_NV_texture_shader
80    #define GL_HILO_NV                              0x86F4
81    #define GL_DSDT_NV                              0x86F5
82    #define GL_DSDT_MAG_NV                          0x86F6
83    #define GL_DSDT_MAG_VIB_NV                      0x86F7
84    #define GL_HILO16_NV                            0x86F8
85    #define GL_SIGNED_HILO_NV                       0x86F9
86    #define GL_SIGNED_HILO16_NV                     0x86FA
87    #define GL_SIGNED_RGBA_NV                       0x86FB
88    #define GL_SIGNED_RGBA8_NV                      0x86FC
89    #define GL_SIGNED_RGB_NV                        0x86FE
90    #define GL_SIGNED_RGB8_NV                       0x86FF
91    #define GL_SIGNED_LUMINANCE_NV                  0x8701
92    #define GL_SIGNED_LUMINANCE8_NV                 0x8702
93    #define GL_SIGNED_LUMINANCE_ALPHA_NV            0x8703
94    #define GL_SIGNED_LUMINANCE8_ALPHA8_NV          0x8704
95    #define GL_SIGNED_ALPHA_NV                      0x8705
96    #define GL_SIGNED_ALPHA8_NV                     0x8706
97    #define GL_SIGNED_INTENSITY_NV                  0x8707
98    #define GL_SIGNED_INTENSITY8_NV                 0x8708
99    #define GL_DSDT8_NV                             0x8709
100    #define GL_DSDT8_MAG8_NV                        0x870A
101    #define GL_DSDT8_MAG8_INTENSITY8_NV             0x870B
102    #define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV         0x870C
103    #define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV       0x870D
104#endif
105
106#ifndef GL_NV_float_buffer
107    #define GL_FLOAT_R_NV                           0x8880
108    #define GL_FLOAT_RG_NV                          0x8881
109    #define GL_FLOAT_RGB_NV                         0x8882
110    #define GL_FLOAT_RGBA_NV                        0x8883
111    #define GL_FLOAT_R16_NV                         0x8884
112    #define GL_FLOAT_R32_NV                         0x8885
113    #define GL_FLOAT_RG16_NV                        0x8886
114    #define GL_FLOAT_RG32_NV                        0x8887
115    #define GL_FLOAT_RGB16_NV                       0x8888
116    #define GL_FLOAT_RGB32_NV                       0x8889
117    #define GL_FLOAT_RGBA16_NV                      0x888A
118    #define GL_FLOAT_RGBA32_NV                      0x888B
119#endif
120
121#ifndef GL_NV_half_float
122    #define GL_HALF_FLOAT_NV                        0x140B
123#endif
124
125#ifndef GL_ATI_texture_float
126    #define GL_RGBA_FLOAT32_ATI                     0x8814
127    #define GL_RGB_FLOAT32_ATI                      0x8815
128    #define GL_ALPHA_FLOAT32_ATI                    0x8816
129    #define GL_INTENSITY_FLOAT32_ATI                0x8817
130    #define GL_LUMINANCE_FLOAT32_ATI                0x8818
131    #define GL_LUMINANCE_ALPHA_FLOAT32_ATI          0x8819
132    #define GL_RGBA_FLOAT16_ATI                     0x881A
133    #define GL_RGB_FLOAT16_ATI                      0x881B
134    #define GL_ALPHA_FLOAT16_ATI                    0x881C
135    #define GL_INTENSITY_FLOAT16_ATI                0x881D
136    #define GL_LUMINANCE_FLOAT16_ATI                0x881E
137    #define GL_LUMINANCE_ALPHA_FLOAT16_ATI          0x881F
138#endif
139
140#ifndef GL_MIRRORED_REPEAT_IBM
141    #define GL_MIRRORED_REPEAT_IBM            0x8370
142#endif
143
144#ifndef GL_CLAMP_TO_EDGE
145    #define GL_CLAMP_TO_EDGE                  0x812F
146#endif
147
148#ifndef GL_CLAMP
149    #define GL_CLAMP                          0x2900 
150#endif
151
152#ifndef GL_CLAMP_TO_BORDER_ARB
153    #define GL_CLAMP_TO_BORDER_ARB            0x812D
154#endif
155
156#ifndef GL_INTENSITY
157    // OpenGL ES1 and ES2 doesn't provide GL_INTENSITY
158    #define GL_INTENSITY 0x8049
159#endif
160
161#ifndef GL_GENERATE_MIPMAP_SGIS
162    #define GL_GENERATE_MIPMAP_SGIS           0x8191
163    #define GL_GENERATE_MIPMAP_HINT_SGIS      0x8192
164#endif
165
166#ifndef GL_TEXTURE_3D
167    #define GL_TEXTURE_3D                     0x806F
168#endif
169
170#ifndef GL_TEXTURE_2D_ARRAY_EXT
171    #define GL_TEXTURE_2D_ARRAY_EXT           0x8C1A
172    #define GL_TEXTURE_2D_ARRAY_EXT                        0x8C1A
173    #define GL_PROXY_TEXTURE_2D_ARRAY_EXT                  0x8C1B
174    #define GL_TEXTURE_BINDING_2D_ARRAY_EXT                0x8C1D
175    #define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT                0x88FF
176    #define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT            0x884E
177    #define GL_SAMPLER_2D_ARRAY_EXT                        0x8DC1
178    #define GL_SAMPLER_2D_ARRAY_SHADOW_EXT                 0x8DC4
179    #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT    0x8CD4
180#endif
181
182#ifndef GL_TEXTURE_CUBE_MAP
183    #define GL_TEXTURE_CUBE_MAP             0x8513
184    #define GL_TEXTURE_BINDING_CUBE_MAP     0x8514
185    #define GL_TEXTURE_CUBE_MAP_POSITIVE_X  0x8515
186    #define GL_TEXTURE_CUBE_MAP_NEGATIVE_X  0x8516
187    #define GL_TEXTURE_CUBE_MAP_POSITIVE_Y  0x8517
188    #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y  0x8518
189    #define GL_TEXTURE_CUBE_MAP_POSITIVE_Z  0x8519
190    #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z  0x851A
191    #define GL_PROXY_TEXTURE_CUBE_MAP       0x851B
192    #define GL_MAX_CUBE_MAP_TEXTURE_SIZE    0x851C
193#endif
194
195#ifndef GL_TEXTURE_BINDING_3D
196    #define GL_TEXTURE_BINDING_3D             0x806A
197#endif
198
199#ifndef GL_DEPTH_TEXTURE_MODE_ARB
200    #define GL_DEPTH_TEXTURE_MODE_ARB         0x884B
201#endif
202
203#ifndef GL_TEXTURE_COMPARE_MODE_ARB
204    #define GL_TEXTURE_COMPARE_MODE_ARB       0x884C
205#endif
206#ifndef GL_TEXTURE_COMPARE_FUNC_ARB
207    #define GL_TEXTURE_COMPARE_FUNC_ARB       0x884D
208#endif
209#ifndef GL_COMPARE_R_TO_TEXTURE_ARB
210    #define GL_COMPARE_R_TO_TEXTURE_ARB       0x884E
211#endif
212
213#ifndef TEXTURE_COMPARE_FAIL_VALUE_ARB
214    #define TEXTURE_COMPARE_FAIL_VALUE_ARB    0x80BF
215#endif
216
217#if !defined( GL_MAX_TEXTURE_UNITS )
218    #define GL_MAX_TEXTURE_UNITS              0x84E2
219#endif
220
221#ifndef  GL_TEXTURE_DEPTH
222    #define GL_TEXTURE_DEPTH                  0x8071
223#endif
224
225// Integer teture extension as in http://www.opengl.org/registry/specs/EXT/texture_integer.txt
226#ifndef GL_EXT_texture_integer
227    #define GL_RGBA32UI_EXT                                    0x8D70
228    #define GL_RGB32UI_EXT                                     0x8D71
229    #define GL_ALPHA32UI_EXT                                   0x8D72
230    #define GL_INTENSITY32UI_EXT                               0x8D73
231    #define GL_LUMINANCE32UI_EXT                               0x8D74
232    #define GL_LUMINANCE_ALPHA32UI_EXT                         0x8D75
233
234    #define GL_RGBA16UI_EXT                                    0x8D76
235    #define GL_RGB16UI_EXT                                     0x8D77
236    #define GL_ALPHA16UI_EXT                                   0x8D78
237    #define GL_INTENSITY16UI_EXT                               0x8D79
238    #define GL_LUMINANCE16UI_EXT                               0x8D7A
239    #define GL_LUMINANCE_ALPHA16UI_EXT                         0x8D7B
240
241    #define GL_RGBA8UI_EXT                                     0x8D7C
242    #define GL_RGB8UI_EXT                                      0x8D7D
243    #define GL_ALPHA8UI_EXT                                    0x8D7E
244    #define GL_INTENSITY8UI_EXT                                0x8D7F
245    #define GL_LUMINANCE8UI_EXT                                0x8D80
246    #define GL_LUMINANCE_ALPHA8UI_EXT                          0x8D81
247
248    #define GL_RGBA32I_EXT                                     0x8D82
249    #define GL_RGB32I_EXT                                      0x8D83
250    #define GL_ALPHA32I_EXT                                    0x8D84
251    #define GL_INTENSITY32I_EXT                                0x8D85
252    #define GL_LUMINANCE32I_EXT                                0x8D86
253    #define GL_LUMINANCE_ALPHA32I_EXT                          0x8D87
254
255    #define GL_RGBA16I_EXT                                     0x8D88
256    #define GL_RGB16I_EXT                                      0x8D89
257    #define GL_ALPHA16I_EXT                                    0x8D8A
258    #define GL_INTENSITY16I_EXT                                0x8D8B
259    #define GL_LUMINANCE16I_EXT                                0x8D8C
260    #define GL_LUMINANCE_ALPHA16I_EXT                          0x8D8D
261
262    #define GL_RGBA8I_EXT                                      0x8D8E
263    #define GL_RGB8I_EXT                                       0x8D8F
264    #define GL_ALPHA8I_EXT                                     0x8D90
265    #define GL_INTENSITY8I_EXT                                 0x8D91
266    #define GL_LUMINANCE8I_EXT                                 0x8D92
267    #define GL_LUMINANCE_ALPHA8I_EXT                           0x8D93
268
269    #define GL_RED_INTEGER_EXT                                 0x8D94
270    #define GL_GREEN_INTEGER_EXT                               0x8D95
271    #define GL_BLUE_INTEGER_EXT                                0x8D96
272    #define GL_ALPHA_INTEGER_EXT                               0x8D97
273    #define GL_RGB_INTEGER_EXT                                 0x8D98
274    #define GL_RGBA_INTEGER_EXT                                0x8D99
275    #define GL_BGR_INTEGER_EXT                                 0x8D9A
276    #define GL_BGRA_INTEGER_EXT                                0x8D9B
277    #define GL_LUMINANCE_INTEGER_EXT                           0x8D9C
278    #define GL_LUMINANCE_ALPHA_INTEGER_EXT                     0x8D9D
279
280    #define GL_RGBA_INTEGER_MODE_EXT                           0x8D9E
281#endif
282
283namespace osg {
284
285
286/** Texture pure virtual base class that encapsulates OpenGl texture
287  * functionality common to the various types of OSG textures.
288*/
289class OSG_EXPORT Texture : public osg::StateAttribute
290{
291
292    public :
293   
294        static unsigned int s_numberTextureReusedLastInLastFrame;
295        static unsigned int s_numberNewTextureInLastFrame;
296        static unsigned int s_numberDeletedTextureInLastFrame;
297
298        Texture();
299
300        /** Copy constructor using CopyOp to manage deep vs shallow copy. */
301        Texture(const Texture& text,const CopyOp& copyop=CopyOp::SHALLOW_COPY);
302
303        virtual osg::Object* cloneType() const = 0;
304        virtual osg::Object* clone(const CopyOp& copyop) const = 0;
305        virtual bool isSameKindAs(const osg::Object* obj) const { return dynamic_cast<const Texture *>(obj)!=NULL; }
306        virtual const char* libraryName() const { return "osg"; }
307        virtual const char* className() const { return "Texture"; }
308
309        /** Fast alternative to dynamic_cast<> for determining if state attribute is a Texture.*/
310        virtual Texture* asTexture() { return this; }
311       
312        /** Fast alternative to dynamic_cast<> for determining if state attribute is a Texture.*/
313        virtual const Texture* asTexture() const { return this; }
314
315        virtual Type getType() const { return TEXTURE; }
316
317        virtual bool isTextureAttribute() const { return true; }
318
319        virtual GLenum getTextureTarget() const = 0;
320
321        virtual bool getModeUsage(StateAttribute::ModeUsage& usage) const
322        {
323            usage.usesTextureMode(getTextureTarget());
324            return true;
325        }
326
327        virtual int getTextureWidth() const { return 0; }
328        virtual int getTextureHeight() const { return 0; }
329        virtual int getTextureDepth() const { return 0; }
330
331        enum WrapParameter {
332            WRAP_S,
333            WRAP_T,
334            WRAP_R
335        };
336
337        enum WrapMode {
338            CLAMP  = GL_CLAMP,
339            CLAMP_TO_EDGE = GL_CLAMP_TO_EDGE,
340            CLAMP_TO_BORDER = GL_CLAMP_TO_BORDER_ARB,
341            REPEAT = GL_REPEAT,
342            MIRROR = GL_MIRRORED_REPEAT_IBM
343        };
344
345        /** Sets the texture wrap mode. */
346        void setWrap(WrapParameter which, WrapMode wrap);
347        /** Gets the texture wrap mode. */
348        WrapMode getWrap(WrapParameter which) const;
349
350
351        /** Sets the border color. Only used when wrap mode is CLAMP_TO_BORDER.
352         * The border color will be casted to the appropriate type to match the
353         * internal pixel format of the texture. */
354        void setBorderColor(const Vec4d& color) { _borderColor = color; dirtyTextureParameters(); }
355
356        /** Gets the border color. */
357        const Vec4d& getBorderColor() const { return _borderColor; }
358
359        /** Sets the border width. */
360        void setBorderWidth(GLint width) { _borderWidth = width; dirtyTextureParameters(); }
361       
362        GLint getBorderWidth() const { return _borderWidth; }
363
364        enum FilterParameter {
365            MIN_FILTER,
366            MAG_FILTER
367        };
368
369        enum FilterMode {
370            LINEAR                    = GL_LINEAR,
371            LINEAR_MIPMAP_LINEAR      = GL_LINEAR_MIPMAP_LINEAR,
372            LINEAR_MIPMAP_NEAREST     = GL_LINEAR_MIPMAP_NEAREST,
373            NEAREST                   = GL_NEAREST,
374            NEAREST_MIPMAP_LINEAR     = GL_NEAREST_MIPMAP_LINEAR,
375            NEAREST_MIPMAP_NEAREST    = GL_NEAREST_MIPMAP_NEAREST
376        };
377
378
379        /** Sets the texture filter mode. */
380        void setFilter(FilterParameter which, FilterMode filter);
381
382        /** Gets the texture filter mode. */
383        FilterMode getFilter(FilterParameter which) const;
384
385        /** Sets the maximum anisotropy value, default value is 1.0 for no
386          * anisotropic filtering. If hardware does not support anisotropic
387          * filtering, use normal filtering (equivalent to a max anisotropy
388          * value of 1.0. Valid range is 1.0f upwards.  The maximum value
389          * depends on the graphics system. */
390        void setMaxAnisotropy(float anis);
391       
392        /** Gets the maximum anisotropy value. */
393        inline float getMaxAnisotropy() const { return _maxAnisotropy; }
394
395        /** Sets the hardware mipmap generation hint. If enabled, it will
396          * only be used if supported in the graphics system. */
397        inline void setUseHardwareMipMapGeneration(bool useHardwareMipMapGeneration) { _useHardwareMipMapGeneration = useHardwareMipMapGeneration; }
398
399        /** Gets the hardware mipmap generation hint. */
400        inline bool getUseHardwareMipMapGeneration() const { return _useHardwareMipMapGeneration; }
401
402        /** Sets whether or not the apply() function will unreference the image
403          * data. If enabled, and the image data is only referenced by this
404          * Texture, apply() will delete the image data. */
405        inline void setUnRefImageDataAfterApply(bool flag) { _unrefImageDataAfterApply = flag; }
406       
407        /** Gets whether or not apply() unreferences image data. */
408        inline bool getUnRefImageDataAfterApply() const { return _unrefImageDataAfterApply; }
409
410        /** Sets whether to use client storage for the texture, if supported
411          * by the graphics system. Note: If enabled, and the graphics system
412          * supports it, the osg::Image(s) associated with this texture cannot
413          * be deleted, so the UnRefImageDataAfterApply flag would be ignored. */
414        inline void setClientStorageHint(bool flag) { _clientStorageHint = flag; }
415
416        /** Gets whether to use client storage for the texture. */
417        inline bool getClientStorageHint() const { return _clientStorageHint; }
418
419        /** Sets whether to force the texture to resize images that have dimensions
420          * that are not a power of two. If enabled, NPOT images will be resized,
421          * whether or not NPOT textures are supported by the hardware. If disabled,
422          * NPOT images will not be resized if supported by hardware. */
423        inline void setResizeNonPowerOfTwoHint(bool flag) { _resizeNonPowerOfTwoHint = flag; }
424
425        /** Gets whether texture will force non power to two images to be resized. */
426        inline bool getResizeNonPowerOfTwoHint() const { return _resizeNonPowerOfTwoHint; }
427
428        enum InternalFormatMode {
429            USE_IMAGE_DATA_FORMAT,
430            USE_USER_DEFINED_FORMAT,
431            USE_ARB_COMPRESSION,
432            USE_S3TC_DXT1_COMPRESSION,
433            USE_S3TC_DXT3_COMPRESSION,
434            USE_S3TC_DXT5_COMPRESSION
435        };
436
437        /** Sets the internal texture format mode. Note: If the texture format is
438          * USE_IMAGE_DATA_FORMAT, USE_ARB_COMPRESSION, or USE_S3TC_COMPRESSION,
439          * the internal format mode is set automatically and will overwrite the
440          * previous _internalFormat. */
441        inline void setInternalFormatMode(InternalFormatMode mode) { _internalFormatMode = mode; }
442
443        /** Gets the internal texture format mode. */
444        inline InternalFormatMode getInternalFormatMode() const { return _internalFormatMode; }
445
446        /** Sets the internal texture format. Implicitly sets the
447          * internalFormatMode to USE_USER_DEFINED_FORMAT.
448          * The corresponding internal format type will be computed. */
449        inline void setInternalFormat(GLint internalFormat)
450        {
451            _internalFormatMode = USE_USER_DEFINED_FORMAT;
452            _internalFormat = internalFormat;
453            computeInternalFormatType();
454        }
455
456
457        /** Gets the internal texture format. */
458        inline GLint getInternalFormat() const { if (_internalFormat==0) computeInternalFormat(); return _internalFormat; }
459       
460        /** Return true if the internal format is one of the compressed formats.*/
461        bool isCompressedInternalFormat() const;
462
463        /** Sets the external source image format, used as a fallback when no osg::Image is attached to provide the source image format. */
464        inline void setSourceFormat(GLenum sourceFormat) { _sourceFormat = sourceFormat; }
465
466        /** Gets the external source image format. */
467        inline GLenum getSourceFormat() const { return _sourceFormat; }
468
469        /** Sets the external source data type, used as a fallback when no osg::Image is attached to provide the source image format.*/
470        inline void setSourceType(GLenum sourceType) { _sourceType = sourceType; }
471
472        /** Gets the external source data type.*/
473        inline GLenum getSourceType() const { return _sourceType; }
474
475        /** Texture type determined by the internal texture format */
476        enum InternalFormatType{
477
478            //! default OpenGL format (clamped values to [0,1) or [0,255])
479            NORMALIZED = 0x0,
480
481            //! float values, Shader Model 3.0 (see ARB_texture_float)
482            FLOAT = 0x1,
483
484            //! Signed integer values (see EXT_texture_integer)
485            SIGNED_INTEGER = 0x2,
486
487            //! Unsigned integer value (see EXT_texture_integer)
488            UNSIGNED_INTEGER = 0x4
489        };
490       
491        /** Get the internal texture format type. */
492        inline InternalFormatType getInternalFormatType() const { return _internalFormatType; }
493       
494        class TextureObject;
495
496        /** Returns a pointer to the TextureBbject for the current context. */
497        inline TextureObject* getTextureObject(unsigned int contextID) const
498        {
499            return _textureObjectBuffer[contextID].get();
500        }
501
502        inline void setTextureObject(unsigned int contextID, TextureObject* to)
503        {
504            _textureObjectBuffer[contextID] = to;
505        }
506
507        /** Forces a recompile on next apply() of associated OpenGL texture
508          * objects. */
509        void dirtyTextureObject();
510
511        /** Returns true if the texture objects for all the required graphics
512          * contexts are loaded. */
513        bool areAllTextureObjectsLoaded() const;
514
515
516        /** Gets the dirty flag for the current contextID. */
517        inline unsigned int& getTextureParameterDirty(unsigned int contextID) const
518        {
519            return _texParametersDirtyList[contextID];
520        }
521
522
523        /** Force a reset on next apply() of associated OpenGL texture
524          * parameters. */
525        void dirtyTextureParameters();
526
527        /** Force a manual allocation of the mipmap levels on the next apply() call.
528          * User is responsible for filling the mipmap levels with valid data.
529          * The OpenGL's glGenerateMipmapEXT function is used to generate the mipmap levels.
530          * If glGenerateMipmapEXT is not supported or texture's internal format is not supported
531          * by the glGenerateMipmapEXT, then empty mipmap levels will
532          * be allocated manually. The mipmap levels are also allocated if a non-mipmapped
533          * min filter is used. */
534        void allocateMipmapLevels();
535
536
537        /** Sets GL_TEXTURE_COMPARE_MODE_ARB to GL_COMPARE_R_TO_TEXTURE_ARB
538          * See http://oss.sgi.com/projects/ogl-sample/registry/ARB/shadow.txt. */
539        void setShadowComparison(bool flag) { _use_shadow_comparison = flag; }
540        bool getShadowComparison() const { return _use_shadow_comparison; }
541       
542        enum ShadowCompareFunc {
543            NEVER = GL_NEVER,
544            LESS = GL_LESS,
545            EQUAL = GL_EQUAL,
546            LEQUAL = GL_LEQUAL,
547            GREATER = GL_GREATER,
548            NOTEQUAL = GL_NOTEQUAL,
549            GEQUAL = GL_GEQUAL,
550            ALWAYS = GL_ALWAYS
551        };
552
553        /** Sets shadow texture comparison function. */
554        void setShadowCompareFunc(ShadowCompareFunc func) { _shadow_compare_func = func; }
555        ShadowCompareFunc getShadowCompareFunc() const { return _shadow_compare_func; }
556
557        enum ShadowTextureMode {
558            LUMINANCE = GL_LUMINANCE,
559            INTENSITY = GL_INTENSITY,
560            ALPHA = GL_ALPHA
561        };
562
563        /** Sets shadow texture mode after comparison. */
564        void setShadowTextureMode(ShadowTextureMode mode) { _shadow_texture_mode = mode; }
565        ShadowTextureMode getShadowTextureMode() const { return _shadow_texture_mode; }
566
567        /** Sets the TEXTURE_COMPARE_FAIL_VALUE_ARB texture parameter. See
568          * http://oss.sgi.com/projects/ogl-sample/registry/ARB/shadow_ambient.txt. */
569        void setShadowAmbient(float shadow_ambient) { _shadow_ambient = shadow_ambient; }
570        float getShadowAmbient() const { return _shadow_ambient; }
571       
572
573        /** Sets the texture image for the specified face. */
574        virtual void setImage(unsigned int face, Image* image) = 0;
575
576        /** Gets the texture image for the specified face. */
577        virtual Image* getImage(unsigned int face) = 0;
578
579        /** Gets the const texture image for specified face. */
580        virtual const Image* getImage(unsigned int face) const = 0;
581
582        /** Gets the number of images that can be assigned to this Texture. */
583        virtual unsigned int getNumImages() const = 0;
584
585
586        /** Set the PBuffer graphics context to read from when using PBuffers for RenderToTexture.*/
587        void setReadPBuffer(GraphicsContext* context) { _readPBuffer = context; }
588
589        /** Get the PBuffer graphics context to read from when using PBuffers for RenderToTexture.*/
590        GraphicsContext* getReadPBuffer() { return _readPBuffer.get(); }
591
592        /** Get the const PBuffer graphics context to read from when using PBuffers for RenderToTexture.*/
593        const GraphicsContext* getReadPBuffer() const { return _readPBuffer.get(); }
594
595        /** Texture is a pure virtual base class, apply must be overridden. */
596        virtual void apply(State& state) const = 0;
597
598        /** Calls apply(state) to compile the texture. */
599        virtual void compileGLObjects(State& state) const;
600
601        /** Resize any per context GLObject buffers to specified size. */
602        virtual void resizeGLObjectBuffers(unsigned int maxSize);
603
604        /** If State is non-zero, this function releases OpenGL objects for
605          * the specified graphics context. Otherwise, releases OpenGL objects
606          * for all graphics contexts. */
607        virtual void releaseGLObjects(State* state=0) const;
608
609        /** Encapsulates queries of extension availability, obtains extension
610          * function pointers, and provides convenience wrappers for
611          * calling extension functions. */       
612        class OSG_EXPORT Extensions : public osg::Referenced
613        {
614            public:
615                Extensions(unsigned int contextID);
616
617                Extensions(const Extensions& rhs);
618               
619                void lowestCommonDenominator(const Extensions& rhs);
620               
621                void setupGLExtensions(unsigned int contextID);
622
623                void setMultiTexturingSupported(bool flag) { _isMultiTexturingSupported=flag; }
624                bool isMultiTexturingSupported() const { return _isMultiTexturingSupported; }
625
626                void setTextureFilterAnisotropicSupported(bool flag) { _isTextureFilterAnisotropicSupported=flag; }
627                bool isTextureFilterAnisotropicSupported() const { return _isTextureFilterAnisotropicSupported; }
628               
629                void setTextureCompressionARBSupported(bool flag) { _isTextureCompressionARBSupported=flag; }
630                bool isTextureCompressionARBSupported() const { return _isTextureCompressionARBSupported; }
631
632                void setTextureCompressionS3TCSupported(bool flag) { _isTextureCompressionS3TCSupported=flag; }
633                bool isTextureCompressionS3TCSupported() const { return _isTextureCompressionS3TCSupported; }
634
635                void setTextureMirroredRepeatSupported(bool flag) { _isTextureMirroredRepeatSupported=flag; }
636                bool isTextureMirroredRepeatSupported() const { return _isTextureMirroredRepeatSupported; }
637
638                void setTextureEdgeClampSupported(bool flag) { _isTextureEdgeClampSupported=flag; }
639                bool isTextureEdgeClampSupported() const { return _isTextureEdgeClampSupported; }
640
641                void setTextureBorderClampSupported(bool flag) { _isTextureBorderClampSupported=flag; }
642                bool isTextureBorderClampSupported() const { return _isTextureBorderClampSupported; }
643
644                void setGenerateMipMapSupported(bool flag) { _isGenerateMipMapSupported=flag; }
645                bool isGenerateMipMapSupported() const { return _isGenerateMipMapSupported; }
646
647                void setShadowSupported(bool flag) { _isShadowSupported = flag; }
648                bool isShadowSupported() const { return _isShadowSupported; }
649
650                void setShadowAmbientSupported(bool flag) { _isShadowAmbientSupported = flag; }
651                bool isShadowAmbientSupported() const { return _isShadowAmbientSupported; }
652
653                void setTextureMaxLevelSupported(bool flag) { _isTextureMaxLevelSupported = flag; }
654                bool isTextureMaxLevelSupported() const { return _isTextureMaxLevelSupported; }
655
656                void setMaxTextureSize(GLint maxsize) { _maxTextureSize=maxsize; }
657                GLint maxTextureSize() const { return _maxTextureSize; }
658
659                void setNumTextureUnits(GLint nunits ) { _numTextureUnits=nunits; }
660                GLint numTextureUnits() const { return _numTextureUnits; }
661
662                bool isCompressedTexImage2DSupported() const { return _glCompressedTexImage2D!=0; }
663                bool isCompressedTexSubImage2DSupported() const { return _glCompressedTexSubImage2D!=0; }
664               
665                void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data) const;
666                void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei type, const GLvoid *data) const;
667                void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *data) const;
668
669                bool isClientStorageSupported() const { return _isClientStorageSupported; }
670
671                bool isNonPowerOfTwoTextureSupported(GLenum filter) const
672                {
673                    return (filter==GL_LINEAR || filter==GL_NEAREST) ?
674                            _isNonPowerOfTwoTextureNonMipMappedSupported :
675                            _isNonPowerOfTwoTextureMipMappedSupported;
676                }
677
678                void setTextureIntegerSupported(bool flag) { _isTextureIntegerEXTSupported=flag; }
679                bool isTextureIntegerSupported() const { return _isTextureIntegerEXTSupported; }
680
681                void glTexParameterIiv(GLenum target, GLenum pname, const GLint* data) const;
682                void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint* data) const;
683
684            protected:
685
686                ~Extensions() {}
687               
688                bool    _isMultiTexturingSupported;
689                bool    _isTextureFilterAnisotropicSupported;
690                bool    _isTextureCompressionARBSupported;
691                bool    _isTextureCompressionS3TCSupported;
692                bool    _isTextureMirroredRepeatSupported;
693                bool    _isTextureEdgeClampSupported;
694                bool    _isTextureBorderClampSupported;
695                bool    _isGenerateMipMapSupported;
696                bool    _isShadowSupported;
697                bool    _isShadowAmbientSupported;
698                bool    _isClientStorageSupported;
699                bool    _isNonPowerOfTwoTextureMipMappedSupported;
700                bool    _isNonPowerOfTwoTextureNonMipMappedSupported;
701                bool    _isTextureIntegerEXTSupported;
702                bool    _isTextureMaxLevelSupported;
703
704                GLint   _maxTextureSize;
705                GLint   _numTextureUnits;
706
707                typedef void (APIENTRY * CompressedTexImage2DArbProc) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
708                typedef void (APIENTRY * CompressedTexSubImage2DArbProc) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
709                typedef void (APIENTRY * GetCompressedTexImageArbProc) (GLenum target, GLint level, GLvoid *data);
710                typedef void (APIENTRY * TexParameterIivProc)(GLenum target, GLenum pname, const GLint* data);
711                typedef void (APIENTRY * TexParameterIuivProc)(GLenum target, GLenum pname, const GLuint* data);
712
713                CompressedTexImage2DArbProc     _glCompressedTexImage2D;
714                CompressedTexSubImage2DArbProc  _glCompressedTexSubImage2D;
715                GetCompressedTexImageArbProc    _glGetCompressedTexImage;
716                TexParameterIivProc             _glTexParameterIiv;
717                TexParameterIuivProc            _glTexParameterIuiv;
718
719        };
720       
721        /** Gets the extension for the specified context. Creates the
722          * Extensions object for that context if it doesn't exist.
723          * Returns NULL if the Extensions object for the context doesn't
724          * exist and the createIfNotInitalized flag is false. */
725        static Extensions* getExtensions(unsigned int contextID,bool createIfNotInitalized);
726
727        /** Overrides Extensions objects across graphics contexts. Typically
728          * used to ensure the same lowest common denominator of extensions
729          * on systems with different graphics pipes. */
730        static void setExtensions(unsigned int contextID,Extensions* extensions);
731
732        /** Determine whether the given internalFormat is a compressed
733          * image format. */
734        static bool isCompressedInternalFormat(GLint internalFormat);
735       
736        /** Determine the size of a compressed image, given the internalFormat,
737          * the width, the height, and the depth of the image. The block size
738          * and the size are output parameters. */
739        static void getCompressedSize(GLenum internalFormat, GLint width, GLint height, GLint depth, GLint& blockSize, GLint& size);
740
741
742        /** Helper method. Creates the texture, but doesn't set or use a
743          * texture binding. Note: Don't call this method directly unless
744          * you're implementing a subload callback. */
745        void applyTexImage2D_load(State& state, GLenum target, const Image* image, GLsizei width, GLsizei height,GLsizei numMipmapLevels) const;
746       
747        /** Helper method. Subloads images into the texture, but doesn't set
748          * or use a texture binding. Note: Don't call this method directly
749          * unless you're implementing a subload callback. */
750        void applyTexImage2D_subload(State& state, GLenum target, const Image* image, GLsizei width, GLsizei height, GLint inInternalFormat, GLsizei numMipmapLevels) const;
751
752        /** Returned by mipmapBeforeTexImage() to indicate what
753          * mipmapAfterTexImage() should do */
754        enum GenerateMipmapMode
755        {
756            GENERATE_MIPMAP_NONE,
757            GENERATE_MIPMAP,
758            GENERATE_MIPMAP_TEX_PARAMETER
759        };
760
761    protected :
762
763        virtual ~Texture();
764
765        virtual void computeInternalFormat() const = 0;
766       
767        void computeInternalFormatWithImage(const osg::Image& image) const;
768
769        void computeRequiredTextureDimensions(State& state, const osg::Image& image,GLsizei& width, GLsizei& height,GLsizei& numMipmapLevels) const;
770       
771        void computeInternalFormatType() const;
772
773        /** Helper method. Sets texture parameters. */
774        void applyTexParameters(GLenum target, State& state) const;
775
776        /** Returns true if _useHardwareMipMapGeneration is true and either
777          * glGenerateMipmapEXT() or GL_GENERATE_MIPMAP_SGIS are supported. */
778        bool isHardwareMipmapGenerationEnabled(const State& state) const;
779
780        /** Helper methods to be called before and after calling
781          * gl[Compressed][Copy]Tex[Sub]Image2D to handle generating mipmaps. */
782        GenerateMipmapMode mipmapBeforeTexImage(const State& state, bool hardwareMipmapOn) const;
783        void mipmapAfterTexImage(State& state, GenerateMipmapMode beforeResult) const;
784
785        /** Helper method to generate mipmap levels by calling of glGenerateMipmapEXT.
786          * If it is not supported, then call the virtual allocateMipmap() method */
787        void generateMipmap(State& state) const;
788
789        /** Allocate mipmap levels of the texture by subsequent calling of glTexImage* function. */
790        virtual void allocateMipmap(State& state) const = 0;
791
792        /** Returns -1 if *this < *rhs, 0 if *this==*rhs, 1 if *this>*rhs. */
793        int compareTexture(const Texture& rhs) const;
794
795        /** Returns -1 if *this < *rhs, 0 if *this==*rhs, 1 if *this>*rhs. */
796        int compareTextureObjects(const Texture& rhs) const;
797
798        typedef buffered_value<unsigned int> TexParameterDirtyList;
799        mutable TexParameterDirtyList _texParametersDirtyList;
800        mutable TexParameterDirtyList _texMipmapGenerationDirtyList;
801
802        WrapMode _wrap_s;
803        WrapMode _wrap_t;
804        WrapMode _wrap_r;
805
806        FilterMode      _min_filter;
807        FilterMode      _mag_filter;
808        float           _maxAnisotropy;
809        bool            _useHardwareMipMapGeneration;
810        bool            _unrefImageDataAfterApply;
811        bool            _clientStorageHint;
812        bool            _resizeNonPowerOfTwoHint;
813
814        Vec4d           _borderColor;
815        GLint           _borderWidth;
816
817        InternalFormatMode          _internalFormatMode;
818        mutable InternalFormatType  _internalFormatType;
819        mutable GLint       _internalFormat;
820        mutable GLenum      _sourceFormat;
821        mutable GLenum      _sourceType;
822
823        bool                _use_shadow_comparison;
824        ShadowCompareFunc   _shadow_compare_func;
825        ShadowTextureMode   _shadow_texture_mode;
826        float               _shadow_ambient;
827
828    public:
829
830        struct OSG_EXPORT TextureProfile
831        {
832            inline TextureProfile(GLenum target):
833                _target(target),
834                _numMipmapLevels(0),
835                _internalFormat(0),
836                _width(0),
837                _height(0),
838                _depth(0),
839                _border(0),
840                _size(0) {}
841
842            inline TextureProfile(GLenum    target,
843                                 GLint     numMipmapLevels,
844                                 GLenum    internalFormat,
845                                 GLsizei   width,
846                                 GLsizei   height,
847                                 GLsizei   depth,
848                                 GLint     border):
849                _target(target),
850                _numMipmapLevels(numMipmapLevels),
851                _internalFormat(internalFormat),
852                _width(width),
853                _height(height),
854                _depth(depth),
855                _border(border),
856                _size(0) { computeSize(); }
857
858
859            #define LESSTHAN(A,B) if (A<B) return true; if (B<A) return false;
860            #define FINALLESSTHAN(A,B) return (A<B);
861
862            bool operator < (const TextureProfile& rhs) const
863            {
864                LESSTHAN(_size,rhs._size);
865                LESSTHAN(_target,rhs._target);
866                LESSTHAN(_numMipmapLevels,rhs._numMipmapLevels);
867                LESSTHAN(_internalFormat,rhs._internalFormat);
868                LESSTHAN(_width,rhs._width);
869                LESSTHAN(_height,rhs._height);
870                LESSTHAN(_depth,rhs._depth);
871                FINALLESSTHAN(_border, rhs._border);
872            }
873
874            bool operator == (const TextureProfile& rhs) const
875            {
876                return _target == rhs._target &&
877                       _numMipmapLevels == rhs._numMipmapLevels &&
878                       _internalFormat == rhs._internalFormat &&
879                       _width == rhs._width &&
880                       _height == rhs._height &&
881                       _depth == rhs._depth &&
882                       _border == rhs._border;
883            }
884
885            inline void set(GLint numMipmapLevels,
886                            GLenum    internalFormat,
887                            GLsizei   width,
888                            GLsizei   height,
889                            GLsizei   depth,
890                            GLint     border)
891            {
892                _numMipmapLevels = numMipmapLevels;
893                _internalFormat = internalFormat;
894                _width = width;
895                _height = height;
896                _depth = depth;
897                _border = border;
898            }
899
900            inline bool match(GLenum    target,
901                       GLint     numMipmapLevels,
902                       GLenum    internalFormat,
903                       GLsizei   width,
904                       GLsizei   height,
905                       GLsizei   depth,
906                       GLint     border)
907            {
908                return (_target == target) &&
909                       (_numMipmapLevels == numMipmapLevels) &&
910                       (_internalFormat == internalFormat) &&
911                       (_width == width) &&
912                       (_height == height) &&
913                       (_depth == depth) &&
914                       (_border == border);
915            }
916
917            void computeSize();
918
919            GLenum       _target;
920            GLint        _numMipmapLevels;
921            GLenum       _internalFormat;
922            GLsizei      _width;
923            GLsizei      _height;
924            GLsizei      _depth;
925            GLint        _border;
926            unsigned int _size;
927        };
928
929        // forward declare
930        class TextureObjectSet;
931        class TextureObjectManager;
932
933        class OSG_EXPORT TextureObject : public osg::Referenced
934        {
935        public:
936
937            inline TextureObject(Texture* texture, GLuint id, GLenum target):
938                _id(id),
939                _profile(target),
940                _set(0),
941                _previous(0),
942                _next(0),
943                _texture(texture),
944                _allocated(false),
945                _timeStamp(0) {}
946
947            inline TextureObject(Texture* texture, GLuint id, const TextureProfile& profile):
948                _id(id),
949                _profile(profile),
950                _set(0),
951                _previous(0),
952                _next(0),
953                _texture(texture),
954                _allocated(false),
955                _timeStamp(0) {}
956
957            inline TextureObject(Texture* texture,
958                          GLuint    id,
959                          GLenum    target,
960                          GLint     numMipmapLevels,
961                          GLenum    internalFormat,
962                          GLsizei   width,
963                          GLsizei   height,
964                          GLsizei   depth,
965                          GLint     border):
966                _id(id),
967                _profile(target,numMipmapLevels,internalFormat,width,height,depth,border),
968                _set(0),
969                _previous(0),
970                _next(0),
971                _texture(texture),
972                _allocated(false),
973                _timeStamp(0) {}
974
975            inline bool match(GLenum    target,
976                       GLint     numMipmapLevels,
977                       GLenum    internalFormat,
978                       GLsizei   width,
979                       GLsizei   height,
980                       GLsizei   depth,
981                       GLint     border)
982            {
983                return isReusable() &&
984                       _profile.match(target,numMipmapLevels,internalFormat,width,height,depth,border);
985            }
986
987
988            void bind();
989
990            inline GLenum id() const { return _id; }
991            inline GLenum target() const { return _profile._target; }
992
993            inline unsigned int size() const { return _profile._size; }
994
995            inline void setTexture(Texture* texture) { _texture = texture; }
996            inline Texture* getTexture() const { return _texture; }
997
998            inline void setTimeStamp(double timestamp) { _timeStamp = timestamp; }
999            inline double getTimeStamp() const { return _timeStamp; }
1000
1001            inline void setAllocated(bool allocated=true) { _allocated = allocated; }
1002
1003            void setAllocated(GLint     numMipmapLevels,
1004                              GLenum    internalFormat,
1005                              GLsizei   width,
1006                              GLsizei   height,
1007                              GLsizei   depth,
1008                              GLint     border);
1009
1010            inline bool isAllocated() const { return _allocated; }
1011
1012            inline bool isReusable() const { return _allocated && _profile._width!=0; }
1013
1014
1015            GLuint              _id;
1016            TextureProfile      _profile;
1017            TextureObjectSet*   _set;
1018            TextureObject*      _previous;
1019            TextureObject*      _next;
1020            Texture*            _texture;
1021            bool                _allocated;
1022            unsigned int        _frameLastUsed;
1023            double              _timeStamp;
1024
1025        protected:
1026            virtual ~TextureObject();
1027
1028        };
1029
1030        typedef std::list< ref_ptr<TextureObject> > TextureObjectList;
1031
1032        class OSG_EXPORT TextureObjectSet : public Referenced
1033        {
1034        public:
1035            TextureObjectSet(TextureObjectManager* parent, const TextureProfile& profile);
1036
1037            void handlePendingOrphandedTextureObjects();
1038
1039            void deleteAllTextureObjects();
1040            void discardAllTextureObjects();
1041            void flushAllDeletedTextureObjects();
1042            void discardAllDeletedTextureObjects();
1043            void flushDeletedTextureObjects(double currentTime, double& availableTime);
1044
1045            TextureObject* takeFromOrphans(Texture* texture);
1046            TextureObject* takeOrGenerate(Texture* texture);
1047            void moveToBack(TextureObject* to);
1048            void addToBack(TextureObject* to);
1049            void orphan(TextureObject* to);
1050            void remove(TextureObject* to);
1051            void moveToSet(TextureObject* to, TextureObjectSet* set);
1052
1053            unsigned int size() const { return _profile._size * _numOfTextureObjects; }
1054
1055            bool makeSpace(unsigned int& size);
1056
1057            bool checkConsistency() const;
1058
1059            TextureObjectManager* getParent() { return _parent; }
1060
1061        protected:
1062
1063            virtual ~TextureObjectSet();
1064
1065            OpenThreads::Mutex  _mutex;
1066
1067            TextureObjectManager*       _parent;
1068            unsigned int                _contextID;
1069            TextureProfile              _profile;
1070            unsigned int                _numOfTextureObjects;
1071            TextureObjectList           _orphanedTextureObjects;
1072            TextureObjectList           _pendingOrphanedTextureObjects;
1073
1074            TextureObject*              _head;
1075            TextureObject*              _tail;
1076
1077        };
1078
1079        class OSG_EXPORT TextureObjectManager : public osg::Referenced
1080        {
1081        public:
1082            TextureObjectManager(unsigned int contextID);
1083
1084            unsigned int getContextID() const { return _contextID; }
1085
1086
1087
1088            void setNumberActiveTextureObjects(unsigned int size) { _numActiveTextureObjects = size; }
1089            unsigned int& getNumberActiveTextureObjects() { return _numActiveTextureObjects; }
1090            unsigned int getNumberActiveTextureObjects() const { return _numActiveTextureObjects; }
1091
1092            void setNumberOrphanedTextureObjects(unsigned int size) { _numOrphanedTextureObjects = size; }
1093            unsigned int& getNumberOrphanedTextureObjects() { return _numOrphanedTextureObjects; }
1094            unsigned int getNumberOrphanedTextureObjects() const { return _numOrphanedTextureObjects; }
1095
1096            void setCurrTexturePoolSize(unsigned int size) { _currTexturePoolSize = size; }
1097            unsigned int& getCurrTexturePoolSize() { return _currTexturePoolSize; }
1098            unsigned int getCurrTexturePoolSize() const { return _currTexturePoolSize; }
1099
1100            void setMaxTexturePoolSize(unsigned int size);
1101            unsigned int getMaxTexturePoolSize() const { return _maxTexturePoolSize; }
1102
1103            bool hasSpace(unsigned int size) const { return (_currTexturePoolSize+size)<=_maxTexturePoolSize; }
1104            bool makeSpace(unsigned int size);
1105
1106            TextureObject* generateTextureObject(const Texture* texture, GLenum target);
1107            TextureObject* generateTextureObject(const Texture* texture,
1108                                                        GLenum    target,
1109                                                        GLint     numMipmapLevels,
1110                                                        GLenum    internalFormat,
1111                                                        GLsizei   width,
1112                                                        GLsizei   height,
1113                                                        GLsizei   depth,
1114                                                        GLint     border);
1115            void handlePendingOrphandedTextureObjects();
1116            void deleteAllTextureObjects();
1117            void discardAllTextureObjects();
1118            void flushAllDeletedTextureObjects();
1119            void discardAllDeletedTextureObjects();
1120            void flushDeletedTextureObjects(double currentTime, double& availableTime);
1121            void releaseTextureObject(TextureObject* to);
1122
1123            TextureObjectSet* getTextureObjectSet(const TextureProfile& profile);
1124
1125            void newFrame(osg::FrameStamp* fs);
1126            void resetStats();
1127            void reportStats();
1128
1129            unsigned int& getFrameNumber() { return _frameNumber; }
1130            unsigned int& getNumberFrames() { return _numFrames; }
1131
1132            unsigned int& getNumberDeleted() { return _numDeleted; }
1133            double& getDeleteTime() { return _deleteTime; }
1134
1135            unsigned int& getNumberGenerated() { return _numGenerated; }
1136            double& getGenerateTime() { return _generateTime; }
1137
1138            unsigned int& getNumberApplied() { return _numApplied; }
1139            double& getApplyTime() { return _applyTime; }
1140
1141
1142        protected:
1143
1144            typedef std::map< TextureProfile, osg::ref_ptr<TextureObjectSet> > TextureSetMap;
1145            unsigned int        _contextID;
1146            unsigned int        _numActiveTextureObjects;
1147            unsigned int        _numOrphanedTextureObjects;
1148            unsigned int        _currTexturePoolSize;
1149            unsigned int        _maxTexturePoolSize;
1150            TextureSetMap       _textureSetMap;
1151
1152            unsigned int        _frameNumber;
1153
1154            unsigned int        _numFrames;
1155            unsigned int        _numDeleted;
1156            double              _deleteTime;
1157
1158            unsigned int        _numGenerated;
1159            double              _generateTime;
1160
1161            unsigned int        _numApplied;
1162            double              _applyTime;
1163
1164        };
1165
1166        static osg::ref_ptr<Texture::TextureObjectManager>&  getTextureObjectManager(unsigned int contextID);
1167
1168        static TextureObject* generateTextureObject(const Texture* texture, unsigned int contextID,GLenum target);
1169
1170        static TextureObject* generateTextureObject(const Texture* texture,
1171                                                     unsigned int contextID,
1172                                                     GLenum    target,
1173                                                     GLint     numMipmapLevels,
1174                                                     GLenum    internalFormat,
1175                                                     GLsizei   width,
1176                                                     GLsizei   height,
1177                                                     GLsizei   depth,
1178                                                     GLint     border);
1179
1180
1181        /** Set the minimum number of texture objects to retain in the deleted display list cache. */
1182        static void setMinimumNumberOfTextureObjectsToRetainInCache(unsigned int minimum);
1183
1184        /** Get the minimum number of display lists to retain in the deleted display list cache. */
1185        static unsigned int getMinimumNumberOfTextureObjectsToRetainInCache();
1186
1187        static void deleteAllTextureObjects(unsigned int contextID);
1188        static void discardAllTextureObjects(unsigned int contextID);
1189        static void flushAllDeletedTextureObjects(unsigned int contextID);
1190        static void discardAllDeletedTextureObjects(unsigned int contextID);
1191        static void flushDeletedTextureObjects(unsigned int contextID,double currentTime, double& availableTime);
1192        static void releaseTextureObject(unsigned int contextID, TextureObject* to);
1193
1194    protected:
1195
1196        typedef buffered_object< ref_ptr<TextureObject> >  TextureObjectBuffer;
1197        mutable TextureObjectBuffer         _textureObjectBuffer;
1198        mutable ref_ptr<GraphicsContext>    _readPBuffer;
1199
1200};
1201
1202}
1203
1204#endif
Note: See TracBrowser for help on using the browser.