1// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include "qbuffer.h"
5#include "qbuffer_p.h"
6#include <Qt3DCore/private/corelogging_p.h>
7
8QT_BEGIN_NAMESPACE
9
10namespace Qt3DCore {
11
12const char *QBufferPrivate::UpdateDataPropertyName = "QT3D_updateData";
13
14QBufferPrivate::QBufferPrivate()
15 : QNodePrivate()
16 , m_usage(QBuffer::StaticDraw)
17 , m_access(QBuffer::Write)
18 , m_dirty(false)
19{
20}
21
22QBufferPrivate *QBufferPrivate::get(QBuffer *q)
23{
24 return q->d_func();
25}
26
27void QBufferPrivate::update()
28{
29 if (!m_blockNotifications) {
30 m_dirty = true;
31 markDirty(changes: QScene::BuffersDirty);
32 }
33 QNodePrivate::update();
34}
35
36void QBufferPrivate::setData(const QByteArray &data)
37{
38 // this is called when date is loaded from backend, should not set dirty flag
39 Q_Q(QBuffer);
40 const bool blocked = q->blockNotifications(block: true);
41 m_data = data;
42 emit q->dataChanged(bytes: data);
43 q->blockNotifications(block: blocked);
44}
45
46/*!
47 * \qmltype Buffer
48 * \instantiates Qt3DCore::QBuffer
49 * \inqmlmodule Qt3D.Core
50 *
51 * \brief Provides a data store for raw data to later be used as vertices or
52 * uniforms.
53 */
54
55/*!
56 * \qmlproperty QBuffer::UsageType Buffer::usage
57 *
58 * Holds the buffer usage.
59 */
60
61/*!
62 * \class Qt3DCore::QBuffer
63 * \inheaderfile Qt3DCore/QBuffer
64 * \inmodule Qt3DCore
65 *
66 * \inherits Qt3DCore::QNode
67 *
68 * \brief Provides a data store for raw data to later be used as vertices or
69 * uniforms.
70 *
71 * Data can be provided directly using QBuffer::setData().
72 */
73
74/*!
75 * \fn void Qt3DCore::QBuffer::dataChanged(const QByteArray &bytes)
76 *
77 * This signal is emitted with \a bytes when data changes.
78 */
79
80/*!
81 * \fn void Qt3DCore::QBuffer::dataAvailable()
82 *
83 * This signal is emitted when data becomes available.
84 */
85
86/*!
87 * \enum QBuffer::UsageType
88 *
89 * The type of the usage.
90 *
91 * \value StreamDraw
92 * GL_STREAM_DRAW
93 * \value StreamRead
94 * GL_STREAM_READ
95 * \value StreamCopy
96 * GL_STREAM_COPY
97 * \value StaticDraw
98 * GL_STATIC_DRAW
99 * \value StaticRead
100 * GL_STATIC_READ
101 * \value StaticCopy
102 * GL_STATIC_COPY
103 * \value DynamicDraw
104 * GL_DYNAMIC_DRAW
105 * \value DynamicRead
106 * GL_DYNAMIC_READ
107 * \value DynamicCopy
108 * GL_DYNAMIC_COPY
109 */
110
111/*!
112 * \enum QBuffer::AccessType
113 *
114 * \value Write
115 * Write access
116 * \value Read
117 * Read access
118 * \value ReadWrite
119 * Write|Read
120 */
121
122/*!
123 * Constructs a new QBuffer with \a parent.
124 */
125QBuffer::QBuffer(QNode *parent)
126 : QNode(*new QBufferPrivate(), parent)
127{
128}
129
130/*!
131 * \internal
132 */
133QBuffer::~QBuffer()
134{
135}
136
137/*!
138 * Sets \a bytes as data.
139 */
140void QBuffer::setData(const QByteArray &bytes)
141{
142 Q_D(QBuffer);
143 if (bytes != d->m_data) {
144 d->setData(bytes);
145 d->update();
146 }
147}
148
149/*!
150 * Updates the data by replacing it with \a bytes at \a offset.
151 */
152void QBuffer::updateData(int offset, const QByteArray &bytes)
153{
154 Q_D(QBuffer);
155 Q_ASSERT(offset >= 0 && (offset + bytes.size()) <= d->m_data.size());
156
157 // Update data
158 d->m_data.replace(index: offset, len: bytes.size(), s: bytes);
159 const bool blocked = blockNotifications(block: true);
160 emit dataChanged(bytes: d->m_data);
161 blockNotifications(block: blocked);
162
163 QBufferUpdate updateData;
164 updateData.offset = offset;
165 updateData.data = bytes;
166
167 QVariantList updateDataList;
168 const QVariant propertyData = property(name: QBufferPrivate::UpdateDataPropertyName);
169 if (propertyData.isValid())
170 updateDataList = propertyData.toList();
171 updateDataList.push_back(t: QVariant::fromValue(value: updateData));
172
173 setProperty(name: QBufferPrivate::UpdateDataPropertyName, value: updateDataList);
174 d->update();
175}
176
177/*!
178 * \return the data.
179 */
180QByteArray QBuffer::data() const
181{
182 Q_D(const QBuffer);
183 return d->m_data;
184}
185
186/*!
187 * \property QBuffer::usage
188 *
189 * Holds the buffer usage.
190 */
191QBuffer::UsageType QBuffer::usage() const
192{
193 Q_D(const QBuffer);
194 return d->m_usage;
195}
196
197void QBuffer::setUsage(QBuffer::UsageType usage)
198{
199 Q_D(QBuffer);
200 if (usage != d->m_usage) {
201 d->m_usage = usage;
202 emit usageChanged(usage);
203 }
204}
205
206void QBuffer::setAccessType(QBuffer::AccessType access)
207{
208 Q_D(QBuffer);
209 if (d->m_access != access) {
210 d->m_access = access;
211 Q_EMIT accessTypeChanged(access);
212 }
213}
214
215/*!
216 * \property Qt3DCore::QBuffer::accessType
217 *
218 * Returns the \l {QBuffer::}{AccessType} of the buffer.
219 *
220 * \sa QBuffer::AccessType
221 */
222QBuffer::AccessType QBuffer::accessType() const
223{
224 Q_D(const QBuffer);
225 return d->m_access;
226}
227
228} // namespace Qt3DCore
229
230QT_END_NAMESPACE
231
232#include "moc_qbuffer.cpp"
233

source code of qt3d/src/core/geometry/qbuffer.cpp