Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qquick3dmodel_p.h
Go to the documentation of this file.
1// Copyright (C) 2019 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3
4#ifndef QSSGMODEL_H
5#define QSSGMODEL_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/private/qquick3dnode_p.h>
19#include <QtQuick3D/private/qquick3dmaterial_p.h>
20#include <QtQuick3D/private/qquick3dgeometry_p.h>
21#include <QtQuick3D/private/qquick3dinstancing_p.h>
22#include <QtQuick3D/private/qquick3dskeleton_p.h>
23#include <QtQuick3D/private/qquick3dskin_p.h>
24#include <QtQuick3D/private/qquick3dbakedlightmap_p.h>
25#include <QtQuick3D/private/qquick3dmorphtarget_p.h>
26#include <QtQuick3DUtils/private/qssgbounds3_p.h>
27
28#include <QtQml/QQmlListProperty>
29
30#include <QtCore/QVector>
31#include <QtCore/QList>
32#include <QtCore/QUrl>
33
34#include <QtGui/QVector4D>
35
37
39{
40 Q_GADGET
41 Q_PROPERTY(QVector3D minimum READ minimum CONSTANT)
42 Q_PROPERTY(QVector3D maximum READ maximum CONSTANT)
43 QML_VALUE_TYPE(bounds)
44
45public:
46 QVector3D minimum() const
47 {
48 return bounds.minimum;
49 }
50
51 QVector3D maximum() const
52 {
53 return bounds.maximum;
54 }
55
56 // For compatibility we start with zero values.
57 QSSGBounds3 bounds { QVector3D{}, QVector3D{} };
58};
59
60class Q_QUICK3D_EXPORT QQuick3DModel : public QQuick3DNode
61{
62 Q_OBJECT
63 Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged)
64 Q_PROPERTY(bool castsShadows READ castsShadows WRITE setCastsShadows NOTIFY castsShadowsChanged)
65 Q_PROPERTY(bool receivesShadows READ receivesShadows WRITE setReceivesShadows NOTIFY receivesShadowsChanged)
66 Q_PROPERTY(QQmlListProperty<QQuick3DMaterial> materials READ materials)
67 Q_PROPERTY(QQmlListProperty<QQuick3DMorphTarget> morphTargets READ morphTargets NOTIFY morphTargetsChanged)
68 Q_PROPERTY(bool pickable READ pickable WRITE setPickable NOTIFY pickableChanged)
69 Q_PROPERTY(QQuick3DGeometry *geometry READ geometry WRITE setGeometry NOTIFY geometryChanged)
70 Q_PROPERTY(QQuick3DInstancing *instancing READ instancing WRITE setInstancing NOTIFY instancingChanged)
71 Q_PROPERTY(QQuick3DNode *instanceRoot READ instanceRoot WRITE setInstanceRoot NOTIFY instanceRootChanged)
72 Q_PROPERTY(QQuick3DSkeleton *skeleton READ skeleton WRITE setSkeleton NOTIFY skeletonChanged)
73 Q_PROPERTY(QQuick3DSkin *skin READ skin WRITE setSkin NOTIFY skinChanged REVISION(6, 4))
74 Q_PROPERTY(QList<QMatrix4x4> inverseBindPoses READ inverseBindPoses WRITE setInverseBindPoses NOTIFY inverseBindPosesChanged)
75 Q_PROPERTY(QQuick3DBounds3 bounds READ bounds NOTIFY boundsChanged)
76 Q_PROPERTY(float depthBias READ depthBias WRITE setDepthBias NOTIFY depthBiasChanged)
77 Q_PROPERTY(bool receivesReflections READ receivesReflections WRITE setReceivesReflections NOTIFY receivesReflectionsChanged REVISION(6, 3))
78 Q_PROPERTY(bool castsReflections READ castsReflections WRITE setCastsReflections NOTIFY castsReflectionsChanged REVISION(6, 4))
79 Q_PROPERTY(bool usedInBakedLighting READ isUsedInBakedLighting WRITE setUsedInBakedLighting NOTIFY usedInBakedLightingChanged REVISION(6, 4))
80 Q_PROPERTY(int lightmapBaseResolution READ lightmapBaseResolution WRITE setLightmapBaseResolution NOTIFY lightmapBaseResolutionChanged REVISION(6, 4))
81 Q_PROPERTY(QQuick3DBakedLightmap *bakedLightmap READ bakedLightmap WRITE setBakedLightmap NOTIFY bakedLightmapChanged REVISION(6, 4))
82 Q_PROPERTY(float instancingLodMin READ instancingLodMin WRITE setInstancingLodMin NOTIFY instancingLodMinChanged REVISION(6, 5))
83 Q_PROPERTY(float instancingLodMax READ instancingLodMax WRITE setInstancingLodMax NOTIFY instancingLodMaxChanged REVISION(6, 5))
84 Q_PROPERTY(float levelOfDetailBias READ levelOfDetailBias WRITE setLevelOfDetailBias NOTIFY levelOfDetailBiasChanged REVISION(6, 5))
85 Q_PROPERTY(float texelsPerUnit READ texelsPerUnit WRITE setTexelsPerUnit NOTIFY texelsPerUnitChanged FINAL REVISION(6, 10))
86
87 QML_NAMED_ELEMENT(Model)
88
89public:
90 explicit QQuick3DModel(QQuick3DNode *parent = nullptr);
91 ~QQuick3DModel() override;
92
93 QUrl source() const;
94 bool castsShadows() const;
95 bool receivesShadows() const;
96 bool pickable() const;
97 QQuick3DGeometry *geometry() const;
98 QQuick3DSkeleton *skeleton() const;
99 QList<QMatrix4x4> inverseBindPoses() const;
100 QQuick3DBounds3 bounds() const;
101 float depthBias() const;
102
103 QQmlListProperty<QQuick3DMaterial> materials();
104 QQmlListProperty<QQuick3DMorphTarget> morphTargets();
105
106 QQuick3DInstancing *instancing() const;
107 QQuick3DNode *instanceRoot() const;
108
109 Q_REVISION(6, 3) bool receivesReflections() const;
110 Q_REVISION(6, 4) bool castsReflections() const;
111 Q_REVISION(6, 4) QQuick3DSkin *skin() const;
112
113 static QString translateMeshSource(const QUrl &source, QObject *contextObject);
114
115 Q_REVISION(6, 4) bool isUsedInBakedLighting() const;
116 Q_REVISION(6, 4) int lightmapBaseResolution() const;
117 Q_REVISION(6, 4) QQuick3DBakedLightmap *bakedLightmap() const;
118
119 Q_REVISION(6, 5) float instancingLodMin() const;
120 Q_REVISION(6, 5) float instancingLodMax() const;
121 Q_REVISION(6, 5) float levelOfDetailBias() const;
122
123 Q_REVISION(6, 10) float texelsPerUnit() const;
124 Q_REVISION(6, 10) void setTexelsPerUnit(float newTexelsPerUnit);
125
126public Q_SLOTS:
127 void setSource(const QUrl &source);
128 void setCastsShadows(bool castsShadows);
129 void setReceivesShadows(bool receivesShadows);
130 void setPickable(bool pickable);
131 void setGeometry(QQuick3DGeometry *geometry);
132 void setSkeleton(QQuick3DSkeleton *skeleton);
133 void setInverseBindPoses(const QList<QMatrix4x4> &poses);
134 void setBounds(const QVector3D &min, const QVector3D &max);
135 void setInstancing(QQuick3DInstancing *instancing);
136 void setInstanceRoot(QQuick3DNode *instanceRoot);
137 void setDepthBias(float bias);
138 Q_REVISION(6, 3) void setReceivesReflections(bool receivesReflections);
139 Q_REVISION(6, 4) void setCastsReflections(bool castsReflections);
140 Q_REVISION(6, 4) void setSkin(QQuick3DSkin *skin);
141 Q_REVISION(6, 4) void setUsedInBakedLighting(bool enable);
142 Q_REVISION(6, 4) void setLightmapBaseResolution(int resolution);
143 Q_REVISION(6, 4) void setBakedLightmap(QQuick3DBakedLightmap *bakedLightmap);
144
145 Q_REVISION(6, 5) void setInstancingLodMin(float minDistance);
146 Q_REVISION(6, 5) void setInstancingLodMax(float maxDistance);
147 Q_REVISION(6, 5) void setLevelOfDetailBias(float newLevelOfDetailBias);
148
149Q_SIGNALS:
150 void sourceChanged();
151 void castsShadowsChanged();
152 void receivesShadowsChanged();
153 void pickableChanged();
154 void geometryChanged();
155 void skeletonChanged();
156 void inverseBindPosesChanged();
157 void boundsChanged();
158 void instancingChanged();
159 void instanceRootChanged();
160 void morphTargetsChanged();
161 void depthBiasChanged();
162 Q_REVISION(6, 3) void receivesReflectionsChanged();
163 Q_REVISION(6, 4) void castsReflectionsChanged();
164 Q_REVISION(6, 4) void skinChanged();
165 Q_REVISION(6, 4) void usedInBakedLightingChanged();
166 Q_REVISION(6, 4) void lightmapBaseResolutionChanged();
167 Q_REVISION(6, 4) void bakedLightmapChanged();
168
169 Q_REVISION(6, 5) void instancingLodMinChanged();
170 Q_REVISION(6, 5) void instancingLodMaxChanged();
171 Q_REVISION(6, 5) void levelOfDetailBiasChanged();
172
173 Q_REVISION(6, 10) void texelsPerUnitChanged();
174
175protected:
176 QSSGRenderGraphObject *updateSpatialNode(QSSGRenderGraphObject *node) override;
177 void markAllDirty() override;
178 void itemChange(ItemChange, const ItemChangeData &) override;
179
180private Q_SLOTS:
181 void onMaterialDestroyed(QObject *object);
182 void onMorphTargetDestroyed(QObject *object);
183
184private:
185 enum QSSGModelDirtyType {
186 SourceDirty = 0x00000001,
187 MaterialsDirty = 0x00000002,
188 ShadowsDirty = 0x00000004,
189 PickingDirty = 0x00000008,
190 GeometryDirty = 0x00000010,
191 SkeletonDirty = 0x00000020,
192 PoseDirty = 0x00000040,
193 InstancesDirty = 0x00000080,
194 MorphTargetsDirty = 0x00000100,
195 PropertyDirty = 0x00000200,
196 ReflectionDirty = 0x00000400,
197 SkinDirty = 0x00000800,
198 LodDirty = 0x00001000,
199 InstanceRootDirty = 0x00002000,
200 };
201
202 QUrl m_source;
203
204 quint32 m_dirtyAttributes = 0xffffffff; // all dirty by default
205 void markDirty(QSSGModelDirtyType type);
206 void updateSceneManager(QQuick3DSceneManager *sceneManager);
207
208 static void qmlAppendMaterial(QQmlListProperty<QQuick3DMaterial> *list, QQuick3DMaterial *material);
209 static QQuick3DMaterial *qmlMaterialAt(QQmlListProperty<QQuick3DMaterial> *list, qsizetype index);
210 static qsizetype qmlMaterialsCount(QQmlListProperty<QQuick3DMaterial> *list);
211 static void qmlClearMaterials(QQmlListProperty<QQuick3DMaterial> *list);
212
213 struct Material {
214 QQuick3DMaterial *material;
215 bool refed;
216 };
217 QVector<Material> m_materials;
218
219 static void qmlAppendMorphTarget(QQmlListProperty<QQuick3DMorphTarget> *list, QQuick3DMorphTarget *morphTarget);
220 static QQuick3DMorphTarget *qmlMorphTargetAt(QQmlListProperty<QQuick3DMorphTarget> *list, qsizetype index);
221 static qsizetype qmlMorphTargetsCount(QQmlListProperty<QQuick3DMorphTarget> *list);
222 static void qmlClearMorphTargets(QQmlListProperty<QQuick3DMorphTarget> *list);
223 QVector<QQuick3DMorphTarget *> m_morphTargets;
224 size_t m_numMorphAttribs = 0;
225 QQuick3DGeometry *m_geometry = nullptr;
226 QQuick3DBounds3 m_bounds;
227 QQuick3DSkeleton *m_skeleton = nullptr;
228 QList<QMatrix4x4> m_inverseBindPoses;
229 QQuick3DInstancing *m_instancing = nullptr;
230 QQuick3DNode *m_instanceRoot = nullptr;
231 QMetaObject::Connection m_geometryConnection;
232 QMetaObject::Connection m_instancingConnection;
233 float m_depthBias = 0.0f;
234 bool m_castsShadows = true;
235 bool m_receivesShadows = true;
236 bool m_pickable = false;
237 bool m_receivesReflections = false;
238 bool m_castsReflections = true;
239 bool m_usedInBakedLighting = false;
240 int m_lightmapBaseResolution = 1024;
241 QQuick3DBakedLightmap *m_bakedLightmap = nullptr;
242 QMetaObject::Connection m_bakedLightmapSignalConnection;
243 QQuick3DSkin *m_skin = nullptr;
244 float m_instancingLodMin = -1;
245 float m_instancingLodMax = -1;
246 float m_levelOfDetailBias = 1.0f;
247 float m_texelsPerUnit = 0.0f;
248};
249
250QT_END_NAMESPACE
251
252Q_DECLARE_METATYPE(QQuick3DBounds3)
253
254#endif // QSSGMODEL_H