27class QQuick3DInstancingPrivate :
public QQuick3DObjectPrivate
30 QQuick3DInstancingPrivate();
31 int m_instanceCountOverride = -1;
32 int m_instanceCount = 0;
33 bool m_hasTransparency =
false;
34 bool m_instanceDataChanged =
true;
35 bool m_instanceCountOverrideChanged =
false;
36 bool m_depthSortingEnabled =
false;
37 QVector3D m_shadowBoundsMinimum = QVector3D(1, 1, 1);
38 QVector3D m_shadowBoundsMaximum = QVector3D(-1, -1, -1);
45 QML_ADDED_IN_VERSION(6, 2)
46 Q_PROPERTY(QVector3D position READ position WRITE setPosition NOTIFY positionChanged)
47 Q_PROPERTY(QVector3D scale READ scale WRITE setScale NOTIFY scaleChanged)
48 Q_PROPERTY(QVector3D eulerRotation READ eulerRotation WRITE setEulerRotation NOTIFY eulerRotationChanged)
49 Q_PROPERTY(QQuaternion rotation READ rotation WRITE setRotation NOTIFY rotationChanged)
50 Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)
51 Q_PROPERTY(QVector4D customData READ customData WRITE setCustomData NOTIFY customDataChanged)
52 QML_NAMED_ELEMENT(InstanceListEntry)
55 explicit QQuick3DInstanceListEntry(QQuick3DObject *parent =
nullptr);
56 ~QQuick3DInstanceListEntry() override {}
58 QVector3D position()
const
62 QVector3D scale()
const
67 QVector3D eulerRotation()
const
69 return m_eulerRotation;
72 QQuaternion rotation()
const
82 QVector4D customData()
const
88 void setPosition(QVector3D position);
89 void setScale(QVector3D scale);
90 void setEulerRotation(QVector3D eulerRotation);
91 void setRotation(QQuaternion rotation);
92 void setColor(QColor color);
93 void setCustomData(QVector4D customData);
96 void positionChanged();
98 void eulerRotationChanged();
99 void rotationChanged();
101 void customDataChanged();
105 QSSGRenderGraphObject *updateSpatialNode(QSSGRenderGraphObject *) override
111 QVector3D m_position;
112 QVector3D m_scale = {1, 1, 1};
113 QVector3D m_eulerRotation;
114 QQuaternion m_rotation;
115 QColor m_color = Qt::white;
116 QVector4D m_customData;
117 bool m_useEulerRotation =
true;
118 friend class QQuick3DInstanceList;
124 Q_PROPERTY(QQmlListProperty<QQuick3DInstanceListEntry> instances READ instances)
125 Q_PROPERTY(
int instanceCount READ instanceCount NOTIFY instanceCountChanged)
126 QML_NAMED_ELEMENT(InstanceList)
127 QML_ADDED_IN_VERSION(6, 2)
129 Q_CLASSINFO(
"DefaultProperty",
"instances")
132 explicit QQuick3DInstanceList(QQuick3DObject *parent =
nullptr);
133 ~QQuick3DInstanceList() override;
135 QByteArray getInstanceBuffer(
int *instanceCount) override;
136 QQmlListProperty<QQuick3DInstanceListEntry> instances();
137 int instanceCount()
const;
140 void instanceCountChanged();
143 void handleInstanceChange();
144 void onInstanceDestroyed(QObject *object);
147 void generateInstanceData();
149 static void qmlAppendInstanceListEntry(QQmlListProperty<QQuick3DInstanceListEntry> *list, QQuick3DInstanceListEntry *material);
150 static QQuick3DInstanceListEntry *qmlInstanceListEntryAt(QQmlListProperty<QQuick3DInstanceListEntry> *list, qsizetype index);
151 static qsizetype qmlInstanceListEntriesCount(QQmlListProperty<QQuick3DInstanceListEntry> *list);
152 static void qmlClearInstanceListEntries(QQmlListProperty<QQuick3DInstanceListEntry> *list);
155 QByteArray m_instanceData;
156 QList<QQuick3DInstanceListEntry *> m_instances;
162 QML_NAMED_ELEMENT(FileInstancing)
163 QML_ADDED_IN_VERSION(6, 2)
164 Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged)
165 Q_PROPERTY(
int instanceCount READ instanceCount NOTIFY instanceCountChanged)
168 explicit QQuick3DFileInstancing(QQuick3DObject *parent =
nullptr);
169 ~QQuick3DFileInstancing() override;
171 const QUrl &source()
const;
172 void setSource(
const QUrl &newSource);
174 bool loadFromBinaryFile(
const QString &filename);
175 bool loadFromXmlFile(
const QString &filename);
176 int writeToBinaryFile(QIODevice *out);
178 int instanceCount()
const;
181 void instanceCountChanged();
182 void sourceChanged();
185 QByteArray getInstanceBuffer(
int *instanceCount) override;
188 bool loadFromFile(
const QUrl &source);
191 int m_instanceCount = 0;
192 QByteArray m_instanceData;
193 QFile *m_dataFile =
nullptr;
static QQuick3DInstancing::InstanceTableEntry calculate(const QVector3D &position, const QVector3D &scale, const QVector3D &eulerRotation, const QColor &color, const QVector4D &customData)