Source code
Revision control
Copy as Markdown
// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qbuffer.h"
#include "qbuffer_p.h"
#include <Qt3DCore/private/corelogging_p.h>
QT_BEGIN_NAMESPACE
namespace Qt3DCore {
const char *QBufferPrivate::UpdateDataPropertyName = "QT3D_updateData";
QBufferPrivate::QBufferPrivate()
: QNodePrivate()
, m_usage(QBuffer::StaticDraw)
, m_access(QBuffer::Write)
, m_dirty(false)
{
}
QBufferPrivate *QBufferPrivate::get(QBuffer *q)
{
return q->d_func();
}
void QBufferPrivate::update()
{
if (!m_blockNotifications) {
m_dirty = true;
markDirty(QScene::BuffersDirty);
}
QNodePrivate::update();
}
void QBufferPrivate::setData(const QByteArray &data)
{
// this is called when date is loaded from backend, should not set dirty flag
Q_Q(QBuffer);
const bool blocked = q->blockNotifications(true);
m_data = data;
emit q->dataChanged(data);
q->blockNotifications(blocked);
}
/*!
* \qmltype Buffer
* \nativetype Qt3DCore::QBuffer
* \inqmlmodule Qt3D.Core
*
* \brief Provides a data store for raw data to later be used as vertices or
* uniforms.
*/
/*!
* \qmlproperty QBuffer::UsageType Buffer::usage
*
* Holds the buffer usage.
*/
/*!
* \class Qt3DCore::QBuffer
* \inheaderfile Qt3DCore/QBuffer
* \inmodule Qt3DCore
*
* \inherits Qt3DCore::QNode
*
* \brief Provides a data store for raw data to later be used as vertices or
* uniforms.
*
* Data can be provided directly using QBuffer::setData().
*/
/*!
* \fn void Qt3DCore::QBuffer::dataChanged(const QByteArray &bytes)
*
* This signal is emitted with \a bytes when data changes.
*/
/*!
* \fn void Qt3DCore::QBuffer::dataAvailable()
*
* This signal is emitted when data becomes available.
*/
/*!
* \enum Qt3DCore::QBuffer::UsageType
*
* The type of the usage.
*
* \value StreamDraw
* GL_STREAM_DRAW
* \value StreamRead
* GL_STREAM_READ
* \value StreamCopy
* GL_STREAM_COPY
* \value StaticDraw
* GL_STATIC_DRAW
* \value StaticRead
* GL_STATIC_READ
* \value StaticCopy
* GL_STATIC_COPY
* \value DynamicDraw
* GL_DYNAMIC_DRAW
* \value DynamicRead
* GL_DYNAMIC_READ
* \value DynamicCopy
* GL_DYNAMIC_COPY
*/
/*!
* \enum Qt3DCore::QBuffer::AccessType
*
* \value Write
* Write access
* \value Read
* Read access
* \value ReadWrite
* Write|Read
*/
/*!
* Constructs a new QBuffer with \a parent.
*/
QBuffer::QBuffer(QNode *parent)
: QNode(*new QBufferPrivate(), parent)
{
}
/*!
* \internal
*/
QBuffer::~QBuffer()
{
}
/*!
* Sets \a bytes as data.
*/
void QBuffer::setData(const QByteArray &bytes)
{
Q_D(QBuffer);
if (bytes != d->m_data) {
d->setData(bytes);
d->update();
}
}
/*!
* Updates the data by replacing it with \a bytes at \a offset.
*/
void QBuffer::updateData(int offset, const QByteArray &bytes)
{
Q_D(QBuffer);
Q_ASSERT(offset >= 0 && (offset + bytes.size()) <= d->m_data.size());
// Update data
d->m_data.replace(offset, bytes.size(), bytes);
const bool blocked = blockNotifications(true);
emit dataChanged(d->m_data);
blockNotifications(blocked);
QBufferUpdate updateData;
updateData.offset = offset;
updateData.data = bytes;
QVariantList updateDataList;
const QVariant propertyData = property(QBufferPrivate::UpdateDataPropertyName);
if (propertyData.isValid())
updateDataList = propertyData.toList();
updateDataList.push_back(QVariant::fromValue(updateData));
setProperty(QBufferPrivate::UpdateDataPropertyName, updateDataList);
d->update();
}
/*!
* \return the data.
*/
QByteArray QBuffer::data() const
{
Q_D(const QBuffer);
return d->m_data;
}
/*!
* \property Qt3DCore::QBuffer::usage
*
* Holds the buffer usage.
*/
QBuffer::UsageType QBuffer::usage() const
{
Q_D(const QBuffer);
return d->m_usage;
}
void QBuffer::setUsage(QBuffer::UsageType usage)
{
Q_D(QBuffer);
if (usage != d->m_usage) {
d->m_usage = usage;
emit usageChanged(usage);
}
}
void QBuffer::setAccessType(QBuffer::AccessType access)
{
Q_D(QBuffer);
if (d->m_access != access) {
d->m_access = access;
Q_EMIT accessTypeChanged(access);
}
}
/*!
* \property Qt3DCore::QBuffer::accessType
*
* Returns the \l {QBuffer::}{AccessType} of the buffer.
*
* \sa QBuffer::AccessType
*/
QBuffer::AccessType QBuffer::accessType() const
{
Q_D(const QBuffer);
return d->m_access;
}
} // namespace Qt3DCore
QT_END_NAMESPACE
#include "moc_qbuffer.cpp"