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 | |