diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2015-01-09 10:10:13 +0100 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2015-01-18 15:30:47 +0100 |
commit | 074263ba87e73c67e355ee5dc5037477090f6957 (patch) | |
tree | 18bf0672f9c93c5a1a64d50d6723791f50637f6f /src/quick3d | |
parent | 67ffbd60ed6f383f3629a1848587da049c3ff3c9 (diff) |
RenderShaderData handling entirely reworked
- UBO created for each Shader/ShaderData
- We deal with nested QShaderData by looking for QNodeId only instead of looking
for QShaderData*
- We update only the values that have changed into the UBO
- A CleanupFrameJob was added to properly clear all RenderShaderData set for
updates after a frame
- RenderShaderData is cleared of all UBO rendering logic
- BlockToUBO contains all the updated properties for a given UBO in a
RenderView, that solves the issue of properties being updated in the
RenderShaderData while performing a draw call
Note: the QShaderData transformed properties were commented for now
deferred-examples and playground qml updates to follow
Change-Id: I8ecf155288c154f41b505cf465d31f5eb8a71b5d
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src/quick3d')
5 files changed, 46 insertions, 25 deletions
diff --git a/src/quick3d/imports/render/qt3dquick3drenderplugin.cpp b/src/quick3d/imports/render/qt3dquick3drenderplugin.cpp index 36cddc3c8..abe892d35 100644 --- a/src/quick3d/imports/render/qt3dquick3drenderplugin.cpp +++ b/src/quick3d/imports/render/qt3dquick3drenderplugin.cpp @@ -139,10 +139,10 @@ QVariantList QJSValueToVariantListConverter(const QJSValue &jsValue) QVariantList Quick3DShaderDataArrayToVariantListConverter(Qt3D::Render::Quick::Quick3DShaderDataArray *array) { - QList<Qt3D::Render::Quick::Quick3DShaderData *> arrayValues = array->values(); + QList<Qt3D::QShaderData *> arrayValues = array->values(); QVariantList values; values.reserve(arrayValues.size()); - Q_FOREACH (Qt3D::Render::Quick::Quick3DShaderData *data, arrayValues) + Q_FOREACH (Qt3D::QShaderData *data, arrayValues) values.append(QVariant::fromValue(data)); return values; } @@ -170,6 +170,7 @@ void Qt3DQuick3DRenderPlugin::registerTypes(const char *uri) qmlRegisterExtendedType<Qt3D::QMaterial, Qt3D::Render::Quick::Quick3DMaterial>(uri, 2, 0, "Material"); qmlRegisterExtendedType<Qt3D::QRenderPass, Qt3D::Render::Quick::Quick3DRenderPass>(uri, 2, 0, "RenderPass"); qmlRegisterType<Qt3D::QShaderProgram>(uri, 2, 0, "ShaderProgram"); + qmlRegisterUncreatableType<Qt3D::QShaderData>(uri, 2, 0, "QShaderData", "Quick3D should instantiate Quick3DShaderData only"); qmlRegisterType<Qt3D::Render::Quick::Quick3DShaderDataArray>(uri, 2, 0, "ShaderDataArray"); qmlRegisterType<Qt3D::Render::Quick::Quick3DShaderData>(uri, 2, 0, "ShaderData"); diff --git a/src/quick3d/quick3drenderer/items/quick3dshaderdata.cpp b/src/quick3d/quick3drenderer/items/quick3dshaderdata.cpp index 42b81325d..769f207ff 100644 --- a/src/quick3d/quick3drenderer/items/quick3dshaderdata.cpp +++ b/src/quick3d/quick3drenderer/items/quick3dshaderdata.cpp @@ -57,6 +57,7 @@ namespace { const int qjsValueTypeId = qMetaTypeId<QJSValue>(); const int quick3DShaderDataArrayTypeId = qMetaTypeId<Quick3DShaderDataArray*>(); +const int quick3DShaderDataTypeId = qMetaTypeId<Quick3DShaderData*>(); } @@ -69,6 +70,7 @@ public: QVariant readProperty(const QVariant &v) Q_DECL_OVERRIDE { + // qjsValueTypeId are not compile time constant (no switch) if (v.userType() == qjsValueTypeId) { QJSValue jsValue = v.value<QJSValue>(); if (jsValue.isArray()) @@ -76,7 +78,21 @@ public: else if (jsValue.isVariant()) return jsValue.toVariant(); } else if (v.userType() == quick3DShaderDataArrayTypeId) { - return v.value<QVariantList>(); + Quick3DShaderDataArray *array = v.value<Quick3DShaderDataArray *>(); + QVariantList innerValues; + if (array) { + Q_FOREACH (QShaderData *d, array->values()) { + if (d) + innerValues.append(QVariant::fromValue(d->id())); + } + } + return innerValues; + } else if (v.userType() == quick3DShaderDataTypeId) { + QNodeId id; + QShaderData *shaderData = v.value<Quick3DShaderData *>(); + if (shaderData) + id = shaderData->id(); + return QVariant::fromValue(id); } return v; } diff --git a/src/quick3d/quick3drenderer/items/quick3dshaderdata.h b/src/quick3d/quick3drenderer/items/quick3dshaderdata.h index 690d67a84..c95d9d0bb 100644 --- a/src/quick3d/quick3drenderer/items/quick3dshaderdata.h +++ b/src/quick3d/quick3drenderer/items/quick3dshaderdata.h @@ -74,4 +74,6 @@ private: QT_END_NAMESPACE +Q_DECLARE_METATYPE(Qt3D::Render::Quick::Quick3DShaderData*) + #endif // QT3D_RENDER_QUICK_QUICK3DSHADERDATA_H diff --git a/src/quick3d/quick3drenderer/items/quick3dshaderdataarray.cpp b/src/quick3d/quick3drenderer/items/quick3dshaderdataarray.cpp index 6fe166688..5ac340a75 100644 --- a/src/quick3d/quick3drenderer/items/quick3dshaderdataarray.cpp +++ b/src/quick3d/quick3drenderer/items/quick3dshaderdataarray.cpp @@ -57,7 +57,7 @@ public: : QNodePrivate(qq) {} - QList<Quick3DShaderData *> m_values; + QList<QShaderData *> m_values; }; Quick3DShaderDataArray::Quick3DShaderDataArray(QNode *parent) @@ -65,16 +65,16 @@ Quick3DShaderDataArray::Quick3DShaderDataArray(QNode *parent) { } -QQmlListProperty<Quick3DShaderData> Quick3DShaderDataArray::valuesList() +QQmlListProperty<QShaderData> Quick3DShaderDataArray::valuesList() { - return QQmlListProperty<Quick3DShaderData>(this, 0, - &Quick3DShaderDataArray::appendValue, - &Quick3DShaderDataArray::valueCount, - &Quick3DShaderDataArray::valueAt, - &Quick3DShaderDataArray::clearValues); + return QQmlListProperty<QShaderData>(this, 0, + &Quick3DShaderDataArray::appendValue, + &Quick3DShaderDataArray::valueCount, + &Quick3DShaderDataArray::valueAt, + &Quick3DShaderDataArray::clearValues); } -QList<Quick3DShaderData *> Quick3DShaderDataArray::values() const +QList<QShaderData *> Quick3DShaderDataArray::values() const { Q_D(const Quick3DShaderDataArray); return d->m_values; @@ -84,29 +84,29 @@ void Quick3DShaderDataArray::copy(const QNode *ref) { QNode::copy(ref); const Quick3DShaderDataArray *dataArray = static_cast<const Quick3DShaderDataArray *>(ref); - Q_FOREACH (Quick3DShaderData *v, dataArray->d_func()->m_values) - d_func()->m_values.append(static_cast<Quick3DShaderData *>(QNode::clone(v))); + Q_FOREACH (QShaderData *v, dataArray->d_func()->m_values) + d_func()->m_values.append(static_cast<QShaderData *>(QNode::clone(v))); } -void Quick3DShaderDataArray::appendValue(QQmlListProperty<Quick3DShaderData> *list, Quick3DShaderData *bar) +void Quick3DShaderDataArray::appendValue(QQmlListProperty<QShaderData> *list, QShaderData *bar) { Quick3DShaderDataArray *self = static_cast<Quick3DShaderDataArray *>(list->object); static_cast<Quick3DShaderDataArrayPrivate *>(Quick3DShaderDataArrayPrivate::get(self))->m_values.append(bar); } -Quick3DShaderData *Quick3DShaderDataArray::valueAt(QQmlListProperty<Quick3DShaderData> *list, int index) +QShaderData *Quick3DShaderDataArray::valueAt(QQmlListProperty<QShaderData> *list, int index) { Quick3DShaderDataArray *self = static_cast<Quick3DShaderDataArray *>(list->object); return static_cast<Quick3DShaderDataArrayPrivate *>(Quick3DShaderDataArrayPrivate::get(self))->m_values.at(index); } -int Quick3DShaderDataArray::valueCount(QQmlListProperty<Quick3DShaderData> *list) +int Quick3DShaderDataArray::valueCount(QQmlListProperty<QShaderData> *list) { Quick3DShaderDataArray *self = static_cast<Quick3DShaderDataArray *>(list->object); return static_cast<Quick3DShaderDataArrayPrivate *>(Quick3DShaderDataArrayPrivate::get(self))->m_values.count(); } -void Quick3DShaderDataArray::clearValues(QQmlListProperty<Quick3DShaderData> *list) +void Quick3DShaderDataArray::clearValues(QQmlListProperty<QShaderData> *list) { Quick3DShaderDataArray *self = static_cast<Quick3DShaderDataArray *>(list->object); static_cast<Quick3DShaderDataArrayPrivate *>(Quick3DShaderDataArrayPrivate::get(self))->m_values.clear(); diff --git a/src/quick3d/quick3drenderer/items/quick3dshaderdataarray.h b/src/quick3d/quick3drenderer/items/quick3dshaderdataarray.h index 710d16519..31defb3a9 100644 --- a/src/quick3d/quick3drenderer/items/quick3dshaderdataarray.h +++ b/src/quick3d/quick3drenderer/items/quick3dshaderdataarray.h @@ -51,6 +51,8 @@ QT_BEGIN_NAMESPACE namespace Qt3D { +class QShaderData; + namespace Render { namespace Quick { @@ -61,21 +63,21 @@ class Quick3DShaderData; class QT3DQUICKRENDERERSHARED_EXPORT Quick3DShaderDataArray : public QNode { Q_OBJECT - Q_PROPERTY(QQmlListProperty<Qt3D::Render::Quick::Quick3DShaderData> values READ valuesList) + Q_PROPERTY(QQmlListProperty<Qt3D::QShaderData> values READ valuesList) Q_CLASSINFO("DefaultProperty", "values") public: explicit Quick3DShaderDataArray(QNode *parent = 0); - QQmlListProperty<Quick3DShaderData> valuesList(); - QList<Quick3DShaderData *> values() const; + QQmlListProperty<QShaderData> valuesList(); + QList<QShaderData *> values() const; protected: void copy(const QNode *ref) Q_DECL_OVERRIDE; private: - static void appendValue(QQmlListProperty<Quick3DShaderData> *list, Quick3DShaderData *bar); - static Quick3DShaderData *valueAt(QQmlListProperty<Quick3DShaderData> *list, int index); - static int valueCount(QQmlListProperty<Quick3DShaderData> *list); - static void clearValues(QQmlListProperty<Quick3DShaderData> *list); + static void appendValue(QQmlListProperty<QShaderData> *list, QShaderData *bar); + static QShaderData *valueAt(QQmlListProperty<QShaderData> *list, int index); + static int valueCount(QQmlListProperty<QShaderData> *list); + static void clearValues(QQmlListProperty<QShaderData> *list); Q_DECLARE_PRIVATE(Quick3DShaderDataArray) QT3D_CLONEABLE(Quick3DShaderDataArray) }; @@ -88,6 +90,6 @@ private: QT_END_NAMESPACE -Q_DECLARE_METATYPE(Qt3D::Render::Quick::Quick3DShaderDataArray *) +Q_DECLARE_METATYPE(Qt3D::Render::Quick::Quick3DShaderDataArray*) #endif // QT3D_RENDER_QUICK_QUICK3DSHADERDATAARRAY_H |