1 /****************************************************************************
2 **
3 ** Copyright (C) 2015 Klaralvdalens Datakonsult AB (KDAB).
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the Qt3D module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 3 requirements
23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24 **
25 ** GNU General Public License Usage
26 ** Alternatively, this file may be used under the terms of the GNU
27 ** General Public License version 2.0 or (at your option) the GNU General
28 ** Public license version 3 or any later version approved by the KDE Free
29 ** Qt Foundation. The licenses are as published by the Free Software
30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31 ** included in the packaging of this file. Please review the following
32 ** information to ensure the GNU General Public License requirements will
33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34 ** https://www.gnu.org/licenses/gpl-3.0.html.
35 **
36 ** $QT_END_LICENSE$
37 **
38 ****************************************************************************/
39 
40 #ifndef QT3DRENDER_QABSTRACTTEXTURE_H
41 #define QT3DRENDER_QABSTRACTTEXTURE_H
42 
43 #include <Qt3DRender/qtextureimagedata.h>
44 #include <Qt3DRender/qt3drender_global.h>
45 #include <Qt3DCore/qnode.h>
46 
47 QT_BEGIN_NAMESPACE
48 
49 namespace Qt3DRender {
50 
51 class QAbstractTexturePrivate;
52 class QTextureWrapMode;
53 class QAbstractTextureImage;
54 class QTextureGenerator;
55 class QTextureDataUpdate;
56 typedef QSharedPointer<QTextureGenerator> QTextureGeneratorPtr;
57 
58 class Q_3DRENDERSHARED_EXPORT QAbstractTexture : public Qt3DCore::QNode
59 {
60     Q_OBJECT
61     Q_PROPERTY(Target target READ target CONSTANT)
62     Q_PROPERTY(TextureFormat format READ format WRITE setFormat NOTIFY formatChanged)
63     Q_PROPERTY(bool generateMipMaps READ generateMipMaps WRITE setGenerateMipMaps NOTIFY generateMipMapsChanged)
64     Q_PROPERTY(Qt3DRender::QTextureWrapMode *wrapMode READ wrapMode CONSTANT)
65     Q_PROPERTY(Status status READ status NOTIFY statusChanged)
66     Q_PROPERTY(int width READ width WRITE setWidth NOTIFY widthChanged)
67     Q_PROPERTY(int height READ height WRITE setHeight NOTIFY heightChanged)
68     Q_PROPERTY(int depth READ depth WRITE setDepth NOTIFY depthChanged)
69     Q_PROPERTY(Filter magnificationFilter READ magnificationFilter WRITE setMagnificationFilter NOTIFY magnificationFilterChanged)
70     Q_PROPERTY(Filter minificationFilter READ minificationFilter WRITE setMinificationFilter NOTIFY minificationFilterChanged)
71     Q_PROPERTY(float maximumAnisotropy READ maximumAnisotropy WRITE setMaximumAnisotropy NOTIFY maximumAnisotropyChanged)
72     Q_PROPERTY(ComparisonFunction comparisonFunction READ comparisonFunction WRITE setComparisonFunction NOTIFY comparisonFunctionChanged)
73     Q_PROPERTY(ComparisonMode comparisonMode READ comparisonMode WRITE setComparisonMode NOTIFY comparisonModeChanged)
74     Q_PROPERTY(int layers READ layers WRITE setLayers NOTIFY layersChanged)
75     Q_PROPERTY(int samples READ samples WRITE setSamples NOTIFY samplesChanged)
76     Q_PROPERTY(HandleType handleType READ handleType NOTIFY handleTypeChanged REVISION 13)
77     Q_PROPERTY(QVariant handle READ handle NOTIFY handleChanged REVISION 13)
78 
79 public:
80 
81     enum Status {
82         None = 0,
83         Loading,
84         Ready,
85         Error
86     };
87     Q_ENUM(Status) // LCOV_EXCL_LINE
88 
89     enum Target {
90         TargetAutomatic            = 0,         // Target will be determined by the Qt3D engine
91         Target1D                   = 0x0DE0,    // GL_TEXTURE_1D
92         Target1DArray              = 0x8C18,    // GL_TEXTURE_1D_ARRAY
93         Target2D                   = 0x0DE1,    // GL_TEXTURE_2D
94         Target2DArray              = 0x8C1A,    // GL_TEXTURE_2D_ARRAY
95         Target3D                   = 0x806F,    // GL_TEXTURE_3D
96         TargetCubeMap              = 0x8513,    // GL_TEXTURE_CUBE_MAP
97         TargetCubeMapArray         = 0x9009,    // GL_TEXTURE_CUBE_MAP_ARRAY
98         Target2DMultisample        = 0x9100,    // GL_TEXTURE_2D_MULTISAMPLE
99         Target2DMultisampleArray   = 0x9102,    // GL_TEXTURE_2D_MULTISAMPLE_ARRAY
100         TargetRectangle            = 0x84F5,    // GL_TEXTURE_RECTANGLE
101         TargetBuffer               = 0x8C2A     // GL_TEXTURE_BUFFER
102     };
103     Q_ENUM(Target) // LCOV_EXCL_LINE
104 
105     enum TextureFormat {
106         NoFormat               = 0,         // GL_NONE
107         Automatic              = 1,         // The Qt3D engine automatically determines the best format
108 
109         // Unsigned normalized formats
110         R8_UNorm               = 0x8229,    // GL_R8
111         RG8_UNorm              = 0x822B,    // GL_RG8
112         RGB8_UNorm             = 0x8051,    // GL_RGB8
113         RGBA8_UNorm            = 0x8058,    // GL_RGBA8
114 
115         R16_UNorm              = 0x822A,    // GL_R16
116         RG16_UNorm             = 0x822C,    // GL_RG16
117         RGB16_UNorm            = 0x8054,    // GL_RGB16
118         RGBA16_UNorm           = 0x805B,    // GL_RGBA16
119 
120         // Signed normalized formats
121         R8_SNorm               = 0x8F94,    // GL_R8_SNORM
122         RG8_SNorm              = 0x8F95,    // GL_RG8_SNORM
123         RGB8_SNorm             = 0x8F96,    // GL_RGB8_SNORM
124         RGBA8_SNorm            = 0x8F97,    // GL_RGBA8_SNORM
125 
126         R16_SNorm              = 0x8F98,    // GL_R16_SNORM
127         RG16_SNorm             = 0x8F99,    // GL_RG16_SNORM
128         RGB16_SNorm            = 0x8F9A,    // GL_RGB16_SNORM
129         RGBA16_SNorm           = 0x8F9B,    // GL_RGBA16_SNORM
130 
131         // Unsigned integer formats
132         R8U                    = 0x8232,    // GL_R8UI
133         RG8U                   = 0x8238,    // GL_RG8UI
134         RGB8U                  = 0x8D7D,    // GL_RGB8UI
135         RGBA8U                 = 0x8D7C,    // GL_RGBA8UI
136 
137         R16U                   = 0x8234,    // GL_R16UI
138         RG16U                  = 0x823A,    // GL_RG16UI
139         RGB16U                 = 0x8D77,    // GL_RGB16UI
140         RGBA16U                = 0x8D76,    // GL_RGBA16UI
141 
142         R32U                   = 0x8236,    // GL_R32UI
143         RG32U                  = 0x823C,    // GL_RG32UI
144         RGB32U                 = 0x8D71,    // GL_RGB32UI
145         RGBA32U                = 0x8D70,    // GL_RGBA32UI
146 
147         // Signed integer formats
148         R8I                    = 0x8231,    // GL_R8I
149         RG8I                   = 0x8237,    // GL_RG8I
150         RGB8I                  = 0x8D8F,    // GL_RGB8I
151         RGBA8I                 = 0x8D8E,    // GL_RGBA8I
152 
153         R16I                   = 0x8233,    // GL_R16I
154         RG16I                  = 0x8239,    // GL_RG16I
155         RGB16I                 = 0x8D89,    // GL_RGB16I
156         RGBA16I                = 0x8D88,    // GL_RGBA16I
157 
158         R32I                   = 0x8235,    // GL_R32I
159         RG32I                  = 0x823B,    // GL_RG32I
160         RGB32I                 = 0x8D83,    // GL_RGB32I
161         RGBA32I                = 0x8D82,    // GL_RGBA32I
162 
163         // Floating point formats
164         R16F                   = 0x822D,    // GL_R16F
165         RG16F                  = 0x822F,    // GL_RG16F
166         RGB16F                 = 0x881B,    // GL_RGB16F
167         RGBA16F                = 0x881A,    // GL_RGBA16F
168 
169         R32F                   = 0x822E,    // GL_R32F
170         RG32F                  = 0x8230,    // GL_RG32F
171         RGB32F                 = 0x8815,    // GL_RGB32F
172         RGBA32F                = 0x8814,    // GL_RGBA32F
173 
174         // Packed formats
175         RGB9E5                 = 0x8C3D,    // GL_RGB9_E5
176         RG11B10F               = 0x8C3A,    // GL_R11F_G11F_B10F
177         RG3B2                  = 0x2A10,    // GL_R3_G3_B2
178         R5G6B5                 = 0x8D62,    // GL_RGB565
179         RGB5A1                 = 0x8057,    // GL_RGB5_A1
180         RGBA4                  = 0x8056,    // GL_RGBA4
181         RGB10A2                = 0x8059,    // GL_RGB10_A2
182         RGB10A2U               = 0x906F,    // GL_RGB10_A2UI
183 
184         // Depth formats
185         D16                    = 0x81A5,    // GL_DEPTH_COMPONENT16
186         D24                    = 0x81A6,    // GL_DEPTH_COMPONENT24
187         D24S8                  = 0x88F0,    // GL_DEPTH24_STENCIL8
188         D32                    = 0x81A7,    // GL_DEPTH_COMPONENT32
189         D32F                   = 0x8CAC,    // GL_DEPTH_COMPONENT32F
190         D32FS8X24              = 0x8CAD,    // GL_DEPTH32F_STENCIL8
191 
192         // Compressed formats
193         RGB_DXT1               = 0x83F0,    // GL_COMPRESSED_RGB_S3TC_DXT1_EXT
194         RGBA_DXT1              = 0x83F1,    // GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
195         RGBA_DXT3              = 0x83F2,    // GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
196         RGBA_DXT5              = 0x83F3,    // GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
197         R_ATI1N_UNorm          = 0x8DBB,    // GL_COMPRESSED_RED_RGTC1
198         R_ATI1N_SNorm          = 0x8DBC,    // GL_COMPRESSED_SIGNED_RED_RGTC1
199         RG_ATI2N_UNorm         = 0x8DBD,    // GL_COMPRESSED_RG_RGTC2
200         RG_ATI2N_SNorm         = 0x8DBE,    // GL_COMPRESSED_SIGNED_RG_RGTC2
201         RGB_BP_UNSIGNED_FLOAT  = 0x8E8F,    // GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB
202         RGB_BP_SIGNED_FLOAT    = 0x8E8E,    // GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB
203         RGB_BP_UNorm           = 0x8E8C,    // GL_COMPRESSED_RGBA_BPTC_UNORM_ARB
204         R11_EAC_UNorm          = 0x9270,    // GL_COMPRESSED_R11_EAC
205         R11_EAC_SNorm          = 0x9271,    // GL_COMPRESSED_SIGNED_R11_EAC
206         RG11_EAC_UNorm         = 0x9272,    // GL_COMPRESSED_RG11_EAC
207         RG11_EAC_SNorm         = 0x9273,    // GL_COMPRESSED_SIGNED_RG11_EAC
208         RGB8_ETC2              = 0x9274,    // GL_COMPRESSED_RGB8_ETC2
209         SRGB8_ETC2             = 0x9275,    // GL_COMPRESSED_SRGB8_ETC2
210         RGB8_PunchThrough_Alpha1_ETC2 = 0x9276, // GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2
211         SRGB8_PunchThrough_Alpha1_ETC2 = 0x9277, // GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2
212         RGBA8_ETC2_EAC         = 0x9278,    // GL_COMPRESSED_RGBA8_ETC2_EAC
213         SRGB8_Alpha8_ETC2_EAC  = 0x9279,    // GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC
214         RGB8_ETC1              = 0x8D64,    // GL_ETC1_RGB8_OES
215 
216         // sRGB formats
217         SRGB8                  = 0x8C41,    // GL_SRGB8
218         SRGB8_Alpha8           = 0x8C43,    // GL_SRGB8_ALPHA8
219         SRGB_DXT1              = 0x8C4C,    // GL_COMPRESSED_SRGB_S3TC_DXT1_EXT
220         SRGB_Alpha_DXT1        = 0x8C4D,    // GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT
221         SRGB_Alpha_DXT3        = 0x8C4E,    // GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT
222         SRGB_Alpha_DXT5        = 0x8C4F,    // GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT
223         SRGB_BP_UNorm          = 0x8E8D,    // GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB
224 
225         // ES 2 formats
226         DepthFormat            = 0x1902,    // GL_DEPTH_COMPONENT
227         AlphaFormat            = 0x1906,    // GL_ALPHA
228         RGBFormat              = 0x1907,    // GL_RGB
229         RGBAFormat             = 0x1908,    // GL_RGBA
230         LuminanceFormat        = 0x1909,    // GL_LUMINANCE
231         LuminanceAlphaFormat   = 0x190A
232     };
233     Q_ENUM(TextureFormat) // LCOV_EXCL_LINE
234 
235     enum Filter {
236         Nearest                 = 0x2600,   // GL_NEAREST
237         Linear                  = 0x2601,   // GL_LINEAR
238         NearestMipMapNearest    = 0x2700,   // GL_NEAREST_MIPMAP_NEAREST
239         NearestMipMapLinear     = 0x2702,   // GL_NEAREST_MIPMAP_LINEAR
240         LinearMipMapNearest     = 0x2701,   // GL_LINEAR_MIPMAP_NEAREST
241         LinearMipMapLinear      = 0x2703    // GL_LINEAR_MIPMAP_LINEAR
242     };
243     Q_ENUM(Filter) // LCOV_EXCL_LINE
244 
245     enum CubeMapFace {
246         CubeMapPositiveX = 0x8515,  // GL_TEXTURE_CUBE_MAP_POSITIVE_X
247         CubeMapNegativeX = 0x8516,  // GL_TEXTURE_CUBE_MAP_NEGATIVE_X
248         CubeMapPositiveY = 0x8517,  // GL_TEXTURE_CUBE_MAP_POSITIVE_Y
249         CubeMapNegativeY = 0x8518,  // GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
250         CubeMapPositiveZ = 0x8519,  // GL_TEXTURE_CUBE_MAP_POSITIVE_Z
251         CubeMapNegativeZ = 0x851A,  // GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
252         AllFaces
253     };
254     Q_ENUM(CubeMapFace) // LCOV_EXCL_LINE
255 
256     enum ComparisonFunction {
257         CompareLessEqual    = 0x0203,   // GL_LEQUAL
258         CompareGreaterEqual = 0x0206,   // GL_GEQUAL
259         CompareLess         = 0x0201,   // GL_LESS
260         CompareGreater      = 0x0204,   // GL_GREATER
261         CompareEqual        = 0x0202,   // GL_EQUAL
262         CommpareNotEqual    = 0x0205,   // GL_NOTEQUAL
263         CompareAlways       = 0x0207,   // GL_ALWAYS
264         CompareNever        = 0x0200    // GL_NEVER
265     };
266     Q_ENUM(ComparisonFunction) // LCOV_EXCL_LINE
267 
268     enum ComparisonMode {
269         CompareRefToTexture = 0x884E,   // GL_COMPARE_REF_TO_TEXTURE
270         CompareNone         = 0x0000    // GL_NONE
271     };
272     Q_ENUM(ComparisonMode) // LCOV_EXCL_LINE
273 
274     enum HandleType {
275         NoHandle,
276         OpenGLTextureId
277     };
278     Q_ENUM(HandleType) // LCOV_EXCL_LINE
279 
280     ~QAbstractTexture();
281 
282     Target target() const;
283 
284     TextureFormat format() const;
285     bool generateMipMaps() const;
286 
287     Status status() const;
288 
289     void addTextureImage(QAbstractTextureImage *textureImage);
290     void removeTextureImage(QAbstractTextureImage *textureImage);
291     QVector<QAbstractTextureImage *> textureImages() const;
292 
293     // sampler data - in the future proxy to a Sampler helper
294     void setWrapMode(const QTextureWrapMode &wrapMode);
295     QTextureWrapMode *wrapMode();
296 
297     void setSize(int width, int height=1, int depth=1);
298 
299     Filter minificationFilter() const;
300     Filter magnificationFilter() const;
301     float maximumAnisotropy() const;
302     ComparisonFunction comparisonFunction() const;
303     ComparisonMode comparisonMode() const;
304     int width() const;
305     int height() const;
306     int depth() const;
307     int layers() const;
308     int samples() const;
309     Q3D_DECL_DEPRECATED QTextureGeneratorPtr dataGenerator() const;
310     HandleType handleType() const;
311     QVariant handle() const;
312 
313     Q_INVOKABLE void updateData(const QTextureDataUpdate &update);
314 
315 
316 public Q_SLOTS:
317     void setFormat(TextureFormat format);
318     void setGenerateMipMaps(bool gen);
319     void setWidth(int width);
320     void setHeight(int height);
321     void setDepth(int depth);
322     void setMinificationFilter(Filter f);
323     void setMagnificationFilter(Filter f);
324     void setMaximumAnisotropy(float anisotropy);
325     void setComparisonFunction(ComparisonFunction function);
326     void setComparisonMode(ComparisonMode mode);
327     void setLayers(int layers);
328     void setSamples(int samples);
329 
330 Q_SIGNALS:
331     void formatChanged(TextureFormat format);
332     void statusChanged(Status status);
333     void generateMipMapsChanged(bool generateMipMaps);
334     void widthChanged(int width);
335     void heightChanged(int height);
336     void depthChanged(int depth);
337     void magnificationFilterChanged(Filter magnificationFilter);
338     void minificationFilterChanged(Filter minificationFilter);
339     void maximumAnisotropyChanged(float maximumAnisotropy);
340     void comparisonFunctionChanged(ComparisonFunction comparisonFunction);
341     void comparisonModeChanged(ComparisonMode comparisonMode);
342     void layersChanged(int layers);
343     void samplesChanged(int samples);
344     Q_REVISION(13) void handleTypeChanged(HandleType handleType);
345     Q_REVISION(13) void handleChanged(QVariant handle);
346 
347 protected:
348     explicit QAbstractTexture(Qt3DCore::QNode *parent = nullptr);
349     explicit QAbstractTexture(Target target, Qt3DCore::QNode *parent = nullptr);
350     explicit QAbstractTexture(QAbstractTexturePrivate &dd, Qt3DCore::QNode *parent = nullptr);
351     void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &change) override;
352 
353     // TO DO Qt6, should be on private class
354     void setStatus(Status status);
355     void setHandle(const QVariant &handle);
356     void setHandleType(HandleType type);
357 
358 private:
359     Q_DECLARE_PRIVATE(QAbstractTexture)
360     Qt3DCore::QNodeCreatedChangeBasePtr createNodeCreationChange() const override;
361 };
362 
363 } // namespace Qt3DRender
364 
365 QT_END_NAMESPACE
366 
367 Q_DECLARE_METATYPE(Qt3DRender::QAbstractTexture *) // LCOV_EXCL_LINE
368 
369 #endif // QT3DRENDER_QABSTRACTTEXTURE_H
370