25class QQuick3DInstancingPrivate :
public QQuick3DObjectPrivate
28 QQuick3DInstancingPrivate();
29 int m_instanceCountOverride = -1;
30 int m_instanceCount = 0;
31 bool m_hasTransparency =
false;
32 bool m_instanceDataChanged =
true;
33 bool m_instanceCountOverrideChanged =
false;
34 bool m_depthSortingEnabled =
false;
35 QVector3D m_shadowBoundsMinimum = QVector3D(1, 1, 1);
36 QVector3D m_shadowBoundsMaximum = QVector3D(-1, -1, -1);
43 QML_ADDED_IN_VERSION(6, 2)
44 Q_PROPERTY(QVector3D position READ position WRITE setPosition NOTIFY positionChanged)
45 Q_PROPERTY(QVector3D scale READ scale WRITE setScale NOTIFY scaleChanged)
46 Q_PROPERTY(QVector3D eulerRotation READ eulerRotation WRITE setEulerRotation NOTIFY eulerRotationChanged)
47 Q_PROPERTY(QQuaternion rotation READ rotation WRITE setRotation NOTIFY rotationChanged)
48 Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)
49 Q_PROPERTY(QVector4D customData READ customData WRITE setCustomData NOTIFY customDataChanged)
50 QML_NAMED_ELEMENT(InstanceListEntry)
53 explicit QQuick3DInstanceListEntry(QQuick3DObject *parent =
nullptr);
54 ~QQuick3DInstanceListEntry() override {}
56 QVector3D position()
const
60 QVector3D scale()
const
65 QVector3D eulerRotation()
const
67 return m_eulerRotation;
70 QQuaternion rotation()
const
80 QVector4D customData()
const
86 void setPosition(QVector3D position);
87 void setScale(QVector3D scale);
88 void setEulerRotation(QVector3D eulerRotation);
89 void setRotation(QQuaternion rotation);
90 void setColor(QColor color);
91 void setCustomData(QVector4D customData);
94 void positionChanged();
96 void eulerRotationChanged();
97 void rotationChanged();
99 void customDataChanged();
103 QSSGRenderGraphObject *updateSpatialNode(QSSGRenderGraphObject *) override
109 QVector3D m_position;
110 QVector3D m_scale = {1, 1, 1};
111 QVector3D m_eulerRotation;
112 QQuaternion m_rotation;
113 QColor m_color = Qt::white;
114 QVector4D m_customData;
115 bool m_useEulerRotation =
true;
116 friend class QQuick3DInstanceList;
122 Q_PROPERTY(QQmlListProperty<QQuick3DInstanceListEntry> instances READ instances)
123 Q_PROPERTY(
int instanceCount READ instanceCount NOTIFY instanceCountChanged)
124 QML_NAMED_ELEMENT(InstanceList)
125 QML_ADDED_IN_VERSION(6, 2)
127 Q_CLASSINFO(
"DefaultProperty",
"instances")
130 explicit QQuick3DInstanceList(QQuick3DObject *parent =
nullptr);
131 ~QQuick3DInstanceList() override;
133 QByteArray getInstanceBuffer(
int *instanceCount) override;
134 QQmlListProperty<QQuick3DInstanceListEntry> instances();
135 int instanceCount()
const;
138 void instanceCountChanged();
141 void handleInstanceChange();
142 void onInstanceDestroyed(QObject *object);
145 void generateInstanceData();
147 static void qmlAppendInstanceListEntry(QQmlListProperty<QQuick3DInstanceListEntry> *list, QQuick3DInstanceListEntry *material);
148 static QQuick3DInstanceListEntry *qmlInstanceListEntryAt(QQmlListProperty<QQuick3DInstanceListEntry> *list, qsizetype index);
149 static qsizetype qmlInstanceListEntriesCount(QQmlListProperty<QQuick3DInstanceListEntry> *list);
150 static void qmlClearInstanceListEntries(QQmlListProperty<QQuick3DInstanceListEntry> *list);
153 QByteArray m_instanceData;
154 QList<QQuick3DInstanceListEntry *> m_instances;
160 QML_NAMED_ELEMENT(FileInstancing)
161 QML_ADDED_IN_VERSION(6, 2)
162 Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged)
163 Q_PROPERTY(
int instanceCount READ instanceCount NOTIFY instanceCountChanged)
166 explicit QQuick3DFileInstancing(QQuick3DObject *parent =
nullptr);
167 ~QQuick3DFileInstancing() override;
169 const QUrl &source()
const;
170 void setSource(
const QUrl &newSource);
172 bool loadFromBinaryFile(
const QString &filename);
173 bool loadFromXmlFile(
const QString &filename);
174 int writeToBinaryFile(QIODevice *out);
176 int instanceCount()
const;
179 void instanceCountChanged();
180 void sourceChanged();
183 QByteArray getInstanceBuffer(
int *instanceCount) override;
186 bool loadFromFile(
const QUrl &source);
189 int m_instanceCount = 0;
190 QByteArray m_instanceData;
191 QFile *m_dataFile =
nullptr;
static QQuick3DInstancing::InstanceTableEntry calculate(const QVector3D &position, const QVector3D &scale, const QVector3D &eulerRotation, const QColor &color, const QVector4D &customData)