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/QQuickItem>
22#include <QtQuick/QSGNode>
23#include <QtCore/QUrl>
24#include <QtCore/QPointer>
25
26QT_BEGIN_NAMESPACE
27
28class QSGLayer;
29struct QSSGRenderImage;
30
31class Q_QUICK3D_EXPORT QQuick3DTexture : public QQuick3DObject, public QQuickItemChangeListener
32{
33 Q_OBJECT
34 Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged)
35 Q_PROPERTY(QQuickItem *sourceItem READ sourceItem WRITE setSourceItem NOTIFY sourceItemChanged)
36 Q_PROPERTY(QQuick3DTextureData *textureData READ textureData WRITE setTextureData NOTIFY textureDataChanged)
37 Q_PROPERTY(float scaleU READ scaleU WRITE setScaleU NOTIFY scaleUChanged)
38 Q_PROPERTY(float scaleV READ scaleV WRITE setScaleV NOTIFY scaleVChanged)
39 Q_PROPERTY(MappingMode mappingMode READ mappingMode WRITE setMappingMode NOTIFY mappingModeChanged)
40 Q_PROPERTY(TilingMode tilingModeHorizontal READ horizontalTiling WRITE setHorizontalTiling NOTIFY horizontalTilingChanged)
41 Q_PROPERTY(TilingMode tilingModeVertical READ verticalTiling WRITE setVerticalTiling NOTIFY verticalTilingChanged)
42 Q_PROPERTY(float rotationUV READ rotationUV WRITE setRotationUV NOTIFY rotationUVChanged)
43 Q_PROPERTY(float positionU READ positionU WRITE setPositionU NOTIFY positionUChanged)
44 Q_PROPERTY(float positionV READ positionV WRITE setPositionV NOTIFY positionVChanged)
45 Q_PROPERTY(float pivotU READ pivotU WRITE setPivotU NOTIFY pivotUChanged)
46 Q_PROPERTY(float pivotV READ pivotV WRITE setPivotV NOTIFY pivotVChanged)
47 Q_PROPERTY(bool flipU READ flipU WRITE setFlipU NOTIFY flipUChanged)
48 Q_PROPERTY(bool flipV READ flipV WRITE setFlipV NOTIFY flipVChanged)
49 Q_PROPERTY(int indexUV READ indexUV WRITE setIndexUV NOTIFY indexUVChanged)
50 Q_PROPERTY(Filter magFilter READ magFilter WRITE setMagFilter NOTIFY magFilterChanged)
51 Q_PROPERTY(Filter minFilter READ minFilter WRITE setMinFilter NOTIFY minFilterChanged)
52 Q_PROPERTY(Filter mipFilter READ mipFilter WRITE setMipFilter NOTIFY mipFilterChanged)
53 Q_PROPERTY(bool generateMipmaps READ generateMipmaps WRITE setGenerateMipmaps NOTIFY generateMipmapsChanged)
54 Q_PROPERTY(bool autoOrientation READ autoOrientation WRITE setAutoOrientation NOTIFY autoOrientationChanged REVISION(6, 2))
55
56 QML_NAMED_ELEMENT(Texture)
57
58public:
59 enum MappingMode
60 {
61 UV = 0,
62 Environment = 1,
63 LightProbe = 2,
64 };
65 Q_ENUM(MappingMode)
66
67 enum TilingMode // must match QSSGRenderTextureCoordOp
68 {
69 ClampToEdge = 1,
70 MirroredRepeat,
71 Repeat
72 };
73 Q_ENUM(TilingMode)
74
75 enum Filter { // must match QSSGRenderTextureFilterOp
76 None = 0,
77 Nearest,
78 Linear
79 };
80 Q_ENUM(Filter)
81
82 explicit QQuick3DTexture(QQuick3DObject *parent = nullptr);
83 ~QQuick3DTexture() override;
84
85 QUrl source() const;
86 QQuickItem *sourceItem() const;
87 float scaleU() const;
88 float scaleV() const;
89 MappingMode mappingMode() const;
90 TilingMode horizontalTiling() const;
91 TilingMode verticalTiling() const;
92 float rotationUV() const;
93 float positionU() const;
94 float positionV() const;
95 float pivotU() const;
96 float pivotV() const;
97 bool flipU() const;
98 bool flipV() const;
99 int indexUV() const;
100 Filter magFilter() const;
101 Filter minFilter() const;
102 Filter mipFilter() const;
103 QQuick3DTextureData *textureData() const;
104 bool generateMipmaps() const;
105 bool autoOrientation() const;
106
107 QSSGRenderImage *getRenderImage();
108
109public Q_SLOTS:
110 void setSource(const QUrl &source);
111 void setSourceItem(QQuickItem *sourceItem);
112 void setScaleU(float scaleU);
113 void setScaleV(float scaleV);
114 void setMappingMode(QQuick3DTexture::MappingMode mappingMode);
115 void setHorizontalTiling(QQuick3DTexture::TilingMode tilingModeHorizontal);
116 void setVerticalTiling(QQuick3DTexture::TilingMode tilingModeVertical);
117 void setRotationUV(float rotationUV);
118 void setPositionU(float positionU);
119 void setPositionV(float positionV);
120 void setPivotU(float pivotU);
121 void setPivotV(float pivotV);
122 void setFlipU(bool flipU);
123 void setFlipV(bool flipV);
124 void setIndexUV(int indexUV);
125 void setMagFilter(QQuick3DTexture::Filter magFilter);
126 void setMinFilter(QQuick3DTexture::Filter minFilter);
127 void setMipFilter(QQuick3DTexture::Filter mipFilter);
128 void setTextureData(QQuick3DTextureData * textureData);
129 void setGenerateMipmaps(bool generateMipmaps);
130 void setAutoOrientation(bool autoOrientation);
131
132Q_SIGNALS:
133 void sourceChanged();
134 void sourceItemChanged();
135 void scaleUChanged();
136 void scaleVChanged();
137 void mappingModeChanged();
138 void horizontalTilingChanged();
139 void verticalTilingChanged();
140 void rotationUVChanged();
141 void positionUChanged();
142 void positionVChanged();
143 void pivotUChanged();
144 void pivotVChanged();
145 void flipUChanged();
146 void flipVChanged();
147 void indexUVChanged();
148 void magFilterChanged();
149 void minFilterChanged();
150 void mipFilterChanged();
151 void textureDataChanged();
152 void generateMipmapsChanged();
153 void autoOrientationChanged();
154
155protected:
156 QSSGRenderGraphObject *updateSpatialNode(QSSGRenderGraphObject *node) override;
157 void markAllDirty() override;
158 void itemChange(ItemChange change, const ItemChangeData &value) override;
159
160 void itemGeometryChanged(QQuickItem *item, QQuickGeometryChange change, const QRectF &geometry) override;
161
162 explicit QQuick3DTexture(QQuick3DObjectPrivate &dd, QQuick3DObject *parent = nullptr);
163
164private Q_SLOTS:
165 void sourceItemDestroyed(QObject *item);
166
167private:
168 enum class DirtyFlag {
169 TransformDirty = (1 << 0),
170 SourceDirty = (1 << 1),
171 IndexUVDirty = (1 << 2),
172 TextureDataDirty = (1 << 3),
173 SamplerDirty = (1 << 4),
174 SourceItemDirty = (1 << 5),
175 FlipVDirty = (1 << 6)
176 };
177 Q_DECLARE_FLAGS(DirtyFlags, DirtyFlag)
178 void markDirty(DirtyFlag type);
179 void trySetSourceParent();
180 bool effectiveFlipV(const QSSGRenderImage &imageNode) const;
181
182 QUrl m_source;
183 QQuickItem *m_sourceItem = nullptr;
184 bool m_sourceItemReparented = false;
185 bool m_sourceItemRefed = false;
186 QSGLayer *m_layer = nullptr;
187 float m_scaleU = 1.0f;
188 float m_scaleV = 1.0f;
189 MappingMode m_mappingMode = UV;
190 TilingMode m_tilingModeHorizontal = Repeat;
191 TilingMode m_tilingModeVertical = Repeat;
192 float m_rotationUV = 0;
193 float m_positionU = 0;
194 float m_positionV = 0;
195 float m_pivotU = 0;
196 float m_pivotV = 0;
197 bool m_flipU = false;
198 bool m_flipV = false;
199 int m_indexUV = 0;
200 Filter m_magFilter = Linear;
201 Filter m_minFilter = Linear;
202 Filter m_mipFilter = None;
203 DirtyFlags m_dirtyFlags = DirtyFlags(DirtyFlag::TransformDirty)
204 | DirtyFlags(DirtyFlag::SourceDirty)
205 | DirtyFlags(DirtyFlag::IndexUVDirty)
206 | DirtyFlags(DirtyFlag::TextureDataDirty);
207 QMetaObject::Connection m_textureProviderConnection;
208 QMetaObject::Connection m_textureUpdateConnection;
209 QQuick3DSceneManager *m_sceneManagerForLayer = nullptr;
210 QMetaObject::Connection m_sceneManagerWindowChangeConnection;
211 QQuickItem *m_initializedSourceItem = nullptr;
212 QSizeF m_initializedSourceItemSize;
213 QHash<QByteArray, QMetaObject::Connection> m_connections;
214 QMetaObject::Connection m_textureDataConnection;
215 QQuick3DTextureData *m_textureData = nullptr;
216 bool m_generateMipmaps = false;
217 bool m_autoOrientation = true;
218 QMetaMethod m_updateSlot;
219};
220
221QT_END_NAMESPACE
222
223#endif // QSSGIMAGE_H
224

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