summaryrefslogtreecommitdiffstats
path: root/src/render/geometry
diff options
context:
space:
mode:
authorSean Harmer <sean.harmer@kdab.com>2016-05-03 10:44:23 +0100
committerSean Harmer <sean.harmer@kdab.com>2016-05-03 16:13:55 +0000
commit44ca2d31d278b4b744abfee818a92370daf7c343 (patch)
tree733bc33f67159ef3a45014e1bfaadbb50a317e4b /src/render/geometry
parent66da7cf6c57d7883fc6f67e460f57844619d5214 (diff)
Fix for loading using a Mesh
Added code path avoiding cloning for setting the geometry on the QMesh which is a QGeopmetryRenderer. This is actually much easier without cloning. We simply create the QGeometry on the backend, move it to the main thread, then send it over in a change. In the frontend QGeometryRenderer, we just extract the pointer to the QGeometry and set it on the geometry property. Change-Id: I06db5cba52d783323141a7b1d72b326e319b4960 Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src/render/geometry')
-rw-r--r--src/render/geometry/geometryrenderer.cpp21
-rw-r--r--src/render/geometry/qgeometryrenderer.cpp18
-rw-r--r--src/render/geometry/qgeometryrenderer_p.h6
3 files changed, 27 insertions, 18 deletions
diff --git a/src/render/geometry/geometryrenderer.cpp b/src/render/geometry/geometryrenderer.cpp
index 6ff57ee43..bc89a968c 100644
--- a/src/render/geometry/geometryrenderer.cpp
+++ b/src/render/geometry/geometryrenderer.cpp
@@ -46,6 +46,9 @@
#include <Qt3DCore/qnodeaddedpropertychange.h>
#include <Qt3DCore/qnoderemovedpropertychange.h>
#include <Qt3DCore/private/qnode_p.h>
+#include <QtCore/qcoreapplication.h>
+
+#include <memory>
QT_BEGIN_NAMESPACE
@@ -191,15 +194,21 @@ void GeometryRenderer::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e)
void GeometryRenderer::executeFunctor()
{
Q_ASSERT(m_geometryFactory);
- QGeometry *geometry = (*m_geometryFactory)();
+ std::unique_ptr<QGeometry> geometry((*m_geometryFactory)());
+ if (!geometry)
+ return;
+
+ // Move the QGeometry object to the main thread and notify the
+ // corresponding QGeometryRenderer
+ const auto appThread = QCoreApplication::instance()->thread();
+ geometry->moveToThread(appThread);
- QBackendNodePropertyChangePtr e(new QBackendNodePropertyChange(peerId()));
+ auto e = QGeometryChangePtr::create(peerId());
e->setPropertyName("geometry");
- // The Frontend element has to perform the clone
- // So that the objects are created in the main thread
- e->setValue(QVariant::fromValue(QNodePtr(geometry, &QNodePrivate::nodePtrDeleter)));
+ e->data = std::move(geometry);
notifyObservers(e);
- // Maybe we could also send a status to help troubleshoot errors
+
+ // TODO: Maybe we could also send a status to help troubleshoot errors
}
void GeometryRenderer::unsetDirty()
diff --git a/src/render/geometry/qgeometryrenderer.cpp b/src/render/geometry/qgeometryrenderer.cpp
index 90a3fd662..716417bc5 100644
--- a/src/render/geometry/qgeometryrenderer.cpp
+++ b/src/render/geometry/qgeometryrenderer.cpp
@@ -406,18 +406,12 @@ void QGeometryRenderer::setGeometryFactory(const QGeometryFactoryPtr &factory)
*/
void QGeometryRenderer::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e)
{
- Q_UNUSED(e);
- // TODO: Avoid cloning here
-// Q_D(QGeometryRenderer);
-// QScenePropertyChangePtr change = qSharedPointerCast<QScenePropertyChange>(e);
-// if (change->type() == NodeUpdated && change->propertyName() == QByteArrayLiteral("geometry")) {
-// QNodePtr nodePtr = change->value().value<QNodePtr>();
-// QGeometry *backendGeometry = static_cast<QGeometry *>(nodePtr.data());
-// QGeometry *frontendGeometry = static_cast<QGeometry *>(QNode::clone(backendGeometry));
-// if (frontendGeometry != nullptr)
-// d->insertTree(frontendGeometry);
-// setGeometry(frontendGeometry);
-// }
+ auto change = qSharedPointerCast<QNodePropertyChangeBase>(e);
+ if (change->type() == NodeUpdated && change->propertyName() == QByteArrayLiteral("geometry")) {
+ auto typedChange = qSharedPointerCast<QGeometryChange>(e);
+ auto geometry = std::move(typedChange->data);
+ setGeometry(geometry.release());
+ }
}
Qt3DCore::QNodeCreatedChangeBasePtr QGeometryRenderer::createNodeCreationChange() const
diff --git a/src/render/geometry/qgeometryrenderer_p.h b/src/render/geometry/qgeometryrenderer_p.h
index d3ef46c4c..3341a7758 100644
--- a/src/render/geometry/qgeometryrenderer_p.h
+++ b/src/render/geometry/qgeometryrenderer_p.h
@@ -54,6 +54,8 @@
#include <Qt3DCore/private/qcomponent_p.h>
#include <Qt3DRender/qgeometryrenderer.h>
#include <Qt3DRender/qgeometryfactory.h>
+#include <Qt3DCore/qbackendnodepropertychange.h>
+#include <memory>
QT_BEGIN_NAMESPACE
@@ -91,6 +93,10 @@ struct QGeometryRendererData
QGeometryFactoryPtr geometryFactory;
};
+class QGeometry;
+typedef Qt3DCore::QTypedBackendNodePropertyChange<std::unique_ptr<QGeometry>> QGeometryChange;
+typedef Qt3DCore::QTypedBackendNodePropertyChangePtr<std::unique_ptr<QGeometry>> QGeometryChangePtr;
+
} // namespace Qt3DRender
QT_END_NAMESPACE