diff options
author | Sean Harmer <sean.harmer@kdab.com> | 2016-05-03 10:44:23 +0100 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2016-05-03 16:13:55 +0000 |
commit | 44ca2d31d278b4b744abfee818a92370daf7c343 (patch) | |
tree | 733bc33f67159ef3a45014e1bfaadbb50a317e4b /src/render/geometry | |
parent | 66da7cf6c57d7883fc6f67e460f57844619d5214 (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.cpp | 21 | ||||
-rw-r--r-- | src/render/geometry/qgeometryrenderer.cpp | 18 | ||||
-rw-r--r-- | src/render/geometry/qgeometryrenderer_p.h | 6 |
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 |