1// Copyright (C) 2019 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3
4#ifndef QSSGIMAGE_H
5#define QSSGIMAGE_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include <QtQuick3D/qquick3dobject.h>
19#include <QtQuick3D/QQuick3DTextureData>
20#include <QtQuick/private/qquickitemchangelistener_p.h>
21#include <QtQuick/private/qsgadaptationlayer_p.h>
22#include <QtQuick/QQuickItem>
23#include <QtQuick/QSGNode>
24#include <QtCore/QUrl>
25#include <QtCore/QPointer>
26
27QT_BEGIN_NAMESPACE
28
29class QSGLayer;
30struct QSSGRenderImage;
31class QQuick3DRenderExtension;
32
33class Q_QUICK3D_EXPORT QQuick3DTexture : public QQuick3DObject, public QQuickItemChangeListener
34{
35 Q_OBJECT
36 Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged)
37 Q_PROPERTY(QQuickItem *sourceItem READ sourceItem WRITE setSourceItem NOTIFY sourceItemChanged)
38 Q_PROPERTY(QQuick3DTextureData *textureData READ textureData WRITE setTextureData NOTIFY textureDataChanged)
39 Q_PROPERTY(QQuick3DRenderExtension *textureProvider READ textureProvider WRITE setTextureProvider NOTIFY textureProviderChanged FINAL REVISION(6, 7))
40 Q_PROPERTY(float scaleU READ scaleU WRITE setScaleU NOTIFY scaleUChanged)
41 Q_PROPERTY(float scaleV READ scaleV WRITE setScaleV NOTIFY scaleVChanged)
42 Q_PROPERTY(MappingMode mappingMode READ mappingMode WRITE setMappingMode NOTIFY mappingModeChanged)
43 Q_PROPERTY(TilingMode tilingModeHorizontal READ horizontalTiling WRITE setHorizontalTiling NOTIFY horizontalTilingChanged)
44 Q_PROPERTY(TilingMode tilingModeVertical READ verticalTiling WRITE setVerticalTiling NOTIFY verticalTilingChanged)
45 Q_PROPERTY(TilingMode tilingModeDepth READ depthTiling WRITE setDepthTiling NOTIFY depthTilingChanged REVISION(6, 7))
46 Q_PROPERTY(float rotationUV READ rotationUV WRITE setRotationUV NOTIFY rotationUVChanged)
47 Q_PROPERTY(float positionU READ positionU WRITE setPositionU NOTIFY positionUChanged)
48 Q_PROPERTY(float positionV READ positionV WRITE setPositionV NOTIFY positionVChanged)
49 Q_PROPERTY(float pivotU READ pivotU WRITE setPivotU NOTIFY pivotUChanged)
50 Q_PROPERTY(float pivotV READ pivotV WRITE setPivotV NOTIFY pivotVChanged)
51 Q_PROPERTY(bool flipU READ flipU WRITE setFlipU NOTIFY flipUChanged)
52 Q_PROPERTY(bool flipV READ flipV WRITE setFlipV NOTIFY flipVChanged)
53 Q_PROPERTY(int indexUV READ indexUV WRITE setIndexUV NOTIFY indexUVChanged)
54 Q_PROPERTY(Filter magFilter READ magFilter WRITE setMagFilter NOTIFY magFilterChanged)
55 Q_PROPERTY(Filter minFilter READ minFilter WRITE setMinFilter NOTIFY minFilterChanged)
56 Q_PROPERTY(Filter mipFilter READ mipFilter WRITE setMipFilter NOTIFY mipFilterChanged)
57 Q_PROPERTY(bool generateMipmaps READ generateMipmaps WRITE setGenerateMipmaps NOTIFY generateMipmapsChanged)
58 Q_PROPERTY(bool autoOrientation READ autoOrientation WRITE setAutoOrientation NOTIFY autoOrientationChanged REVISION(6, 2))
59
60 QML_NAMED_ELEMENT(Texture)
61
62public:
63 enum MappingMode
64 {
65 UV = 0,
66 Environment = 1,
67 LightProbe = 2,
68 };
69 Q_ENUM(MappingMode)
70
71 enum TilingMode // must match QSSGRenderTextureCoordOp
72 {
73 ClampToEdge = 1,
74 MirroredRepeat,
75 Repeat
76 };
77 Q_ENUM(TilingMode)
78
79 enum Filter { // must match QSSGRenderTextureFilterOp
80 None = 0,
81 Nearest,
82 Linear
83 };
84 Q_ENUM(Filter)
85
86 explicit QQuick3DTexture(QQuick3DObject *parent = nullptr);
87 ~QQuick3DTexture() override;
88
89 QUrl source() const;
90 QQuickItem *sourceItem() const;
91 float scaleU() const;
92 float scaleV() const;
93 MappingMode mappingMode() const;
94 TilingMode horizontalTiling() const;
95 TilingMode verticalTiling() const;
96 Q_REVISION(6, 7) TilingMode depthTiling() const;
97 float rotationUV() const;
98 float positionU() const;
99 float positionV() const;
100 float pivotU() const;
101 float pivotV() const;
102 bool flipU() const;
103 bool flipV() const;
104 int indexUV() const;
105 Filter magFilter() const;
106 Filter minFilter() const;
107 Filter mipFilter() const;
108 QQuick3DTextureData *textureData() const;
109 bool generateMipmaps() const;
110 bool autoOrientation() const;
111
112 QSSGRenderImage *getRenderImage();
113
114 Q_REVISION(6, 7) QQuick3DRenderExtension *textureProvider() const;
115 Q_REVISION(6, 7) void setTextureProvider(QQuick3DRenderExtension *newRenderTexture);
116
117 bool extensionDirty() const { return m_dirtyFlags.testFlag(flag: DirtyFlag::ExtensionDirty); }
118
119 bool hasSourceData() const
120 {
121 return !m_source.isEmpty() || m_sourceItem || m_textureData;
122 }
123
124public Q_SLOTS:
125 void setSource(const QUrl &source);
126 void setSourceItem(QQuickItem *sourceItem);
127 void setScaleU(float scaleU);
128 void setScaleV(float scaleV);
129 void setMappingMode(QQuick3DTexture::MappingMode mappingMode);
130 void setHorizontalTiling(QQuick3DTexture::TilingMode tilingModeHorizontal);
131 void setVerticalTiling(QQuick3DTexture::TilingMode tilingModeVertical);
132 Q_REVISION(6, 7) void setDepthTiling(QQuick3DTexture::TilingMode tilingModeDepth);
133 void setRotationUV(float rotationUV);
134 void setPositionU(float positionU);
135 void setPositionV(float positionV);
136 void setPivotU(float pivotU);
137 void setPivotV(float pivotV);
138 void setFlipU(bool flipU);
139 void setFlipV(bool flipV);
140 void setIndexUV(int indexUV);
141 void setMagFilter(QQuick3DTexture::Filter magFilter);
142 void setMinFilter(QQuick3DTexture::Filter minFilter);
143 void setMipFilter(QQuick3DTexture::Filter mipFilter);
144 void setTextureData(QQuick3DTextureData * textureData);
145 void setGenerateMipmaps(bool generateMipmaps);
146 void setAutoOrientation(bool autoOrientation);
147
148Q_SIGNALS:
149 void sourceChanged();
150 void sourceItemChanged();
151 void scaleUChanged();
152 void scaleVChanged();
153 void mappingModeChanged();
154 void horizontalTilingChanged();
155 void verticalTilingChanged();
156 Q_REVISION(6, 7) void depthTilingChanged();
157 void rotationUVChanged();
158 void positionUChanged();
159 void positionVChanged();
160 void pivotUChanged();
161 void pivotVChanged();
162 void flipUChanged();
163 void flipVChanged();
164 void indexUVChanged();
165 void magFilterChanged();
166 void minFilterChanged();
167 void mipFilterChanged();
168 void textureDataChanged();
169 void generateMipmapsChanged();
170 void autoOrientationChanged();
171 Q_REVISION(6, 7) void textureProviderChanged();
172
173protected:
174 QSSGRenderGraphObject *updateSpatialNode(QSSGRenderGraphObject *node) override;
175 void markAllDirty() override;
176 void itemChange(ItemChange change, const ItemChangeData &value) override;
177
178 void itemGeometryChanged(QQuickItem *item, QQuickGeometryChange change, const QRectF &geometry) override;
179
180 explicit QQuick3DTexture(QQuick3DObjectPrivate &dd, QQuick3DObject *parent = nullptr);
181
182private Q_SLOTS:
183 void sourceItemDestroyed(QObject *item);
184
185private:
186 enum class DirtyFlag {
187 TransformDirty = (1 << 0),
188 SourceDirty = (1 << 1),
189 IndexUVDirty = (1 << 2),
190 TextureDataDirty = (1 << 3),
191 SamplerDirty = (1 << 4),
192 SourceItemDirty = (1 << 5),
193 FlipVDirty = (1 << 6),
194 ExtensionDirty = (1 << 7)
195 };
196 Q_DECLARE_FLAGS(DirtyFlags, DirtyFlag)
197 void markDirty(DirtyFlag type);
198 void trySetSourceParent();
199 bool effectiveFlipV(const QSSGRenderImage &imageNode) const;
200
201 QUrl m_source;
202 QQuickItem *m_sourceItem = nullptr;
203 bool m_sourceItemReparented = false;
204 bool m_sourceItemRefed = false;
205 QSGLayer *m_layer = nullptr;
206 float m_scaleU = 1.0f;
207 float m_scaleV = 1.0f;
208 MappingMode m_mappingMode = UV;
209 TilingMode m_tilingModeHorizontal = Repeat;
210 TilingMode m_tilingModeVertical = Repeat;
211 TilingMode m_tilingModeDepth = Repeat;
212 float m_rotationUV = 0;
213 float m_positionU = 0;
214 float m_positionV = 0;
215 float m_pivotU = 0;
216 float m_pivotV = 0;
217 bool m_flipU = false;
218 bool m_flipV = false;
219 int m_indexUV = 0;
220 Filter m_magFilter = Linear;
221 Filter m_minFilter = Linear;
222 Filter m_mipFilter = None;
223 DirtyFlags m_dirtyFlags = DirtyFlags(DirtyFlag::TransformDirty)
224 | DirtyFlags(DirtyFlag::SourceDirty)
225 | DirtyFlags(DirtyFlag::IndexUVDirty)
226 | DirtyFlags(DirtyFlag::TextureDataDirty);
227 QMetaObject::Connection m_textureProviderConnection;
228 QMetaObject::Connection m_textureUpdateConnection;
229 QQuick3DSceneManager *m_sceneManagerForLayer = nullptr;
230 QMetaObject::Connection m_sceneManagerWindowChangeConnection;
231 QQuickItem *m_initializedSourceItem = nullptr;
232 QSizeF m_initializedSourceItemSize;
233 QHash<QByteArray, QMetaObject::Connection> m_connections;
234 QMetaObject::Connection m_textureDataConnection;
235 QQuick3DTextureData *m_textureData = nullptr;
236 bool m_generateMipmaps = false;
237 bool m_autoOrientation = true;
238 QMetaMethod m_updateSlot;
239 QQuick3DRenderExtension *m_renderExtension = nullptr;
240};
241
242QT_END_NAMESPACE
243
244#endif // QSSGIMAGE_H
245

Provided by KDAB

Privacy Policy
Start learning QML with our Intro Training
Find out more

source code of qtquick3d/src/quick3d/qquick3dtexture_p.h