summaryrefslogtreecommitdiffstats
path: root/src/quick3d
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2015-01-09 10:10:13 +0100
committerSean Harmer <sean.harmer@kdab.com>2015-01-18 15:30:47 +0100
commit074263ba87e73c67e355ee5dc5037477090f6957 (patch)
tree18bf0672f9c93c5a1a64d50d6723791f50637f6f /src/quick3d
parent67ffbd60ed6f383f3629a1848587da049c3ff3c9 (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')
-rw-r--r--src/quick3d/imports/render/qt3dquick3drenderplugin.cpp5
-rw-r--r--src/quick3d/quick3drenderer/items/quick3dshaderdata.cpp18
-rw-r--r--src/quick3d/quick3drenderer/items/quick3dshaderdata.h2
-rw-r--r--src/quick3d/quick3drenderer/items/quick3dshaderdataarray.cpp28
-rw-r--r--src/quick3d/quick3drenderer/items/quick3dshaderdataarray.h18
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