Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
instancerepeater.cpp
Go to the documentation of this file.
1// Copyright (C) 2022 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3
5#include <math.h>
6#include <QMatrix4x4>
7
9
10
46/*
47 \table
48 \header
49 \li Qt Core Feature
50 \li Brief Description
51 \row
52 \li \l {Signal and Slots}
53 \li Signals and slots are used for communication
54 between objects.
55 \row
56 \li \l {Layout Management}
57 \li The Qt layout system provides a simple
58 and powerful way of specifying the layout
59 of child widgets.
60 \row
61 \li \l {Drag and Drop}
62 \li Drag and drop provides a simple visual
63 mechanism which users can use to transfer
64 information between and within applications.
65 \endtable
66
67 */
68
79
81{
82 if (!index.isValid())
83 return QVariant();
84 ensureTable();
85
86
87 int idx = index.row();
88
89 if (idx >= m_count) {
90 qWarning("That's not supposed to happen...");
91 return QVariant();
92 }
93
94 auto *instanceData = reinterpret_cast<const QQuick3DInstancing::InstanceTableEntry*>(m_instanceData.data()) + idx;
95
96 switch (role) {
97 case ColorRole:
98 return instanceData->getColor();
99 case PositionRole:
100 return instanceData->getPosition();
101 case RotationRole:
102 return instanceData->getRotation();
103 case ScaleRole:
104 return instanceData->getScale();
105 case CustomDataRole:
107 }
108 return QVariant();
109}
110
112{
113 ensureTable();
114 return m_count;
115}
116
118{
119 if (m_instancing == instancing)
120 return;
121 QObject::disconnect(m_tableConnection);
122 m_instancing = instancing;
123 m_tableConnection = QObject::connect(instancing, &QQuick3DInstancing::instanceTableChanged, this, &InstanceModel::reset);
125}
126
128{
129 if (index >= m_count)
130 return nullptr;
131 return reinterpret_cast<const QQuick3DInstancing::InstanceTableEntry*>(m_instanceData.constData()) + index;
132}
133
134void InstanceModel::ensureTable() const
135{
136 auto *that = const_cast<InstanceModel*>(this);
137 that->m_instanceData = m_instancing->instanceBuffer(&that->m_count);
138}
139
140void InstanceModel::reset()
141{
142 m_instanceData.clear();
143}
144
186
188{
189 return m_model ? m_model->instancing() : nullptr;
190}
191
193{
194 if (m_model && m_model->instancing() == instancing)
195 return;
196 if (!m_model)
197 m_model = new InstanceModel(this);
198 m_model->setInstancing(instancing);
201}
202
204{
205 Q_ASSERT(m_model);
206 auto *entry = m_model->instanceData(index);
208 node->setPosition(entry->getPosition());
209 node->setScale(entry->getScale());
210 node->setRotation(entry->getRotation());
211}
212
int rowCount(const QModelIndex &parent) const override
Returns the number of rows under the given parent.
InstanceModel(QObject *parent=nullptr)
\qmltype InstanceModel \inherits Object3D \inqmlmodule QtQuick3D.Helpers
QVariant data(const QModelIndex &index, int role) const override
Returns the data stored under the given role for the item referred to by the index.
void setInstancing(QQuick3DInstancing *instancing)
const QQuick3DInstancing::InstanceTableEntry * instanceData(int index) const
QQuick3DInstancing * instancing() const
void instancingChanged()
QQuick3DInstancing * instancing() const
void instancingChanged()
void setInstancing(QQuick3DInstancing *instancing)
InstanceRepeater(QQuick3DNode *parent=nullptr)
\qmltype InstanceRepeater \inherits Repeater3D \inqmlmodule QtQuick3D.Helpers
void initDelegate(int index, QQuick3DNode *node) override
char * data()
\macro QT_NO_CAST_FROM_BYTEARRAY
Definition qbytearray.h:611
const char * constData() const noexcept
Returns a pointer to the const data stored in the byte array.
Definition qbytearray.h:124
void clear()
Clears the contents of the byte array and makes it null.
\inmodule QtCore
\inmodule QtCore
Definition qobject.h:103
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
Definition qobject.cpp:2960
static bool disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *member)
\threadsafe
Definition qobject.cpp:3236
\inmodule QtQuick3D \inherits QQuick3DObject
QByteArray instanceBuffer(int *instanceCount)
void instanceTableChanged()
void setRotation(const QQuaternion &rotation)
void setScale(const QVector3D &scale)
void setPosition(const QVector3D &position)
void setModel(const QVariant &)
\inmodule QtCore
Definition qvariant.h:65
static auto fromValue(T &&value) noexcept(std::is_nothrow_copy_constructible_v< T > &&Private::CanUseInternalSpace< T >) -> std::enable_if_t< std::conjunction_v< std::is_copy_constructible< T >, std::is_destructible< T > >, QVariant >
Definition qvariant.h:536
Combined button and popup list for selecting options.
#define qWarning
Definition qlogging.h:166
GLuint index
[2]
GLuint entry
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
#define emit