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 | |
26 | QT_BEGIN_NAMESPACE |
27 | |
28 | class QSGLayer; |
29 | struct QSSGRenderImage; |
30 | |
31 | class 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 | |
58 | public: |
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 | |
109 | public 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 | |
132 | Q_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 | |
155 | protected: |
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 | |
164 | private Q_SLOTS: |
165 | void sourceItemDestroyed(QObject *item); |
166 | |
167 | private: |
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 | |
221 | QT_END_NAMESPACE |
222 | |
223 | #endif // QSSGIMAGE_H |
224 | |