diff options
author | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2019-09-19 21:55:16 +0200 |
---|---|---|
committer | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2019-09-19 21:55:23 +0200 |
commit | d51dad630e0afb6ddca19ee61dd1ddf424fb49c2 (patch) | |
tree | 1ca0630bfb8af983950621399dbd4d0863afa568 | |
parent | c8dab9f129ba838988e2c0ae67071a0197e75045 (diff) | |
parent | 471ea347fde07cf5e48c586c47bf066220dc78c2 (diff) |
Merge "Merge remote-tracking branch 'origin/5.14' into 5.15"
109 files changed, 1737 insertions, 1949 deletions
diff --git a/src/animation/backend/animationutils.cpp b/src/animation/backend/animationutils.cpp index 92e614236..24c484dc2 100644 --- a/src/animation/backend/animationutils.cpp +++ b/src/animation/backend/animationutils.cpp @@ -453,6 +453,7 @@ QVector<Qt3DCore::QSceneChangePtr> preparePropertyChanges(Qt3DCore::QNodeId anim break; } } else { + // TODOSYNC remove once we've found a way to propagate animation changes // Construct a property update change, set target, property and delivery options auto e = Qt3DCore::QPropertyUpdatedChangePtr::create(mappingData.targetId); e->setDeliveryFlags(Qt3DCore::QSceneChange::DeliverToAll); @@ -469,6 +470,7 @@ QVector<Qt3DCore::QSceneChangePtr> preparePropertyChanges(Qt3DCore::QNodeId anim skeleton->sendLocalPoses(); if (isValidNormalizedTime(normalizedLocalTime)) { + // TODOSYNC remove once we've found a way to propagate animation changes auto e = Qt3DCore::QPropertyUpdatedChangePtr::create(animatorId); e->setDeliveryFlags(Qt3DCore::QSceneChange::DeliverToAll); e->setPropertyName("normalizedTime"); @@ -479,6 +481,7 @@ QVector<Qt3DCore::QSceneChangePtr> preparePropertyChanges(Qt3DCore::QNodeId anim // If it's the final frame, notify the frontend that we've stopped if (finalFrame) { + // TODOSYNC remove once we've found a way to propagate animation changes auto e = Qt3DCore::QPropertyUpdatedChangePtr::create(animatorId); e->setDeliveryFlags(Qt3DCore::QSceneChange::DeliverToAll); e->setPropertyName("running"); diff --git a/src/core/aspects/qaspectengine.cpp b/src/core/aspects/qaspectengine.cpp index 6d1a8ca30..426741a61 100644 --- a/src/core/aspects/qaspectengine.cpp +++ b/src/core/aspects/qaspectengine.cpp @@ -275,6 +275,7 @@ void QAspectEnginePrivate::initialize() arbiter->setPostman(m_postman); arbiter->setScene(m_scene); m_initialized = true; + m_aspectManager->setPostConstructorInit(m_scene->postConstructorInit()); #if QT_CONFIG(qt3d_profile_jobs) m_commandDebugger->setAspectEngine(q_func()); m_commandDebugger->initialize(); diff --git a/src/core/aspects/qaspectmanager.cpp b/src/core/aspects/qaspectmanager.cpp index 6bca77a9e..a33f771e9 100644 --- a/src/core/aspects/qaspectmanager.cpp +++ b/src/core/aspects/qaspectmanager.cpp @@ -374,6 +374,11 @@ QServiceLocator *QAspectManager::serviceLocator() const return m_serviceLocator.data(); } +void QAspectManager::setPostConstructorInit(NodePostConstructorInit *postConstructorInit) +{ + m_postConstructorInit = postConstructorInit; +} + /*! \internal \brief Drives the Qt3D simulation loop in the main thread @@ -429,6 +434,10 @@ void QAspectManager::processFrame() changeArbiterStats.startTime = QThreadPooler::m_jobsStatTimer.nsecsElapsed(); #endif + // Tell the NodePostConstructorInit to process any pending nodes which will add them to our list of + // tree changes + m_postConstructorInit->processNodes(); + // Add and Remove Nodes const QVector<NodeTreeChange> nodeTreeChanges = std::move(m_nodeTreeChanges); for (const NodeTreeChange &change : nodeTreeChanges) { diff --git a/src/core/aspects/qaspectmanager_p.h b/src/core/aspects/qaspectmanager_p.h index b39ad1f89..38ddbc55d 100644 --- a/src/core/aspects/qaspectmanager_p.h +++ b/src/core/aspects/qaspectmanager_p.h @@ -74,6 +74,7 @@ class QChangeArbiter; class QAbstractAspect; class QAbstractAspectJobManager; class QServiceLocator; +class NodePostConstructorInit; struct NodeTreeChange; class Q_3DCORE_PRIVATE_EXPORT QAspectManager : public QObject @@ -105,6 +106,7 @@ public: QAbstractAspectJobManager *jobManager() const; QChangeArbiter *changeArbiter() const; QServiceLocator *serviceLocator() const; + void setPostConstructorInit(NodePostConstructorInit *postConstructorInit); private: bool event(QEvent *event) override; @@ -121,6 +123,8 @@ private: bool m_simulationLoopRunning; QAspectEngine::RunMode m_driveMode; QVector<NodeTreeChange> m_nodeTreeChanges; + NodePostConstructorInit* m_postConstructorInit; + }; } // namespace Qt3DCore diff --git a/src/core/jobs/qthreadpooler.cpp b/src/core/jobs/qthreadpooler.cpp index 0e9af58dd..a9f4e7a31 100644 --- a/src/core/jobs/qthreadpooler.cpp +++ b/src/core/jobs/qthreadpooler.cpp @@ -183,7 +183,7 @@ int QThreadPooler::currentCount() const { // The caller have to set the mutex - return m_taskCount.load(); + return m_taskCount.loadRelaxed(); } int QThreadPooler::maxThreadCount() const diff --git a/src/core/jobs/task.cpp b/src/core/jobs/task.cpp index 4291a4779..091aabfd6 100644 --- a/src/core/jobs/task.cpp +++ b/src/core/jobs/task.cpp @@ -118,7 +118,7 @@ void SyncTaskRunnable::run() m_atomicCount->deref(); // Wait for the other worker threads to be done - while (m_atomicCount->load() > 0) + while (m_atomicCount->loadRelaxed() > 0) QThread::currentThread()->yieldCurrentThread(); if (m_pooler) diff --git a/src/core/nodes/qentity.cpp b/src/core/nodes/qentity.cpp index 546f1d670..0ff8c4646 100644 --- a/src/core/nodes/qentity.cpp +++ b/src/core/nodes/qentity.cpp @@ -295,13 +295,7 @@ void QEntity::onParentChanged(QObject *) if (!d->m_hasBackendNode) return; - const auto parentID = parentEntity() ? parentEntity()->id() : Qt3DCore::QNodeId(); - auto parentChange = Qt3DCore::QPropertyUpdatedChangePtr::create(id()); - parentChange->setPropertyName("parentEntityUpdated"); - parentChange->setValue(QVariant::fromValue(parentID)); - const bool blocked = blockNotifications(false); - notifyObservers(parentChange); - blockNotifications(blocked); + d->update(); } } // namespace Qt3DCore diff --git a/src/core/nodes/qnode_p.h b/src/core/nodes/qnode_p.h index 491059ff9..d8310731c 100644 --- a/src/core/nodes/qnode_p.h +++ b/src/core/nodes/qnode_p.h @@ -194,7 +194,7 @@ public: void removeNode(QNode *node); void addNode(QNode *node); -private Q_SLOTS: +public Q_SLOTS: void processNodes(); private: diff --git a/src/core/transforms/qjoint.cpp b/src/core/transforms/qjoint.cpp index 017773ff6..553fbd654 100644 --- a/src/core/transforms/qjoint.cpp +++ b/src/core/transforms/qjoint.cpp @@ -352,11 +352,8 @@ void QJoint::addChildJoint(QJoint *joint) // Ensures proper bookkeeping d->registerDestructionHelper(joint, &QJoint::removeChildJoint, d->m_childJoints); - if (d->m_changeArbiter != nullptr) { - const auto change = QPropertyNodeAddedChangePtr::create(id(), joint); - change->setPropertyName("childJoint"); - d->notifyObservers(change); - } + if (d->m_changeArbiter != nullptr) + d->update(); } } @@ -369,11 +366,8 @@ void QJoint::removeChildJoint(QJoint *joint) Q_D(QJoint); if (d->m_childJoints.contains(joint)) { - if (d->m_changeArbiter != nullptr) { - const auto change = QPropertyNodeRemovedChangePtr::create(id(), joint); - change->setPropertyName("childJoint"); - d->notifyObservers(change); - } + if (d->m_changeArbiter != nullptr) + d->update(); d->m_childJoints.removeOne(joint); diff --git a/src/core/transforms/qtransform.cpp b/src/core/transforms/qtransform.cpp index bedf108f2..e5902f11f 100644 --- a/src/core/transforms/qtransform.cpp +++ b/src/core/transforms/qtransform.cpp @@ -239,12 +239,13 @@ QTransform::QTransform(QTransformPrivate &dd, QNode *parent) */ void QTransform::sceneChangeEvent(const QSceneChangePtr &change) { + Q_D(QTransform); switch (change->type()) { case PropertyUpdated: { Qt3DCore::QPropertyUpdatedChangePtr propertyChange = qSharedPointerCast<Qt3DCore::QPropertyUpdatedChange>(change); if (propertyChange->propertyName() == QByteArrayLiteral("worldMatrix")) { const bool blocked = blockNotifications(true); - setWorldMatrix(propertyChange->value().value<QMatrix4x4>()); + d->setWorldMatrix(propertyChange->value().value<QMatrix4x4>()); blockNotifications(blocked); } break; @@ -254,13 +255,13 @@ void QTransform::sceneChangeEvent(const QSceneChangePtr &change) } } -void QTransform::setWorldMatrix(const QMatrix4x4 &worldMatrix) +void QTransformPrivate::setWorldMatrix(const QMatrix4x4 &worldMatrix) { - Q_D(QTransform); - if (d->m_worldMatrix == worldMatrix) + Q_Q(QTransform); + if (m_worldMatrix == worldMatrix) return; - d->m_worldMatrix = worldMatrix; - emit worldMatrixChanged(worldMatrix); + m_worldMatrix = worldMatrix; + emit q->worldMatrixChanged(worldMatrix); } void QTransform::setMatrix(const QMatrix4x4 &m) diff --git a/src/core/transforms/qtransform.h b/src/core/transforms/qtransform.h index 527760df7..503ea4d4a 100644 --- a/src/core/transforms/qtransform.h +++ b/src/core/transforms/qtransform.h @@ -120,7 +120,6 @@ Q_SIGNALS: protected: explicit QTransform(QTransformPrivate &dd, QNode *parent = nullptr); void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &change) override; - void setWorldMatrix(const QMatrix4x4 &worldMatrix); private: Q_DECLARE_PRIVATE(QTransform) diff --git a/src/core/transforms/qtransform_p.h b/src/core/transforms/qtransform_p.h index d44e5e157..028a9aba7 100644 --- a/src/core/transforms/qtransform_p.h +++ b/src/core/transforms/qtransform_p.h @@ -77,6 +77,8 @@ public: mutable bool m_matrixDirty; QMatrix4x4 m_worldMatrix; + + void setWorldMatrix(const QMatrix4x4 &worldMatrix); }; struct QTransformData diff --git a/src/extras/defaults/qforwardrenderer.cpp b/src/extras/defaults/qforwardrenderer.cpp index 22a471cec..dd3c872cc 100644 --- a/src/extras/defaults/qforwardrenderer.cpp +++ b/src/extras/defaults/qforwardrenderer.cpp @@ -239,11 +239,13 @@ QColor QForwardRenderer::clearColor() const \qmlproperty color ForwardRenderer::clearBuffers Holds the current buffers to be cleared. Default value is ColorDepthBuffer + \since 5.14 */ /*! \property QForwardRenderer::clearBuffers Holds the current buffers to be cleared. Default value is ColorDepthBuffer + \since 5.14 */ QClearBuffers::BufferType QForwardRenderer::clearBuffers() const { diff --git a/src/extras/defaults/qforwardrenderer.h b/src/extras/defaults/qforwardrenderer.h index 6d01a0ded..0b53a094b 100644 --- a/src/extras/defaults/qforwardrenderer.h +++ b/src/extras/defaults/qforwardrenderer.h @@ -61,7 +61,7 @@ class Q_3DEXTRASSHARED_EXPORT QForwardRenderer : public Qt3DRender::QTechniqueFi Q_PROPERTY(QObject *window READ surface WRITE setSurface NOTIFY surfaceChanged) Q_PROPERTY(QRectF viewportRect READ viewportRect WRITE setViewportRect NOTIFY viewportRectChanged) Q_PROPERTY(QColor clearColor READ clearColor WRITE setClearColor NOTIFY clearColorChanged) - Q_PROPERTY(Qt3DRender::QClearBuffers::BufferType clearBuffers READ clearBuffers WRITE setClearBuffers NOTIFY clearBuffersChanged) + Q_PROPERTY(Qt3DRender::QClearBuffers::BufferType clearBuffers READ clearBuffers WRITE setClearBuffers NOTIFY clearBuffersChanged REVISION 14) Q_PROPERTY(Qt3DCore::QEntity *camera READ camera WRITE setCamera NOTIFY cameraChanged) Q_PROPERTY(QSize externalRenderTargetSize READ externalRenderTargetSize WRITE setExternalRenderTargetSize NOTIFY externalRenderTargetSizeChanged) Q_PROPERTY(bool frustumCulling READ isFrustumCullingEnabled WRITE setFrustumCullingEnabled NOTIFY frustumCullingEnabledChanged) diff --git a/src/quick3d/imports/extras/qt3dquick3dextrasplugin.cpp b/src/quick3d/imports/extras/qt3dquick3dextrasplugin.cpp index 91ec85795..b675ec283 100644 --- a/src/quick3d/imports/extras/qt3dquick3dextrasplugin.cpp +++ b/src/quick3d/imports/extras/qt3dquick3dextrasplugin.cpp @@ -87,6 +87,7 @@ void Qt3DQuick3DExtrasPlugin::registerTypes(const char *uri) // Framegraphs qmlRegisterType<Qt3DExtras::QForwardRenderer>(uri, 2, 0, "ForwardRenderer"); qmlRegisterType<Qt3DExtras::QForwardRenderer, 9>(uri, 2, 9, "ForwardRenderer"); + qmlRegisterType<Qt3DExtras::QForwardRenderer, 14>(uri, 2, 14, "ForwardRenderer"); // Entities qmlRegisterType<Qt3DExtras::QSkyboxEntity>(uri, 2, 0, "SkyboxEntity"); diff --git a/src/quick3d/imports/render/qt3dquick3drenderplugin.cpp b/src/quick3d/imports/render/qt3dquick3drenderplugin.cpp index ce19d35ed..e16314c8e 100644 --- a/src/quick3d/imports/render/qt3dquick3drenderplugin.cpp +++ b/src/quick3d/imports/render/qt3dquick3drenderplugin.cpp @@ -239,6 +239,7 @@ void Qt3DQuick3DRenderPlugin::registerTypes(const char *uri) qmlRegisterType<Qt3DRender::QObjectPicker, 9>(uri, 2, 9, "ObjectPicker"); qmlRegisterType<Qt3DRender::QObjectPicker, 13>(uri, 2, 13, "ObjectPicker"); qmlRegisterUncreatableType<Qt3DRender::QPickEvent>(uri, 2, 0, "PickEvent", QStringLiteral("Events cannot be created")); + qmlRegisterUncreatableType<Qt3DRender::QPickEvent, 14>(uri, 2, 14, "PickEvent", QStringLiteral("Events cannot be created")); qmlRegisterType<Qt3DRender::Render::Quick::Quick3DRayCaster>(uri, 2, 11, "RayCaster"); qmlRegisterType<Qt3DRender::Render::Quick::Quick3DScreenRayCaster>(uri, 2, 11, "ScreenRayCaster"); @@ -297,7 +298,7 @@ void Qt3DQuick3DRenderPlugin::registerTypes(const char *uri) qmlRegisterType<Qt3DRender::QBlendEquationArguments>(uri, 2, 0, "BlendEquationArguments"); qmlRegisterType<Qt3DRender::QBlendEquation>(uri, 2, 0, "BlendEquation"); qmlRegisterType<Qt3DRender::QAlphaTest>(uri, 2, 0, "AlphaTest"); - qmlRegisterType<Qt3DRender::QDepthRange>(uri, 2, 13, "DepthRange"); + qmlRegisterType<Qt3DRender::QDepthRange>(uri, 2, 14, "DepthRange"); qmlRegisterType<Qt3DRender::QDepthTest>(uri, 2, 0, "DepthTest"); qmlRegisterType<Qt3DRender::QMultiSampleAntiAliasing>(uri, 2, 0, "MultiSampleAntiAliasing"); qmlRegisterType<Qt3DRender::QNoDepthMask>(uri, 2, 0, "NoDepthMask"); diff --git a/src/quick3d/quick3dscene2d/items/scene2d.cpp b/src/quick3d/quick3dscene2d/items/scene2d.cpp index 27ab7f010..562f0d2c7 100644 --- a/src/quick3d/quick3dscene2d/items/scene2d.cpp +++ b/src/quick3d/quick3dscene2d/items/scene2d.cpp @@ -443,7 +443,7 @@ void Scene2D::cleanup() } if (m_renderThread) { renderThreadClientCount->fetchAndSubAcquire(1); - if (renderThreadClientCount->load() == 0) + if (renderThreadClientCount->loadRelaxed() == 0) renderThread->quit(); } } diff --git a/src/render/backend/entity.cpp b/src/render/backend/entity.cpp index bf128b508..d8520a97e 100644 --- a/src/render/backend/entity.cpp +++ b/src/render/backend/entity.cpp @@ -145,44 +145,6 @@ void Entity::setHandle(HEntity handle) m_handle = handle; } -void Entity::initializeFromPeer(const QNodeCreatedChangeBasePtr &change) -{ - const auto typedChange = qSharedPointerCast<QNodeCreatedChange<Qt3DCore::QEntityData>>(change); - const auto &data = typedChange->data; - - // Note this is *not* the parentId as that is the ID of the parent QNode, which is not - // necessarily the same as the parent QEntity (which may be further up the tree). - m_parentEntityId = data.parentEntityId; - qCDebug(Render::RenderNodes) << "Creating Entity id =" << peerId() << "parentId =" << m_parentEntityId; - - // TODO: Store string id instead and only in debug mode - //m_objectName = peer->objectName(); - m_worldTransform = m_nodeManagers->worldMatrixManager()->getOrAcquireHandle(peerId()); - - // TODO: Suboptimal -> Maybe have a Hash<QComponent, QEntityList> instead - m_transformComponent = QNodeId(); - m_materialComponent = QNodeId(); - m_cameraComponent = QNodeId(); - m_geometryRendererComponent = QNodeId(); - m_objectPickerComponent = QNodeId(); - m_boundingVolumeDebugComponent = QNodeId(); - m_computeComponent = QNodeId(); - m_layerComponents.clear(); - m_levelOfDetailComponents.clear(); - m_rayCasterComponents.clear(); - m_shaderDataComponents.clear(); - m_lightComponents.clear(); - m_environmentLightComponents.clear(); - m_localBoundingVolume = QSharedPointer<Sphere>::create(peerId()); - m_worldBoundingVolume = QSharedPointer<Sphere>::create(peerId()); - m_worldBoundingVolumeWithChildren = QSharedPointer<Sphere>::create(peerId()); - - for (const auto &idAndType : qAsConst(data.componentIdsAndTypes)) - addComponent(idAndType); - - markDirty(AbstractRenderer::EntityHierarchyDirty); -} - void Entity::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) { switch (e->type()) { @@ -192,7 +154,6 @@ void Entity::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) const auto componentIdAndType = QNodeIdTypePair(change->componentId(), change->componentMetaObject()); addComponent(componentIdAndType); qCDebug(Render::RenderNodes) << Q_FUNC_INFO << "Component Added. Id =" << change->componentId(); - markDirty(AbstractRenderer::AllDirty); break; } @@ -200,27 +161,6 @@ void Entity::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) QComponentRemovedChangePtr change = qSharedPointerCast<QComponentRemovedChange>(e); removeComponent(change->componentId()); qCDebug(Render::RenderNodes) << Q_FUNC_INFO << "Component Removed. Id =" << change->componentId(); - markDirty(AbstractRenderer::AllDirty); - break; - } - - case PropertyUpdated: { - QPropertyUpdatedChangePtr change = qSharedPointerCast<QPropertyUpdatedChange>(e); - if (change->propertyName() == QByteArrayLiteral("enabled")) { - // We only mark as dirty the renderer - markDirty(AbstractRenderer::EntityEnabledDirty); - // We let QBackendNode::sceneChangeEvent change the enabled property - } else if (change->propertyName() == QByteArrayLiteral("parentEntityUpdated")) { - auto newParent = change->value().value<Qt3DCore::QNodeId>(); - qCDebug(Render::RenderNodes) << "Setting parent for " << peerId() << ", new parentId =" << newParent; - if (m_parentEntityId != newParent) { - m_parentEntityId = newParent; - // TODO: change to EventHierarchyDirty and update renderer to - // ensure all jobs are run that depend on Entity hierarchy. - markDirty(AbstractRenderer::AllDirty); - } - } - break; } @@ -230,6 +170,58 @@ void Entity::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) BackendNode::sceneChangeEvent(e); } +void Entity::syncFromFrontEnd(const QNode *frontEnd, bool firstTime) +{ + const Qt3DCore::QEntity *node = qobject_cast<const Qt3DCore::QEntity *>(frontEnd); + if (!node) + return; + + if (this->isEnabled() != node->isEnabled()) { + markDirty(AbstractRenderer::EntityEnabledDirty); + // We let QBackendNode::syncFromFrontEnd change the enabled property + } + + const auto parentID = node->parentEntity() ? node->parentEntity()->id() : Qt3DCore::QNodeId(); + if (m_parentEntityId != parentID) { + m_parentEntityId = parentID; + // TODO: change to EventHierarchyDirty and update renderer to + // ensure all jobs are run that depend on Entity hierarchy. + markDirty(AbstractRenderer::AllDirty); + } + + if (firstTime) { + m_worldTransform = m_nodeManagers->worldMatrixManager()->getOrAcquireHandle(peerId()); + + // TODO: Suboptimal -> Maybe have a Hash<QComponent, QEntityList> instead + m_transformComponent = QNodeId(); + m_materialComponent = QNodeId(); + m_cameraComponent = QNodeId(); + m_geometryRendererComponent = QNodeId(); + m_objectPickerComponent = QNodeId(); + m_boundingVolumeDebugComponent = QNodeId(); + m_computeComponent = QNodeId(); + m_layerComponents.clear(); + m_levelOfDetailComponents.clear(); + m_rayCasterComponents.clear(); + m_shaderDataComponents.clear(); + m_lightComponents.clear(); + m_environmentLightComponents.clear(); + m_localBoundingVolume = QSharedPointer<Sphere>::create(peerId()); + m_worldBoundingVolume = QSharedPointer<Sphere>::create(peerId()); + m_worldBoundingVolumeWithChildren = QSharedPointer<Sphere>::create(peerId()); + + const QComponentVector &components = node->components(); + for (QComponent *c : components) { + const auto idAndType = QNodeIdTypePair(c->id(), QNodePrivate::findStaticMetaObject(c->metaObject())); + addComponent(idAndType); + } + + markDirty(AbstractRenderer::EntityHierarchyDirty); + } + + BackendNode::syncFromFrontEnd(frontEnd, firstTime); +} + void Entity::dump() const { static int depth = 0; @@ -358,6 +350,7 @@ void Entity::addComponent(Qt3DCore::QNodeIdTypePair idAndType) } else if (type->inherits(&QArmature::staticMetaObject)) { m_armatureComponent = id; } + markDirty(AbstractRenderer::AllDirty); } void Entity::removeComponent(Qt3DCore::QNodeId nodeId) @@ -392,6 +385,7 @@ void Entity::removeComponent(Qt3DCore::QNodeId nodeId) } else if (m_armatureComponent == nodeId) { m_armatureComponent = QNodeId(); } + markDirty(AbstractRenderer::AllDirty); } bool Entity::isBoundingVolumeDirty() const diff --git a/src/render/backend/entity_p.h b/src/render/backend/entity_p.h index b4c9541f2..493774feb 100644 --- a/src/render/backend/entity_p.h +++ b/src/render/backend/entity_p.h @@ -90,6 +90,7 @@ public: void setParentHandle(HEntity parentHandle); void setNodeManagers(NodeManagers *manager); void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) override; + void syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime) override; void dump() const; @@ -178,10 +179,7 @@ public: return containsComponentsOfType<T>() && containsComponentsOfType<Ts, Ts2...>(); } - private: - void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) final; - NodeManagers *m_nodeManagers; HEntity m_handle; HEntity m_parentHandle; diff --git a/src/render/backend/transform.cpp b/src/render/backend/transform.cpp index 390ed4f05..6659657fa 100644 --- a/src/render/backend/transform.cpp +++ b/src/render/backend/transform.cpp @@ -68,17 +68,6 @@ void Transform::cleanup() QBackendNode::setEnabled(false); } -void Transform::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) -{ - const auto typedChange = qSharedPointerCast<Qt3DCore::QNodeCreatedChange<QTransformData>>(change); - const auto &data = typedChange->data; - m_rotation = data.rotation; - m_scale = data.scale; - m_translation = data.translation; - updateMatrix(); - markDirty(AbstractRenderer::TransformDirty); -} - Matrix4x4 Transform::transformMatrix() const { return m_transformMatrix; @@ -99,6 +88,7 @@ QVector3D Transform::translation() const return m_translation; } +// TODOSYNC remove once we've found a way to propagate animation changes void Transform::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) { // TODO: Flag the matrix as dirty and update all matrices batched in a job @@ -120,6 +110,27 @@ void Transform::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) BackendNode::sceneChangeEvent(e); } +void Transform::syncFromFrontEnd(const QNode *frontEnd, bool firstTime) +{ + const Qt3DCore::QTransform *transform = qobject_cast<const Qt3DCore::QTransform *>(frontEnd); + if (!transform) + return; + + bool dirty = m_rotation != transform->rotation(); + m_rotation = transform->rotation(); + dirty |= m_scale != transform->scale3D(); + m_scale = transform->scale3D(); + dirty |= m_translation != transform->translation(); + m_translation = transform->translation(); + + if (dirty || firstTime) { + updateMatrix(); + markDirty(AbstractRenderer::TransformDirty); + } + + BackendNode::syncFromFrontEnd(frontEnd, firstTime); +} + void Transform::notifyWorldTransformChanged(const Matrix4x4 &worldMatrix) { auto change = Qt3DCore::QPropertyUpdatedChangePtr::create(peerId()); diff --git a/src/render/backend/transform_p.h b/src/render/backend/transform_p.h index e3bcad317..50857ac94 100644 --- a/src/render/backend/transform_p.h +++ b/src/render/backend/transform_p.h @@ -77,12 +77,11 @@ public: QVector3D translation() const; void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) override; + void syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime) final; void notifyWorldTransformChanged(const Matrix4x4 &worldMatrix); private: void updateMatrix(); - void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) final; - Matrix4x4 m_transformMatrix; QQuaternion m_rotation; QVector3D m_scale; diff --git a/src/render/frontend/qrenderaspect.cpp b/src/render/frontend/qrenderaspect.cpp index 35eff052b..f33af9ebd 100644 --- a/src/render/frontend/qrenderaspect.cpp +++ b/src/render/frontend/qrenderaspect.cpp @@ -252,8 +252,8 @@ void QRenderAspectPrivate::registerBackendTypes() qRegisterMetaType<Qt3DRender::QViewport*>(); qRegisterMetaType<Qt3DCore::QJoint*>(); - q->registerBackendType<Qt3DCore::QEntity>(QSharedPointer<Render::RenderEntityFunctor>::create(m_renderer, m_nodeManagers)); - q->registerBackendType<Qt3DCore::QTransform>(QSharedPointer<Render::NodeFunctor<Render::Transform, Render::TransformManager> >::create(m_renderer)); + q->registerBackendType<Qt3DCore::QEntity, true>(QSharedPointer<Render::RenderEntityFunctor>::create(m_renderer, m_nodeManagers)); + q->registerBackendType<Qt3DCore::QTransform, true>(QSharedPointer<Render::NodeFunctor<Render::Transform, Render::TransformManager> >::create(m_renderer)); q->registerBackendType<Qt3DRender::QCameraLens>(QSharedPointer<Render::CameraLensFunctor>::create(m_renderer, q)); q->registerBackendType<QLayer>(QSharedPointer<Render::NodeFunctor<Render::Layer, Render::LayerManager> >::create(m_renderer)); @@ -266,32 +266,32 @@ void QRenderAspectPrivate::registerBackendTypes() q->registerBackendType<QRenderState>(QSharedPointer<Render::NodeFunctor<Render::RenderStateNode, Render::RenderStateManager> >::create(m_renderer)); // Geometry + Compute - q->registerBackendType<QAttribute>(QSharedPointer<Render::NodeFunctor<Render::Attribute, Render::AttributeManager> >::create(m_renderer)); - q->registerBackendType<QBuffer>(QSharedPointer<Render::BufferFunctor>::create(m_renderer, m_nodeManagers->bufferManager())); + q->registerBackendType<QAttribute, true>(QSharedPointer<Render::NodeFunctor<Render::Attribute, Render::AttributeManager> >::create(m_renderer)); + q->registerBackendType<QBuffer, true>(QSharedPointer<Render::BufferFunctor>::create(m_renderer, m_nodeManagers->bufferManager())); q->registerBackendType<QComputeCommand>(QSharedPointer<Render::NodeFunctor<Render::ComputeCommand, Render::ComputeCommandManager> >::create(m_renderer)); - q->registerBackendType<QGeometry>(QSharedPointer<Render::NodeFunctor<Render::Geometry, Render::GeometryManager> >::create(m_renderer)); - q->registerBackendType<QGeometryRenderer>(QSharedPointer<Render::GeometryRendererFunctor>::create(m_renderer, m_nodeManagers->geometryRendererManager())); - q->registerBackendType<Qt3DCore::QArmature>(QSharedPointer<Render::NodeFunctor<Render::Armature, Render::ArmatureManager>>::create(m_renderer)); - q->registerBackendType<Qt3DCore::QAbstractSkeleton>(QSharedPointer<Render::SkeletonFunctor>::create(m_renderer, m_nodeManagers->skeletonManager(), m_nodeManagers->jointManager())); - q->registerBackendType<Qt3DCore::QJoint>(QSharedPointer<Render::JointFunctor>::create(m_renderer, m_nodeManagers->jointManager(), m_nodeManagers->skeletonManager())); + q->registerBackendType<QGeometry, true>(QSharedPointer<Render::NodeFunctor<Render::Geometry, Render::GeometryManager> >::create(m_renderer)); + q->registerBackendType<QGeometryRenderer, true>(QSharedPointer<Render::GeometryRendererFunctor>::create(m_renderer, m_nodeManagers->geometryRendererManager())); + q->registerBackendType<Qt3DCore::QArmature, true>(QSharedPointer<Render::NodeFunctor<Render::Armature, Render::ArmatureManager>>::create(m_renderer)); + q->registerBackendType<Qt3DCore::QAbstractSkeleton, true>(QSharedPointer<Render::SkeletonFunctor>::create(m_renderer, m_nodeManagers->skeletonManager(), m_nodeManagers->jointManager())); + q->registerBackendType<Qt3DCore::QJoint, true>(QSharedPointer<Render::JointFunctor>::create(m_renderer, m_nodeManagers->jointManager(), m_nodeManagers->skeletonManager())); // Textures - q->registerBackendType<QAbstractTexture>(QSharedPointer<Render::TextureFunctor>::create(m_renderer, m_nodeManagers->textureManager())); + q->registerBackendType<QAbstractTexture, true>(QSharedPointer<Render::TextureFunctor>::create(m_renderer, m_nodeManagers->textureManager())); q->registerBackendType<QAbstractTextureImage>(QSharedPointer<Render::TextureImageFunctor>::create(m_renderer, m_nodeManagers->textureImageManager())); // Material system - q->registerBackendType<QEffect>(QSharedPointer<Render::NodeFunctor<Render::Effect, Render::EffectManager> >::create(m_renderer)); + q->registerBackendType<QEffect, true>(QSharedPointer<Render::NodeFunctor<Render::Effect, Render::EffectManager> >::create(m_renderer)); q->registerBackendType<QFilterKey>(QSharedPointer<Render::NodeFunctor<Render::FilterKey, Render::FilterKeyManager> >::create(m_renderer)); - q->registerBackendType<QAbstractLight>(QSharedPointer<Render::RenderLightFunctor>::create(m_renderer, m_nodeManagers)); - q->registerBackendType<QEnvironmentLight>(QSharedPointer<Render::NodeFunctor<Render::EnvironmentLight, Render::EnvironmentLightManager> >::create(m_renderer)); - q->registerBackendType<QMaterial>(QSharedPointer<Render::NodeFunctor<Render::Material, Render::MaterialManager> >::create(m_renderer)); - q->registerBackendType<QParameter>(QSharedPointer<Render::NodeFunctor<Render::Parameter, Render::ParameterManager> >::create(m_renderer)); - q->registerBackendType<QRenderPass>(QSharedPointer<Render::NodeFunctor<Render::RenderPass, Render::RenderPassManager> >::create(m_renderer)); + q->registerBackendType<QAbstractLight, true>(QSharedPointer<Render::RenderLightFunctor>::create(m_renderer, m_nodeManagers)); + q->registerBackendType<QEnvironmentLight, true>(QSharedPointer<Render::NodeFunctor<Render::EnvironmentLight, Render::EnvironmentLightManager> >::create(m_renderer)); + q->registerBackendType<QMaterial, true>(QSharedPointer<Render::NodeFunctor<Render::Material, Render::MaterialManager> >::create(m_renderer)); + q->registerBackendType<QParameter, true>(QSharedPointer<Render::NodeFunctor<Render::Parameter, Render::ParameterManager> >::create(m_renderer)); + q->registerBackendType<QRenderPass, true>(QSharedPointer<Render::NodeFunctor<Render::RenderPass, Render::RenderPassManager> >::create(m_renderer)); q->registerBackendType<QShaderData>(QSharedPointer<Render::RenderShaderDataFunctor>::create(m_renderer, m_nodeManagers)); q->registerBackendType<QShaderProgram>(QSharedPointer<Render::NodeFunctor<Render::Shader, Render::ShaderManager> >::create(m_renderer)); q->registerBackendType<QShaderProgramBuilder>(QSharedPointer<Render::NodeFunctor<Render::ShaderBuilder, Render::ShaderBuilderManager> >::create(m_renderer)); - q->registerBackendType<QTechnique>(QSharedPointer<Render::TechniqueFunctor>::create(m_renderer, m_nodeManagers)); + q->registerBackendType<QTechnique, true>(QSharedPointer<Render::TechniqueFunctor>::create(m_renderer, m_nodeManagers)); q->registerBackendType<QShaderImage>(QSharedPointer<Render::NodeFunctor<Render::ShaderImage, Render::ShaderImageManager>>::create(m_renderer)); // Framegraph diff --git a/src/render/geometry/armature.cpp b/src/render/geometry/armature.cpp index 15a26c9ec..cfa2e572a 100644 --- a/src/render/geometry/armature.cpp +++ b/src/render/geometry/armature.cpp @@ -36,6 +36,8 @@ #include "armature_p.h" +#include <Qt3DCore/qarmature.h> +#include <Qt3DCore/qabstractskeleton.h> #include <Qt3DCore/qpropertyupdatedchange.h> #include <Qt3DCore/private/qarmature_p.h> @@ -52,32 +54,20 @@ Armature::Armature() { } -void Armature::cleanup() +void Armature::syncFromFrontEnd(const QNode *frontEnd, bool firstTime) { - m_skeletonId = Qt3DCore::QNodeId(); - setEnabled(false); -} + BackendNode::syncFromFrontEnd(frontEnd, firstTime); + const QArmature *node = qobject_cast<const QArmature *>(frontEnd); + if (!node) + return; -void Armature::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) -{ - const auto typedChange = qSharedPointerCast<QNodeCreatedChange<QArmatureData>>(change); - m_skeletonId = typedChange->data.skeletonId; + m_skeletonId = node->skeleton() ? node->skeleton()->id() : QNodeId{}; } -void Armature::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) +void Armature::cleanup() { - switch (e->type()) { - case Qt3DCore::PropertyUpdated: { - const auto change = qSharedPointerCast<QPropertyUpdatedChange>(e); - if (change->propertyName() == QByteArrayLiteral("skeleton")) - m_skeletonId = change->value().value<QNodeId>(); - break; - } - - default: - break; - } - QBackendNode::sceneChangeEvent(e); + m_skeletonId = Qt3DCore::QNodeId(); + setEnabled(false); } } // namespace Render diff --git a/src/render/geometry/armature_p.h b/src/render/geometry/armature_p.h index 3e6e52a3f..39baa4a79 100644 --- a/src/render/geometry/armature_p.h +++ b/src/render/geometry/armature_p.h @@ -63,7 +63,7 @@ class Q_AUTOTEST_EXPORT Armature : public BackendNode public: Armature(); - void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) override; + void syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime) override; void cleanup(); Qt3DCore::QNodeId skeletonId() const { return m_skeletonId; } @@ -73,8 +73,6 @@ public: const UniformValue &skinningPaletteUniform() const { return m_skinningPaletteUniform; } private: - void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) final; - Qt3DCore::QNodeId m_skeletonId; UniformValue m_skinningPaletteUniform; }; diff --git a/src/render/geometry/attribute.cpp b/src/render/geometry/attribute.cpp index bc6b27851..f241a85e5 100644 --- a/src/render/geometry/attribute.cpp +++ b/src/render/geometry/attribute.cpp @@ -83,78 +83,54 @@ void Attribute::cleanup() m_nameId = 0; } -void Attribute::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) +void Attribute::syncFromFrontEnd(const QNode *frontEnd, bool firstTime) { - const auto typedChange = qSharedPointerCast<Qt3DCore::QNodeCreatedChange<QAttributeData>>(change); - const auto &data = typedChange->data; - m_bufferId = data.bufferId; - m_name = data.name; - m_nameId = StringToInt::lookupId(m_name); - m_vertexBaseType = data.vertexBaseType; - m_vertexSize = data.vertexSize; - m_count = data.count; - m_byteStride = data.byteStride; - m_byteOffset = data.byteOffset; - m_divisor = data.divisor; - m_attributeType = data.attributeType; - m_attributeDirty = true; -} - -/*! - \fn Qt3DRender::QAttribute::dataSizeChanged(uint vertexSize) - - The signal is emitted with \a vertexSize when the dataSize changes. - -*/ -/*! - \fn Qt3DRender::QAttribute::dataTypeChanged(Qt3DRender::QAttribute::VertexBaseType vertexBaseType) - - The signal is emitted with \a vertexBaseType when the dataType changed. -*/ -void Attribute::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) -{ - switch (e->type()) { - case PropertyUpdated: { - QPropertyUpdatedChangePtr propertyChange = qSharedPointerCast<QPropertyUpdatedChange>(e); - QByteArray propertyName = propertyChange->propertyName(); - - if (propertyName == QByteArrayLiteral("name")) { - m_name = propertyChange->value().toString(); - m_nameId = StringToInt::lookupId(m_name); - m_attributeDirty = true; - } else if (propertyName == QByteArrayLiteral("vertexBaseType")) { - m_vertexBaseType = static_cast<QAttribute::VertexBaseType>(propertyChange->value().value<int>()); - m_attributeDirty = true; - } else if (propertyName == QByteArrayLiteral("vertexSize")) { - m_vertexSize = propertyChange->value().value<uint>(); - m_attributeDirty = true; - } else if (propertyName == QByteArrayLiteral("count")) { - m_count = propertyChange->value().value<uint>(); - m_attributeDirty = true; - } else if (propertyName == QByteArrayLiteral("byteStride")) { - m_byteStride = propertyChange->value().value<uint>(); - m_attributeDirty = true; - } else if (propertyName == QByteArrayLiteral("byteOffset")) { - m_byteOffset = propertyChange->value().value<uint>(); - m_attributeDirty = true; - } else if (propertyName == QByteArrayLiteral("divisor")) { - m_divisor = propertyChange->value().value<uint>(); - m_attributeDirty = true; - } else if (propertyName == QByteArrayLiteral("attributeType")) { - m_attributeType = static_cast<QAttribute::AttributeType>(propertyChange->value().value<int>()); - m_attributeDirty = true; - } else if (propertyName == QByteArrayLiteral("buffer")) { - m_bufferId = propertyChange->value().value<QNodeId>(); - m_attributeDirty = true; - } - markDirty(AbstractRenderer::AllDirty); - break; + BackendNode::syncFromFrontEnd(frontEnd, firstTime); + const QAttribute *node = qobject_cast<const QAttribute *>(frontEnd); + if (!node) + return; + + m_attributeDirty = firstTime; + if (m_name != node->name()) { + m_name = node->name(); + m_nameId = StringToInt::lookupId(m_name); + m_attributeDirty = true; } - - default: - break; + if (m_vertexBaseType != node->vertexBaseType()) { + m_vertexBaseType = node->vertexBaseType(); + m_attributeDirty = true; } - BackendNode::sceneChangeEvent(e); + if (m_vertexSize != node->vertexSize()) { + m_vertexSize = node->vertexSize(); + m_attributeDirty = true; + } + if (m_count != node->count()) { + m_count = node->count(); + m_attributeDirty = true; + } + if (m_byteStride != node->byteStride()) { + m_byteStride = node->byteStride(); + m_attributeDirty = true; + } + if (m_byteOffset != node->byteOffset()) { + m_byteOffset = node->byteOffset(); + m_attributeDirty = true; + } + if (m_divisor != node->divisor()) { + m_divisor = node->divisor(); + m_attributeDirty = true; + } + if (m_attributeType != node->attributeType()) { + m_attributeType = node->attributeType(); + m_attributeDirty = true; + } + const auto bufferId = node->buffer() ? node->buffer()->id() : QNodeId{}; + if (bufferId != m_bufferId) { + m_bufferId = bufferId; + m_attributeDirty = true; + } + + markDirty(AbstractRenderer::AllDirty); } void Attribute::unsetDirty() diff --git a/src/render/geometry/attribute_p.h b/src/render/geometry/attribute_p.h index e01537605..4b47146e1 100644 --- a/src/render/geometry/attribute_p.h +++ b/src/render/geometry/attribute_p.h @@ -68,7 +68,7 @@ public: void cleanup(); - void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) override; + void syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime) override; inline Qt3DCore::QNodeId bufferId() const { return m_bufferId; } inline QString name() const { return m_name; } @@ -84,8 +84,6 @@ public: void unsetDirty(); private: - void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) final; - Qt3DCore::QNodeId m_bufferId; QString m_name; int m_nameId; diff --git a/src/render/geometry/buffer.cpp b/src/render/geometry/buffer.cpp index d60f89c7d..998db3640 100644 --- a/src/render/geometry/buffer.cpp +++ b/src/render/geometry/buffer.cpp @@ -113,28 +113,6 @@ void Buffer::updateDataFromGPUToCPU(QByteArray data) notifyObservers(e); } -void Buffer::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) -{ - const auto typedChange = qSharedPointerCast<Qt3DCore::QNodeCreatedChange<QBufferData>>(change); - const auto &data = typedChange->data; - m_data = data.data; - m_usage = data.usage; - m_syncData = data.syncData; - m_access = data.access; - m_bufferDirty = true; - - if (!m_data.isEmpty()) - forceDataUpload(); - - m_functor = data.functor; - Q_ASSERT(m_manager); - if (m_functor) - m_manager->addDirtyBuffer(peerId()); - - m_manager->addBufferReference(peerId()); - markDirty(AbstractRenderer::BuffersDirty); -} - void Buffer::forceDataUpload() { // We push back an update with offset = -1 @@ -145,40 +123,50 @@ void Buffer::forceDataUpload() m_bufferUpdates.push_back(updateNewData); } -void Buffer::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) +void Buffer::syncFromFrontEnd(const QNode *frontEnd, bool firstTime) { - if (e->type() == PropertyUpdated) { - QPropertyUpdatedChangePtr propertyChange = qSharedPointerCast<QPropertyUpdatedChange>(e); - QByteArray propertyName = propertyChange->propertyName(); - if (propertyName == QByteArrayLiteral("data")) { - QByteArray newData = propertyChange->value().toByteArray(); + BackendNode::syncFromFrontEnd(frontEnd, firstTime); + const QBuffer *node = qobject_cast<const QBuffer *>(frontEnd); + if (!node) + return; + + if (firstTime && m_manager != nullptr) + m_manager->addBufferReference(peerId()); + + m_syncData = node->isSyncData(); + m_access = node->accessType(); + if (m_usage != node->usage()) { + m_usage = node->usage(); + m_bufferDirty = true; + } + { + QBufferDataGeneratorPtr newGenerator = node->dataGenerator(); + bool dirty = (newGenerator && m_functor && !(*newGenerator == *m_functor)) || + (newGenerator.isNull() && !m_functor.isNull()) || + (!newGenerator.isNull() && m_functor.isNull()); + m_bufferDirty |= dirty; + m_functor = newGenerator; + if (m_functor && m_manager != nullptr) + m_manager->addDirtyBuffer(peerId()); + } + { + QVariant v = node->property("QT3D_updateData"); + if (v.isValid()) { + Qt3DRender::QBufferUpdate updateData = v.value<Qt3DRender::QBufferUpdate>(); + m_data.replace(updateData.offset, updateData.data.size(), updateData.data); + m_bufferUpdates.push_back(updateData); + m_bufferDirty = true; + const_cast<QBuffer *>(node)->setProperty("QT3D_updateData", {}); + } else { + QByteArray newData = node->data(); bool dirty = m_data != newData; m_bufferDirty |= dirty; m_data = newData; - if (dirty) + if (dirty && !m_data.isEmpty()) forceDataUpload(); - } else if (propertyName == QByteArrayLiteral("updateData")) { - Qt3DRender::QBufferUpdate updateData = propertyChange->value().value<Qt3DRender::QBufferUpdate>(); - m_data.replace(updateData.offset, updateData.data.size(), updateData.data); - m_bufferUpdates.push_back(updateData); - m_bufferDirty = true; - } else if (propertyName == QByteArrayLiteral("usage")) { - m_usage = static_cast<QBuffer::UsageType>(propertyChange->value().value<int>()); - m_bufferDirty = true; - } else if (propertyName == QByteArrayLiteral("accessType")) { - m_access = static_cast<QBuffer::AccessType>(propertyChange->value().value<int>()); - } else if (propertyName == QByteArrayLiteral("dataGenerator")) { - QBufferDataGeneratorPtr newGenerator = propertyChange->value().value<QBufferDataGeneratorPtr>(); - m_bufferDirty |= !(newGenerator && m_functor && *newGenerator == *m_functor); - m_functor = newGenerator; - if (m_functor && m_manager != nullptr) - m_manager->addDirtyBuffer(peerId()); - } else if (propertyName == QByteArrayLiteral("syncData")) { - m_syncData = propertyChange->value().toBool(); } - markDirty(AbstractRenderer::BuffersDirty); } - BackendNode::sceneChangeEvent(e); + markDirty(AbstractRenderer::BuffersDirty); } // Called by Renderer once the buffer has been uploaded to OpenGL diff --git a/src/render/geometry/buffer_p.h b/src/render/geometry/buffer_p.h index 9a171599d..a3f52d1b3 100644 --- a/src/render/geometry/buffer_p.h +++ b/src/render/geometry/buffer_p.h @@ -73,7 +73,7 @@ public: ~Buffer(); void cleanup(); - void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) override; + void syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime) override; void setManager(BufferManager *manager); void executeFunctor(); @@ -88,7 +88,6 @@ public: void unsetDirty(); private: - void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) final; void forceDataUpload(); QBuffer::UsageType m_usage; diff --git a/src/render/geometry/geometry.cpp b/src/render/geometry/geometry.cpp index 4ee02a74d..cb401df5b 100644 --- a/src/render/geometry/geometry.cpp +++ b/src/render/geometry/geometry.cpp @@ -45,6 +45,8 @@ #include <Qt3DCore/qpropertynodeaddedchange.h> #include <Qt3DCore/qpropertynoderemovedchange.h> +#include <algorithm> + QT_BEGIN_NAMESPACE using namespace Qt3DCore; @@ -76,51 +78,29 @@ void Geometry::cleanup() m_shouldNotifyMaxExtentChanged = false; } -void Geometry::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) -{ - const auto typedChange = qSharedPointerCast<Qt3DCore::QNodeCreatedChange<QGeometryData>>(change); - const auto &data = typedChange->data; - m_attributes = data.attributeIds; - m_boundingPositionAttribute = data.boundingVolumePositionAttributeId; - m_geometryDirty = true; - markDirty(AbstractRenderer::GeometryDirty); -} - -void Geometry::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) +void Geometry::syncFromFrontEnd(const QNode *frontEnd, bool firstTime) { - switch (e->type()) { - case PropertyValueAdded: { - const auto change = qSharedPointerCast<QPropertyNodeAddedChange>(e); - if (change->propertyName() == QByteArrayLiteral("attribute")) { - m_attributes.push_back(change->addedNodeId()); - m_geometryDirty = true; - } - break; - } - - case PropertyValueRemoved: { - const auto change = qSharedPointerCast<QPropertyNodeRemovedChange>(e); - if (change->propertyName() == QByteArrayLiteral("attribute")) { - m_attributes.removeOne(change->removedNodeId()); - m_geometryDirty = true; - } - break; + BackendNode::syncFromFrontEnd(frontEnd, firstTime); + const QGeometry *node = qobject_cast<const QGeometry *>(frontEnd); + if (!node) + return; + + m_geometryDirty |= firstTime; + + QNodeIdVector attribs = qIdsForNodes(node->attributes()); + std::sort(std::begin(attribs), std::end(attribs)); + if (m_attributes != attribs) { + m_attributes = attribs; + m_geometryDirty = true; } - case PropertyUpdated: { + if ((node->boundingVolumePositionAttribute() && node->boundingVolumePositionAttribute()->id() != m_boundingPositionAttribute) || // Note: doesn't set dirtyness as this parameter changing doesn't need a new VAO update. - const auto change = qSharedPointerCast<QPropertyUpdatedChange>(e); - if (change->propertyName() == QByteArrayLiteral("boundingVolumePositionAttribute")) { - m_boundingPositionAttribute = change->value().value<QNodeId>(); - break; - } + (!node->boundingVolumePositionAttribute() && !m_boundingPositionAttribute.isNull())) { + m_boundingPositionAttribute = node->boundingVolumePositionAttribute() ? node->boundingVolumePositionAttribute()->id() : QNodeId{}; } - default: - break; - } markDirty(AbstractRenderer::GeometryDirty); - BackendNode::sceneChangeEvent(e); } void Geometry::unsetDirty() diff --git a/src/render/geometry/geometry_p.h b/src/render/geometry/geometry_p.h index e66524787..429a577b0 100644 --- a/src/render/geometry/geometry_p.h +++ b/src/render/geometry/geometry_p.h @@ -68,7 +68,7 @@ public: void cleanup(); - void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) override; + void syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime) override; inline QVector<Qt3DCore::QNodeId> attributes() const { return m_attributes; } inline bool isDirty() const { return m_geometryDirty; } @@ -82,8 +82,6 @@ public: void notifyExtentChanged(); private: - void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) final; - QVector<Qt3DCore::QNodeId> m_attributes; bool m_geometryDirty; Qt3DCore::QNodeId m_boundingPositionAttribute; diff --git a/src/render/geometry/geometryrenderer.cpp b/src/render/geometry/geometryrenderer.cpp index ea059c6ee..b5c741659 100644 --- a/src/render/geometry/geometryrenderer.cpp +++ b/src/render/geometry/geometryrenderer.cpp @@ -105,95 +105,47 @@ void GeometryRenderer::setManager(GeometryRendererManager *manager) m_manager = manager; } -void GeometryRenderer::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) +void GeometryRenderer::syncFromFrontEnd(const QNode *frontEnd, bool firstTime) { - const auto typedChange = qSharedPointerCast<Qt3DCore::QNodeCreatedChange<QGeometryRendererData>>(change); - const auto &data = typedChange->data; - m_geometryId = data.geometryId; - m_instanceCount = data.instanceCount; - m_vertexCount = data.vertexCount; - m_indexOffset = data.indexOffset; - m_firstInstance = data.firstInstance; - m_firstVertex = data.firstVertex; - m_indexBufferByteOffset = data.indexBufferByteOffset; - m_restartIndexValue = data.restartIndexValue; - m_verticesPerPatch = data.verticesPerPatch; - m_primitiveRestartEnabled = data.primitiveRestart; - m_primitiveType = data.primitiveType; - - Q_ASSERT(m_manager); - m_geometryFactory = data.geometryFactory; - if (m_geometryFactory) - m_manager->addDirtyGeometryRenderer(peerId()); - - m_dirty = true; - markDirty(AbstractRenderer::GeometryDirty); -} - -void GeometryRenderer::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) -{ - switch (e->type()) { - case PropertyUpdated: { - QPropertyUpdatedChangePtr propertyChange = qSharedPointerCast<QPropertyUpdatedChange>(e); - QByteArray propertyName = propertyChange->propertyName(); - - if (propertyName == QByteArrayLiteral("instanceCount")) { - m_instanceCount = propertyChange->value().value<int>(); - m_dirty = true; - } else if (propertyName == QByteArrayLiteral("vertexCount")) { - m_vertexCount = propertyChange->value().value<int>(); - m_dirty = true; - } else if (propertyName == QByteArrayLiteral("indexOffset")) { - m_indexOffset = propertyChange->value().value<int>(); - m_dirty = true; - } else if (propertyName == QByteArrayLiteral("firstInstance")) { - m_firstInstance = propertyChange->value().value<int>(); - m_dirty = true; - } else if (propertyName == QByteArrayLiteral("firstVertex")) { - m_firstVertex = propertyChange->value().value<int>(); - m_dirty = true; - } else if (propertyName == QByteArrayLiteral("indexBufferByteOffset")) { - m_indexBufferByteOffset = propertyChange->value().value<int>(); - m_dirty = true; - } else if (propertyName == QByteArrayLiteral("restartIndexValue")) { - m_restartIndexValue = propertyChange->value().value<int>(); - m_dirty = true; - } else if (propertyName == QByteArrayLiteral("verticesPerPatch")) { - m_verticesPerPatch = propertyChange->value().value<int>(); - m_dirty = true; - } else if (propertyName == QByteArrayLiteral("primitiveRestartEnabled")) { - m_primitiveRestartEnabled = propertyChange->value().toBool(); - m_dirty = true; - } else if (propertyName == QByteArrayLiteral("primitiveType")) { - m_primitiveType = static_cast<QGeometryRenderer::PrimitiveType>(propertyChange->value().value<int>()); - m_dirty = true; - } else if (propertyName == QByteArrayLiteral("geometryFactory")) { - QGeometryFactoryPtr newFunctor = propertyChange->value().value<QGeometryFactoryPtr>(); - const bool functorDirty = ((m_geometryFactory && !newFunctor) - || (!m_geometryFactory && newFunctor) - || (m_geometryFactory && newFunctor && !(*newFunctor == *m_geometryFactory))); - m_dirty |= functorDirty; - if (functorDirty) { - m_geometryFactory = newFunctor; - if (m_geometryFactory && m_manager != nullptr) - m_manager->addDirtyGeometryRenderer(peerId()); - } - } else if (propertyName == QByteArrayLiteral("geometry")) { - m_geometryId = propertyChange->value().value<Qt3DCore::QNodeId>(); - m_dirty = true; - } - break; - } - - default: - break; + BackendNode::syncFromFrontEnd(frontEnd, firstTime); + const QGeometryRenderer *node = qobject_cast<const QGeometryRenderer *>(frontEnd); + if (!node) + return; + + m_dirty |= m_instanceCount != node->instanceCount(); + m_instanceCount = node->instanceCount(); + m_dirty |= m_vertexCount != node->vertexCount(); + m_vertexCount = node->vertexCount(); + m_dirty |= m_indexOffset != node->indexOffset(); + m_indexOffset = node->indexOffset(); + m_dirty |= m_firstInstance != node->firstInstance(); + m_firstInstance = node->firstInstance(); + m_dirty |= m_firstVertex != node->firstVertex(); + m_firstVertex = node->firstVertex(); + m_dirty |= m_indexBufferByteOffset != node->indexBufferByteOffset(); + m_indexBufferByteOffset = node->indexBufferByteOffset(); + m_dirty |= m_restartIndexValue != node->restartIndexValue(); + m_restartIndexValue = node->restartIndexValue(); + m_dirty |= m_verticesPerPatch != node->verticesPerPatch(); + m_verticesPerPatch = node->verticesPerPatch(); + m_dirty |= m_primitiveRestartEnabled != node->primitiveRestartEnabled(); + m_primitiveRestartEnabled = node->primitiveRestartEnabled(); + m_dirty |= m_primitiveType != node->primitiveType(); + m_primitiveType = node->primitiveType(); + m_dirty |= (node->geometry() && m_geometryId != node->geometry()->id()) || (!node->geometry() && !m_geometryId.isNull()); + m_geometryId = node->geometry() ? node->geometry()->id() : Qt3DCore::QNodeId(); + QGeometryFactoryPtr newFunctor = node->geometryFactory(); + const bool functorDirty = ((m_geometryFactory && !newFunctor) + || (!m_geometryFactory && newFunctor) + || (m_geometryFactory && newFunctor && !(*newFunctor == *m_geometryFactory))); + if (functorDirty) { + m_dirty = true; + m_geometryFactory = newFunctor; + if (m_geometryFactory && m_manager != nullptr) + m_manager->addDirtyGeometryRenderer(peerId()); } markDirty(AbstractRenderer::GeometryDirty); - - BackendNode::sceneChangeEvent(e); - - // Add to dirty list in manager } void GeometryRenderer::executeFunctor() diff --git a/src/render/geometry/geometryrenderer_p.h b/src/render/geometry/geometryrenderer_p.h index 57d1ca0be..da538a00d 100644 --- a/src/render/geometry/geometryrenderer_p.h +++ b/src/render/geometry/geometryrenderer_p.h @@ -74,7 +74,7 @@ public: void cleanup(); void setManager(GeometryRendererManager *manager); - void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) override; + void syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime) override; void executeFunctor(); inline Qt3DCore::QNodeId geometryId() const { return m_geometryId; } @@ -98,8 +98,6 @@ public: QVector<RayCasting::QBoundingVolume *> triangleData() const; private: - void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) final; - Qt3DCore::QNodeId m_geometryId; int m_instanceCount; int m_vertexCount; diff --git a/src/render/geometry/joint.cpp b/src/render/geometry/joint.cpp index c770564f9..86d583f51 100644 --- a/src/render/geometry/joint.cpp +++ b/src/render/geometry/joint.cpp @@ -39,11 +39,14 @@ #include "joint_p.h" #include <Qt3DRender/private/managers_p.h> +#include <Qt3DCore/QJoint> #include <Qt3DCore/private/qjoint_p.h> #include <Qt3DCore/qpropertyupdatedchange.h> #include <Qt3DCore/qpropertynodeaddedchange.h> #include <Qt3DCore/qpropertynoderemovedchange.h> +#include <algorithm> + QT_BEGIN_NAMESPACE using namespace Qt3DCore; @@ -69,21 +72,7 @@ void Joint::cleanup() setEnabled(false); } -void Joint::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) -{ - Q_ASSERT(m_jointManager); - const auto typedChange = qSharedPointerCast<Qt3DCore::QNodeCreatedChange<QJointData>>(change); - const auto &data = typedChange->data; - m_inverseBindMatrix = data.inverseBindMatrix; - m_localPose.rotation = data.rotation; - m_localPose.scale = data.scale; - m_localPose.translation = data.translation; - m_childJointIds = data.childJointIds; - m_name = data.name; - markDirty(AbstractRenderer::JointDirty); - m_jointManager->addDirtyJoint(peerId()); -} - +// TODOSYNC remove once animation changes don't use messages anymore void Joint::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) { if (e->type() == PropertyUpdated) { @@ -123,10 +112,60 @@ void Joint::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) if (removedChange->propertyName() == QByteArrayLiteral("childJoint")) m_childJointIds.removeOne(removedChange->removedNodeId()); } - BackendNode::sceneChangeEvent(e); } +void Joint::syncFromFrontEnd(const QNode *frontEnd, bool firstTime) +{ + const Qt3DCore::QJoint *joint = qobject_cast<const Qt3DCore::QJoint *>(frontEnd); + if (!joint) + return; + + if (m_localPose.scale != joint->scale()) { + m_localPose.scale = joint->scale(); + markDirty(AbstractRenderer::JointDirty); + m_jointManager->addDirtyJoint(peerId()); + } + if (m_localPose.rotation != joint->rotation()) { + m_localPose.rotation = joint->rotation(); + markDirty(AbstractRenderer::JointDirty); + m_jointManager->addDirtyJoint(peerId()); + } + if (m_localPose.translation != joint->translation()) { + m_localPose.translation = joint->translation(); + markDirty(AbstractRenderer::JointDirty); + m_jointManager->addDirtyJoint(peerId()); + } + if (m_inverseBindMatrix != joint->inverseBindMatrix()) { + // Setting the inverse bind matrix should be a rare operation. Usually it is + // set once and then remains constant for the duration of the skeleton. So just + // trigger a rebuild of the skeleton's SkeletonData which will include obtaining + // the inverse bind matrix. + m_inverseBindMatrix = joint->inverseBindMatrix(); + m_skeletonManager->addDirtySkeleton(SkeletonManager::SkeletonDataDirty, m_owningSkeleton); + } + if (m_name != joint->name()) { + // Joint name doesn't affect anything in the render aspect so no need + // to mark anything as dirty. + m_name = joint->name(); + + // TODO: Notify other aspects (animation) about the name change. + } + + Qt3DCore::QNodeIdVector childIds = qIdsForNodes(joint->childJoints()); + std::sort(std::begin(childIds), std::end(childIds)); + if (m_childJointIds != childIds) { + m_childJointIds = childIds; + } + + if (firstTime) { + markDirty(AbstractRenderer::JointDirty); + m_jointManager->addDirtyJoint(peerId()); + } + + BackendNode::syncFromFrontEnd(frontEnd, firstTime); +} + JointFunctor::JointFunctor(AbstractRenderer *renderer, JointManager *jointManager, diff --git a/src/render/geometry/joint_p.h b/src/render/geometry/joint_p.h index e144ac489..d0530ac04 100644 --- a/src/render/geometry/joint_p.h +++ b/src/render/geometry/joint_p.h @@ -70,6 +70,7 @@ public: void cleanup(); void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) override; + void syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime) override; Qt3DCore::Sqt localPose() const { return m_localPose; } QMatrix4x4 inverseBindMatrix() const { return m_inverseBindMatrix; } @@ -90,8 +91,6 @@ public: SkeletonManager *skeletonManager() const { return m_skeletonManager; } private: - void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) final; - QMatrix4x4 m_inverseBindMatrix; Qt3DCore::Sqt m_localPose; QVector<Qt3DCore::QNodeId> m_childJointIds; diff --git a/src/render/geometry/qattribute.cpp b/src/render/geometry/qattribute.cpp index ca467fda9..a28d0baa6 100644 --- a/src/render/geometry/qattribute.cpp +++ b/src/render/geometry/qattribute.cpp @@ -505,6 +505,19 @@ Qt3DCore::QNodeCreatedChangeBasePtr QAttribute::createNodeCreationChange() const return creationChange; } + +/*! +\fn Qt3DRender::QAttribute::dataSizeChanged(uint vertexSize) + +The signal is emitted with \a vertexSize when the dataSize changes. +*/ +/*! +\fn Qt3DRender::QAttribute::dataTypeChanged(Qt3DRender::QAttribute::VertexBaseType vertexBaseType) + +The signal is emitted with \a vertexBaseType when the dataType changed. +*/ + + } // Qt3DRender QT_END_NAMESPACE diff --git a/src/render/geometry/qbuffer.cpp b/src/render/geometry/qbuffer.cpp index e0574a4c5..f27005f2b 100644 --- a/src/render/geometry/qbuffer.cpp +++ b/src/render/geometry/qbuffer.cpp @@ -329,7 +329,7 @@ void QBuffer::setData(const QByteArray &bytes) Q_D(QBuffer); if (bytes != d->m_data) { d->m_data = bytes; - Qt3DCore::QNodePrivate::get(this)->notifyPropertyChange("data", QVariant::fromValue(d->m_data)); + Qt3DCore::QNodePrivate::get(this)->update(); emit dataChanged(bytes); } } @@ -351,11 +351,8 @@ void QBuffer::updateData(int offset, const QByteArray &bytes) QBufferUpdate updateData; updateData.offset = offset; updateData.data = bytes; - - auto e = QPropertyUpdatedChangePtr::create(id()); - e->setPropertyName("updateData"); - e->setValue(QVariant::fromValue(updateData)); - notifyObservers(e); + setProperty("QT3D_updateData", QVariant::fromValue(updateData)); + d->update(); } /*! @@ -409,12 +406,7 @@ void QBuffer::setDataGenerator(const QBufferDataGeneratorPtr &functor) if (functor && d->m_functor && *functor == *d->m_functor) return; d->m_functor = functor; - if (d->m_changeArbiter != nullptr) { - auto change = QPropertyUpdatedChangePtr::create(d->m_id); - change->setPropertyName("dataGenerator"); - change->setValue(QVariant::fromValue(d->m_functor)); - d->notifyObservers(change); - } + d->update(); } /*! diff --git a/src/render/geometry/qgeometry.cpp b/src/render/geometry/qgeometry.cpp index ec80e2657..47fad4302 100644 --- a/src/render/geometry/qgeometry.cpp +++ b/src/render/geometry/qgeometry.cpp @@ -196,11 +196,7 @@ void QGeometry::addAttribute(QAttribute *attribute) if (!attribute->parent()) attribute->setParent(this); - if (d->m_changeArbiter != nullptr) { - const auto change = QPropertyNodeAddedChangePtr::create(id(), attribute); - change->setPropertyName("attribute"); - d->notifyObservers(change); - } + d->update(); } } @@ -212,14 +208,10 @@ void QGeometry::removeAttribute(QAttribute *attribute) { Q_ASSERT(attribute); Q_D(QGeometry); - if (d->m_changeArbiter != nullptr) { - const auto change = QPropertyNodeRemovedChangePtr::create(id(), attribute); - change->setPropertyName("attribute"); - d->notifyObservers(change); - } d->m_attributes.removeOne(attribute); // Remove bookkeeping connection d->unregisterDestructionHelper(attribute); + d->update(); } void QGeometry::setBoundingVolumePositionAttribute(QAttribute *boundingVolumePositionAttribute) diff --git a/src/render/geometry/qgeometryrenderer.cpp b/src/render/geometry/qgeometryrenderer.cpp index 6bff3462f..ddea873a7 100644 --- a/src/render/geometry/qgeometryrenderer.cpp +++ b/src/render/geometry/qgeometryrenderer.cpp @@ -480,12 +480,7 @@ void QGeometryRenderer::setGeometryFactory(const QGeometryFactoryPtr &factory) if (factory && d->m_geometryFactory && *factory == *d->m_geometryFactory) return; d->m_geometryFactory = factory; - if (d->m_changeArbiter != nullptr) { - auto change = QPropertyUpdatedChangePtr::create(d->m_id); - change->setPropertyName("geometryFactory"); - change->setValue(QVariant::fromValue(d->m_geometryFactory)); - d->notifyObservers(change); - } + d->update(); } /*! diff --git a/src/render/geometry/skeleton.cpp b/src/render/geometry/skeleton.cpp index 615b76c88..d4af1fe3c 100644 --- a/src/render/geometry/skeleton.cpp +++ b/src/render/geometry/skeleton.cpp @@ -80,39 +80,68 @@ void Skeleton::cleanup() setEnabled(false); } -void Skeleton::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) +void Skeleton::syncFromFrontEnd(const QNode *frontEnd, bool firstTime) { - Q_ASSERT(m_skeletonManager); - m_skeletonHandle = m_skeletonManager->lookupHandle(peerId()); - - const auto skeletonCreatedChange = qSharedPointerCast<QSkeletonCreatedChangeBase>(change); - switch (skeletonCreatedChange->type()) { - case QSkeletonCreatedChangeBase::SkeletonLoader: { - const auto loaderTypedChange = qSharedPointerCast<QSkeletonCreatedChange<QSkeletonLoaderData>>(change); - const auto &data = loaderTypedChange->data; - m_dataType = File; - m_source = data.source; - m_createJoints = data.createJoints; - if (!m_source.isEmpty()) { - markDirty(AbstractRenderer::SkeletonDataDirty); - m_skeletonManager->addDirtySkeleton(SkeletonManager::SkeletonDataDirty, m_skeletonHandle); + BackendNode::syncFromFrontEnd(frontEnd, firstTime); + const QAbstractSkeleton *node = qobject_cast<const QAbstractSkeleton *>(frontEnd); + if (!node) + return; + const QSkeleton *skeletonNode = qobject_cast<const QSkeleton *>(frontEnd); + const QSkeletonLoader *loaderNode = qobject_cast<const QSkeletonLoader *>(frontEnd); + + if (firstTime) { + m_skeletonHandle = m_skeletonManager->lookupHandle(peerId()); + + if (skeletonNode) { + m_dataType = Data; + m_rootJointId = skeletonNode->rootJoint()->id(); + if (!m_rootJointId.isNull()) { + markDirty(AbstractRenderer::SkeletonDataDirty); + m_skeletonManager->addDirtySkeleton(SkeletonManager::SkeletonDataDirty, m_skeletonHandle); + } + } + + if (loaderNode) { + m_dataType = File; + m_source = loaderNode->source(); + if (!m_source.isEmpty()) { + markDirty(AbstractRenderer::SkeletonDataDirty); + m_skeletonManager->addDirtySkeleton(SkeletonManager::SkeletonDataDirty, m_skeletonHandle); + } } - break; } - case QSkeletonCreatedChangeBase::Skeleton: - const auto typedChange = qSharedPointerCast<QSkeletonCreatedChange<QSkeletonData>>(change); - const auto &data = typedChange->data; - m_dataType = Data; - m_rootJointId = data.rootJointId; - if (!m_rootJointId.isNull()) { + if (loaderNode) { + if (loaderNode->source() != m_source) { + m_source = loaderNode->source(); markDirty(AbstractRenderer::SkeletonDataDirty); m_skeletonManager->addDirtySkeleton(SkeletonManager::SkeletonDataDirty, m_skeletonHandle); } - break; + m_createJoints = loaderNode->isCreateJointsEnabled(); + + if ((loaderNode->rootJoint() && loaderNode->rootJoint()->id() != m_rootJointId) || + (!loaderNode->rootJoint() && !m_rootJointId.isNull())) { + m_rootJointId = loaderNode->rootJoint() ? loaderNode->rootJoint()->id() : Qt3DCore::QNodeId{}; + + // If using a QSkeletonLoader to create frontend QJoints, when those joints are + // set on the skeleton, we end up here. In order to allow the subsequent call + // to loadSkeleton(), see below, to build the internal data from the frontend + // joints rather than from the source url again, we need to change the data type + // to Data. + m_dataType = Data; + + // If the joint changes, we need to rebuild our internal SkeletonData and + // the relationships between joints and skeleton. Mark the skeleton data as + // dirty so that we get a loadSkeletonJob executed to process this skeleton. + if (!m_rootJointId.isNull()) { + markDirty(AbstractRenderer::SkeletonDataDirty); + m_skeletonManager->addDirtySkeleton(SkeletonManager::SkeletonDataDirty, m_skeletonHandle); + } + } } } +// TODOSYNC remove once animation aspect no longer requires messages void Skeleton::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) { switch (e->type()) { @@ -123,31 +152,6 @@ void Skeleton::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) // need to do is copy them into place. The existing jobs will then update // the skinning matrix palette. m_skeletonData.localPoses = change->value().value<QVector<Qt3DCore::Sqt>>(); - } else if (change->propertyName() == QByteArrayLiteral("source")) { - Q_ASSERT(m_dataType == File); - const auto source = change->value().toUrl(); - if (source != m_source) { - m_source = source; - markDirty(AbstractRenderer::SkeletonDataDirty); - m_skeletonManager->addDirtySkeleton(SkeletonManager::SkeletonDataDirty, m_skeletonHandle); - } - } else if (change->propertyName() == QByteArrayLiteral("createJointsEnabled")) { - m_createJoints = change->value().toBool(); - } else if (change->propertyName() == QByteArrayLiteral("rootJoint")) { - m_rootJointId = change->value().value<QNodeId>(); - - // If using a QSkeletonLoader to create frontend QJoints, when those joints are - // set on the skeleton, we end up here. In order to allow the subsequent call - // to loadSkeleton(), see below, to build the internal data from the frontend - // joints rather than from the source url again, we need to change the data type - // to Data. - m_dataType = Data; - - // If the joint changes, we need to rebuild our internal SkeletonData and - // the relationships between joints and skeleton. Mark the skeleton data as - // dirty so that we get a loadSkeletonJob executed to process this skeleton. - markDirty(AbstractRenderer::SkeletonDataDirty); - m_skeletonManager->addDirtySkeleton(SkeletonManager::SkeletonDataDirty, m_skeletonHandle); } break; diff --git a/src/render/geometry/skeleton_p.h b/src/render/geometry/skeleton_p.h index 4a14e5c1c..d71b404e5 100644 --- a/src/render/geometry/skeleton_p.h +++ b/src/render/geometry/skeleton_p.h @@ -85,6 +85,7 @@ public: void cleanup(); void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) override; + void syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime) override; void setStatus(Qt3DCore::QSkeletonLoader::Status status); Qt3DCore::QSkeletonLoader::Status status() const { return m_status; } @@ -120,7 +121,6 @@ public: #endif private: - void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) final; void loadSkeletonFromUrl(); void loadSkeletonFromData(); Qt3DCore::QJoint *createFrontendJoints(const SkeletonData &skeletonData) const; diff --git a/src/render/lights/environmentlight.cpp b/src/render/lights/environmentlight.cpp index d4245fb6e..20364fdfa 100644 --- a/src/render/lights/environmentlight.cpp +++ b/src/render/lights/environmentlight.cpp @@ -53,11 +53,17 @@ QNodeId EnvironmentLight::shaderData() const return m_shaderDataId; } -void EnvironmentLight::initializeFromPeer(const QNodeCreatedChangeBasePtr &change) +void EnvironmentLight::syncFromFrontEnd(const QNode *frontEnd, bool firstTime) { - const auto typedChange = qSharedPointerCast<Qt3DCore::QNodeCreatedChange<QEnvironmentLightData>>(change); - const auto &data = typedChange->data; - m_shaderDataId = data.shaderDataId; + BackendNode::syncFromFrontEnd(frontEnd, firstTime); + const QEnvironmentLight *node = qobject_cast<const QEnvironmentLight *>(frontEnd); + if (!node) + return; + + if (firstTime) { + QEnvironmentLightPrivate *d = static_cast<QEnvironmentLightPrivate *>(QEnvironmentLightPrivate::get(const_cast<Qt3DCore::QNode *>(frontEnd))); + m_shaderDataId = d->m_shaderData ? d->m_shaderData->id() : QNodeId{}; + } } } // namespace Render diff --git a/src/render/lights/environmentlight_p.h b/src/render/lights/environmentlight_p.h index 00d49d298..92f6ce100 100644 --- a/src/render/lights/environmentlight_p.h +++ b/src/render/lights/environmentlight_p.h @@ -63,10 +63,9 @@ class Q_AUTOTEST_EXPORT EnvironmentLight : public BackendNode { public: Qt3DCore::QNodeId shaderData() const; + void syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime) override; private: - void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) final; - Qt3DCore::QNodeId m_shaderDataId; }; diff --git a/src/render/lights/light.cpp b/src/render/lights/light.cpp index e8474b728..30d71082b 100644 --- a/src/render/lights/light.cpp +++ b/src/render/lights/light.cpp @@ -58,14 +58,18 @@ QNodeId Light::shaderData() const return m_shaderDataId; } -void Light::initializeFromPeer(const QNodeCreatedChangeBasePtr &change) +void Light::syncFromFrontEnd(const QNode *frontEnd, bool firstTime) { - const auto typedChange = qSharedPointerCast<Qt3DCore::QNodeCreatedChange<QAbstractLightData>>(change); - const auto &data = typedChange->data; - m_shaderDataId = data.shaderDataId; + BackendNode::syncFromFrontEnd(frontEnd, firstTime); + const QAbstractLight *node = qobject_cast<const QAbstractLight *>(frontEnd); + if (!node) + return; - Q_ASSERT(m_renderer); - BackendNode::markDirty(AbstractRenderer::LightsDirty); + if (firstTime) { + QAbstractLightPrivate *d = static_cast<QAbstractLightPrivate *>(QAbstractLightPrivate::get(const_cast<Qt3DCore::QNode *>(frontEnd))); + m_shaderDataId = d->m_shaderData ? d->m_shaderData->id() : QNodeId{}; + BackendNode::markDirty(AbstractRenderer::LightsDirty); + } } RenderLightFunctor::RenderLightFunctor(AbstractRenderer *renderer, NodeManagers *managers) diff --git a/src/render/lights/light_p.h b/src/render/lights/light_p.h index 8ecc87585..5f5f8140e 100644 --- a/src/render/lights/light_p.h +++ b/src/render/lights/light_p.h @@ -66,9 +66,9 @@ class Q_AUTOTEST_EXPORT Light : public BackendNode public: Qt3DCore::QNodeId shaderData() const; -private: - void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) final; + void syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime) override; +private: Qt3DCore::QNodeId m_shaderDataId; }; diff --git a/src/render/materialsystem/effect.cpp b/src/render/materialsystem/effect.cpp index 29d05ed01..76036bd1f 100644 --- a/src/render/materialsystem/effect.cpp +++ b/src/render/materialsystem/effect.cpp @@ -48,6 +48,7 @@ #include <Qt3DCore/qpropertynoderemovedchange.h> #include <QVariant> +#include <algorithm> QT_BEGIN_NAMESPACE @@ -73,41 +74,25 @@ void Effect::cleanup() m_techniques.clear(); } -void Effect::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) +void Effect::syncFromFrontEnd(const QNode *frontEnd, bool firstTime) { - const auto typedChange = qSharedPointerCast<Qt3DCore::QNodeCreatedChange<QEffectData>>(change); - const auto &data = typedChange->data; - m_techniques = data.techniqueIds; - m_parameterPack.setParameters(data.parameterIds); -} - -void Effect::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) -{ - switch (e->type()) { - case PropertyValueAdded: { - const auto change = qSharedPointerCast<QPropertyNodeAddedChange>(e); - if (change->propertyName() == QByteArrayLiteral("technique")) - appendRenderTechnique(change->addedNodeId()); - else if (change->propertyName() == QByteArrayLiteral("parameter")) - m_parameterPack.appendParameter(change->addedNodeId()); - break; - } - - case PropertyValueRemoved: { - const auto change = qSharedPointerCast<QPropertyNodeRemovedChange>(e); - if (change->propertyName() == QByteArrayLiteral("technique")) - m_techniques.removeOne(change->removedNodeId()); - else if (change->propertyName() == QByteArrayLiteral("parameter")) - m_parameterPack.removeParameter(change->removedNodeId()); - break; - } - - default: - break; - } - - markDirty(AbstractRenderer::AllDirty); - BackendNode::sceneChangeEvent(e); + BackendNode::syncFromFrontEnd(frontEnd, firstTime); + const QEffect *node = qobject_cast<const QEffect *>(frontEnd); + if (!node) + return; + + auto parameters = qIdsForNodes(node->parameters()); + std::sort(std::begin(parameters), std::end(parameters)); + if (m_parameterPack.parameters() != parameters) + m_parameterPack.setParameters(parameters); + + auto techniques = qIdsForNodes(node->techniques()); + std::sort(std::begin(techniques), std::end(techniques)); + if (m_techniques != techniques) + m_techniques = techniques; + + if (!firstTime) + markDirty(AbstractRenderer::AllDirty); } void Effect::appendRenderTechnique(Qt3DCore::QNodeId technique) diff --git a/src/render/materialsystem/effect_p.h b/src/render/materialsystem/effect_p.h index 87ff4a803..e81be2b8d 100644 --- a/src/render/materialsystem/effect_p.h +++ b/src/render/materialsystem/effect_p.h @@ -70,15 +70,13 @@ public: ~Effect(); void cleanup(); - void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) override; + void syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime) override; void appendRenderTechnique(Qt3DCore::QNodeId t); QVector<Qt3DCore::QNodeId> techniques() const; QVector<Qt3DCore::QNodeId> parameters() const; private: - void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) final; - QVector<Qt3DCore::QNodeId> m_techniques; ParameterPack m_parameterPack; }; diff --git a/src/render/materialsystem/material.cpp b/src/render/materialsystem/material.cpp index a69ff8a13..07764c207 100644 --- a/src/render/materialsystem/material.cpp +++ b/src/render/materialsystem/material.cpp @@ -73,47 +73,26 @@ void Material::cleanup() m_parameterPack.clear(); } -void Material::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) +void Material::syncFromFrontEnd(const QNode *frontEnd, bool firstTime) { - const auto typedChange = qSharedPointerCast<Qt3DCore::QNodeCreatedChange<QMaterialData>>(change); - const auto &data = typedChange->data; - m_effectUuid = data.effectId; - m_parameterPack.setParameters(data.parameterIds); - - markDirty(AbstractRenderer::MaterialDirty); -} - -void Material::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) -{ - - switch (e->type()) { - case PropertyUpdated: { - const auto change = qSharedPointerCast<QPropertyUpdatedChange>(e); - if (change->propertyName() == QByteArrayLiteral("effect")) - m_effectUuid = change->value().value<QNodeId>(); - break; - } - - case PropertyValueAdded: { - const auto change = qSharedPointerCast<QPropertyNodeAddedChange>(e); - if (change->propertyName() == QByteArrayLiteral("parameter")) - m_parameterPack.appendParameter(change->addedNodeId()); - break; - } - - case PropertyValueRemoved: { - const auto change = qSharedPointerCast<QPropertyNodeRemovedChange>(e); - if (change->propertyName() == QByteArrayLiteral("parameter")) - m_parameterPack.removeParameter(change->removedNodeId()); - break; - } - - default: - break; - } - markDirty(AbstractRenderer::AllDirty); - - BackendNode::sceneChangeEvent(e); + BackendNode::syncFromFrontEnd(frontEnd, firstTime); + const QMaterial *node = qobject_cast<const QMaterial *>(frontEnd); + if (!node) + return; + + auto parameters = qIdsForNodes(node->parameters()); + std::sort(std::begin(parameters), std::end(parameters)); + if (m_parameterPack.parameters() != parameters) + m_parameterPack.setParameters(parameters); + + const auto effectId = node->effect() ? node->effect()->id() : QNodeId{}; + if (effectId != m_effectUuid) + m_effectUuid = effectId; + + if (firstTime) + markDirty(AbstractRenderer::MaterialDirty); + else + markDirty(AbstractRenderer::AllDirty); } QVector<Qt3DCore::QNodeId> Material::parameters() const diff --git a/src/render/materialsystem/material_p.h b/src/render/materialsystem/material_p.h index 3b55dc657..7a02c6691 100644 --- a/src/render/materialsystem/material_p.h +++ b/src/render/materialsystem/material_p.h @@ -79,14 +79,12 @@ public: ~Material(); void cleanup(); - void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) override; + void syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime) override; QVector<Qt3DCore::QNodeId> parameters() const; Qt3DCore::QNodeId effect() const; private: - void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) final; - ParameterPack m_parameterPack; Qt3DCore::QNodeId m_effectUuid; }; diff --git a/src/render/materialsystem/parameter.cpp b/src/render/materialsystem/parameter.cpp index 86ca418aa..d32e60a2d 100644 --- a/src/render/materialsystem/parameter.cpp +++ b/src/render/materialsystem/parameter.cpp @@ -70,34 +70,33 @@ void Parameter::cleanup() m_uniformValue = UniformValue(); } -void Parameter::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) +void Parameter::syncFromFrontEnd(const QNode *frontEnd, bool firstTime) { - const auto typedChange = qSharedPointerCast<Qt3DCore::QNodeCreatedChange<QParameterData>>(change); - const auto &data = typedChange->data; - m_name = data.name; - m_nameId = StringToInt::lookupId(m_name); - m_uniformValue = UniformValue::fromVariant(data.backendValue); - markDirty(AbstractRenderer::ParameterDirty); -} + const QParameter *node = qobject_cast<const QParameter *>(frontEnd); + if (!node) + return; -void Parameter::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) -{ - QPropertyUpdatedChangePtr propertyChange = qSharedPointerCast<QPropertyUpdatedChange>(e); - - if (e->type() == PropertyUpdated) { - if (propertyChange->propertyName() == QByteArrayLiteral("name")) { - m_name = propertyChange->value().toString(); - m_nameId = StringToInt::lookupId(m_name); - markDirty(AbstractRenderer::MaterialDirty | AbstractRenderer::ParameterDirty); - } else if (propertyChange->propertyName() == QByteArrayLiteral("value")) { - m_uniformValue = UniformValue::fromVariant(propertyChange->value()); - markDirty(AbstractRenderer::ParameterDirty); - } else if (propertyChange->propertyName() == QByteArrayLiteral("enabled")) { - markDirty(AbstractRenderer::MaterialDirty | AbstractRenderer::ParameterDirty); - } + AbstractRenderer::BackendNodeDirtySet dirty = firstTime ? AbstractRenderer::ParameterDirty : static_cast<AbstractRenderer::BackendNodeDirtyFlag>(0); + if (node->isEnabled() != isEnabled()) + dirty |= (AbstractRenderer::MaterialDirty | AbstractRenderer::ParameterDirty); + + if (node->name() != m_name) { + m_name = node->name(); + m_nameId = StringToInt::lookupId(m_name); + dirty |= (AbstractRenderer::MaterialDirty | AbstractRenderer::ParameterDirty); } - BackendNode::sceneChangeEvent(e); + QParameterPrivate* d = static_cast<QParameterPrivate *>(QParameterPrivate::get(const_cast<QParameter *>(node))); + if (d->m_backendValue != m_backendValue) { + m_backendValue = d->m_backendValue; + m_uniformValue = UniformValue::fromVariant(m_backendValue); + dirty |= (AbstractRenderer::ParameterDirty); + } + + if (dirty) + markDirty(dirty); + + BackendNode::syncFromFrontEnd(frontEnd, firstTime); } QString Parameter::name() const diff --git a/src/render/materialsystem/parameter_p.h b/src/render/materialsystem/parameter_p.h index 4ab04bc8e..9deaa11f3 100644 --- a/src/render/materialsystem/parameter_p.h +++ b/src/render/materialsystem/parameter_p.h @@ -71,16 +71,15 @@ public: void cleanup(); - void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) override; + void syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime) override; QString name() const; int nameId() const Q_DECL_NOTHROW { return m_nameId; } const UniformValue &uniformValue() const { return m_uniformValue; } private: - void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) final; - QString m_name; + QVariant m_backendValue; UniformValue m_uniformValue; int m_nameId; }; diff --git a/src/render/materialsystem/qeffect.cpp b/src/render/materialsystem/qeffect.cpp index b611657c4..35ac662fb 100644 --- a/src/render/materialsystem/qeffect.cpp +++ b/src/render/materialsystem/qeffect.cpp @@ -192,11 +192,7 @@ void QEffect::addParameter(QParameter *parameter) if (!parameter->parent()) parameter->setParent(this); - if (d->m_changeArbiter != nullptr) { - const auto change = QPropertyNodeAddedChangePtr::create(id(), parameter); - change->setPropertyName("parameter"); - d->notifyObservers(change); - } + d->update(); } } @@ -207,14 +203,10 @@ void QEffect::removeParameter(QParameter *parameter) { Q_D(QEffect); - if (parameter && d->m_changeArbiter != nullptr) { - const auto change = QPropertyNodeRemovedChangePtr::create(id(), parameter); - change->setPropertyName("parameter"); - d->notifyObservers(change); - } d->m_parameters.removeOne(parameter); // Remove bookkeeping connection d->unregisterDestructionHelper(parameter); + d->update(); } /*! @@ -246,11 +238,7 @@ void QEffect::addTechnique(QTechnique *t) if (!t->parent()) t->setParent(this); - if (d->m_changeArbiter != nullptr) { - const auto change = QPropertyNodeAddedChangePtr::create(id(), t); - change->setPropertyName("technique"); - d->notifyObservers(change); - } + d->update(); } } @@ -260,11 +248,8 @@ void QEffect::addTechnique(QTechnique *t) void QEffect::removeTechnique(QTechnique *t) { Q_D(QEffect); - if (t && d->m_changeArbiter != nullptr) { - const auto change = QPropertyNodeRemovedChangePtr::create(id(), t); - change->setPropertyName("technique"); - d->notifyObservers(change); - } + if (t) + d->update(); d->m_techniques.removeOne(t); // Remove bookkeeping connection d->unregisterDestructionHelper(t); diff --git a/src/render/materialsystem/qgraphicsapifilter.cpp b/src/render/materialsystem/qgraphicsapifilter.cpp index 70f329172..9b5557930 100644 --- a/src/render/materialsystem/qgraphicsapifilter.cpp +++ b/src/render/materialsystem/qgraphicsapifilter.cpp @@ -107,6 +107,11 @@ QGraphicsApiFilterPrivate *QGraphicsApiFilterPrivate::get(QGraphicsApiFilter *q) return q->d_func(); } +const QGraphicsApiFilterPrivate *QGraphicsApiFilterPrivate::get(const QGraphicsApiFilter *q) +{ + return q->d_func(); +} + /*! \class Qt3DRender::QGraphicsApiFilter \inmodule Qt3DRender diff --git a/src/render/materialsystem/qgraphicsapifilter_p.h b/src/render/materialsystem/qgraphicsapifilter_p.h index 3961d4f93..435451c27 100644 --- a/src/render/materialsystem/qgraphicsapifilter_p.h +++ b/src/render/materialsystem/qgraphicsapifilter_p.h @@ -84,6 +84,7 @@ public: } static QGraphicsApiFilterPrivate *get(QGraphicsApiFilter *q); + static const QGraphicsApiFilterPrivate *get(const QGraphicsApiFilter *q); Q_DECLARE_PUBLIC(QGraphicsApiFilter) GraphicsApiFilterData m_data; diff --git a/src/render/materialsystem/qmaterial.cpp b/src/render/materialsystem/qmaterial.cpp index c6913441e..db523a700 100644 --- a/src/render/materialsystem/qmaterial.cpp +++ b/src/render/materialsystem/qmaterial.cpp @@ -275,11 +275,7 @@ void QMaterial::addParameter(QParameter *parameter) if (!parameter->parent()) parameter->setParent(this); - if (d->m_changeArbiter != nullptr) { - const auto change = QPropertyNodeAddedChangePtr::create(id(), parameter); - change->setPropertyName("parameter"); - d->notifyObservers(change); - } + d->update(); } } @@ -290,11 +286,7 @@ void QMaterial::removeParameter(QParameter *parameter) { Q_ASSERT(parameter); Q_D(QMaterial); - if (d->m_changeArbiter != nullptr) { - const auto change = QPropertyNodeRemovedChangePtr::create(id(), parameter); - change->setPropertyName("parameter"); - d->notifyObservers(change); - } + d->update(); d->m_parameters.removeOne(parameter); } diff --git a/src/render/materialsystem/qrenderpass.cpp b/src/render/materialsystem/qrenderpass.cpp index 111bb7b5f..d0821c49c 100644 --- a/src/render/materialsystem/qrenderpass.cpp +++ b/src/render/materialsystem/qrenderpass.cpp @@ -231,12 +231,6 @@ void QRenderPass::setShaderProgram(QShaderProgram *shaderProgram) Q_D(QRenderPass); if (d->m_shader != shaderProgram) { - if (d->m_shader != nullptr && d->m_changeArbiter != nullptr) { - const auto change = QPropertyNodeRemovedChangePtr::create(id(), d->m_shader); - change->setPropertyName("shaderProgram"); - d->notifyObservers(change); - } - if (d->m_shader) d->unregisterDestructionHelper(d->m_shader); @@ -283,11 +277,7 @@ void QRenderPass::addFilterKey(QFilterKey *filterKey) if (!filterKey->parent()) filterKey->setParent(this); - if (d->m_changeArbiter != nullptr) { - const auto change = QPropertyNodeAddedChangePtr::create(id(), filterKey); - change->setPropertyName("filterKeys"); - d->notifyObservers(change); - } + d->update(); } } @@ -298,11 +288,7 @@ void QRenderPass::removeFilterKey(QFilterKey *filterKey) { Q_ASSERT(filterKey); Q_D(QRenderPass); - if (d->m_changeArbiter != nullptr) { - const auto change = QPropertyNodeRemovedChangePtr::create(id(), filterKey); - change->setPropertyName("filterKeys"); - d->notifyObservers(change); - } + d->update(); d->m_filterKeyList.removeOne(filterKey); // Remove bookkeeping connection d->unregisterDestructionHelper(filterKey); @@ -339,11 +325,7 @@ void QRenderPass::addRenderState(QRenderState *state) if (!state->parent()) state->setParent(this); - if (d->m_changeArbiter != nullptr) { - const auto change = QPropertyNodeAddedChangePtr::create(id(), state); - change->setPropertyName("renderState"); - d->notifyObservers(change); - } + d->update(); } } @@ -354,11 +336,7 @@ void QRenderPass::removeRenderState(QRenderState *state) { Q_ASSERT(state); Q_D(QRenderPass); - if (d->m_changeArbiter != nullptr) { - const auto change = QPropertyNodeRemovedChangePtr::create(id(), state); - change->setPropertyName("renderState"); - d->notifyObservers(change); - } + d->update(); d->m_renderStates.removeOne(state); // Remove bookkeeping connection d->unregisterDestructionHelper(state); @@ -394,11 +372,7 @@ void QRenderPass::addParameter(QParameter *parameter) if (!parameter->parent()) parameter->setParent(this); - if (d->m_changeArbiter != nullptr) { - const auto change = QPropertyNodeAddedChangePtr::create(id(), parameter); - change->setPropertyName("parameter"); - d->notifyObservers(change); - } + d->update(); } } @@ -409,11 +383,7 @@ void QRenderPass::removeParameter(QParameter *parameter) { Q_ASSERT(parameter); Q_D(QRenderPass); - if (d->m_changeArbiter != nullptr) { - const auto change = QPropertyNodeRemovedChangePtr::create(id(), parameter); - change->setPropertyName("parameter"); - d->notifyObservers(change); - } + d->update(); d->m_parameters.removeOne(parameter); // Remove bookkeeping connection d->unregisterDestructionHelper(parameter); diff --git a/src/render/materialsystem/qtechnique.cpp b/src/render/materialsystem/qtechnique.cpp index b668eb25f..dadeb98bd 100644 --- a/src/render/materialsystem/qtechnique.cpp +++ b/src/render/materialsystem/qtechnique.cpp @@ -234,12 +234,7 @@ QTechnique::QTechnique(QTechniquePrivate &dd, QNode *parent) /*! \internal */ void QTechniquePrivate::_q_graphicsApiFilterChanged() { - if (m_changeArbiter != nullptr) { - auto change = QPropertyUpdatedChangePtr::create(m_id); - change->setPropertyName("graphicsApiFilterData"); - change->setValue(QVariant::fromValue(QGraphicsApiFilterPrivate::get(const_cast<QGraphicsApiFilter *>(&m_graphicsApiFilter))->m_data)); - notifyObservers(change); - } + update(); } /*! @@ -262,11 +257,7 @@ void QTechnique::addFilterKey(QFilterKey *filterKey) if (!filterKey->parent()) filterKey->setParent(this); - if (d->m_changeArbiter != nullptr) { - const auto change = QPropertyNodeAddedChangePtr::create(id(), filterKey); - change->setPropertyName("filterKeys"); - d->notifyObservers(change); - } + d->update(); } } @@ -277,11 +268,7 @@ void QTechnique::removeFilterKey(QFilterKey *filterKey) { Q_ASSERT(filterKey); Q_D(QTechnique); - if (d->m_changeArbiter != nullptr) { - const auto change = QPropertyNodeRemovedChangePtr::create(id(), filterKey); - change->setPropertyName("filterKeys"); - d->notifyObservers(change); - } + d->update(); d->m_filterKeys.removeOne(filterKey); // Remove bookkeeping connection d->unregisterDestructionHelper(filterKey); @@ -317,11 +304,7 @@ void QTechnique::addParameter(QParameter *parameter) if (!parameter->parent()) parameter->setParent(this); - if (d->m_changeArbiter != nullptr) { - const auto change = QPropertyNodeAddedChangePtr::create(id(), parameter); - change->setPropertyName("parameter"); - d->notifyObservers(change); - } + d->update(); } } @@ -332,11 +315,7 @@ void QTechnique::removeParameter(QParameter *parameter) { Q_ASSERT(parameter); Q_D(QTechnique); - if (d->m_changeArbiter != nullptr) { - const auto change = QPropertyNodeRemovedChangePtr::create(id(), parameter); - change->setPropertyName("parameter"); - d->notifyObservers(change); - } + d->update(); d->m_parameters.removeOne(parameter); // Remove bookkeeping connection d->unregisterDestructionHelper(parameter); @@ -362,11 +341,7 @@ void QTechnique::addRenderPass(QRenderPass *pass) if (!pass->parent()) pass->setParent(this); - if (d->m_changeArbiter != nullptr) { - const auto change = QPropertyNodeAddedChangePtr::create(id(), pass); - change->setPropertyName("pass"); - d->notifyObservers(change); - } + d->update(); } } @@ -377,11 +352,7 @@ void QTechnique::removeRenderPass(QRenderPass *pass) { Q_ASSERT(pass); Q_D(QTechnique); - if (d->m_changeArbiter) { - const auto change = QPropertyNodeRemovedChangePtr::create(id(), pass); - change->setPropertyName("pass"); - d->notifyObservers(change); - } + d->update(); d->m_renderPasses.removeOne(pass); // Remove bookkeeping connection d->unregisterDestructionHelper(pass); @@ -405,12 +376,19 @@ QVector<QParameter *> QTechnique::parameters() const return d->m_parameters; } +// TODO Qt 6 -> Remove QGraphicsApiFilter *QTechnique::graphicsApiFilter() { Q_D(QTechnique); return &d->m_graphicsApiFilter; } +const QGraphicsApiFilter *QTechnique::graphicsApiFilter() const +{ + Q_D(const QTechnique); + return &d->m_graphicsApiFilter; +} + Qt3DCore::QNodeCreatedChangeBasePtr QTechnique::createNodeCreationChange() const { auto creationChange = Qt3DCore::QNodeCreatedChangePtr<QTechniqueData>::create(this); diff --git a/src/render/materialsystem/qtechnique.h b/src/render/materialsystem/qtechnique.h index 7711cd67f..f0c857c2b 100644 --- a/src/render/materialsystem/qtechnique.h +++ b/src/render/materialsystem/qtechnique.h @@ -76,7 +76,8 @@ public: void removeRenderPass(QRenderPass *pass); QVector<QRenderPass *> renderPasses() const; - QGraphicsApiFilter *graphicsApiFilter(); + Q_DECL_DEPRECATED QGraphicsApiFilter *graphicsApiFilter(); + const QGraphicsApiFilter *graphicsApiFilter() const; protected: explicit QTechnique(QTechniquePrivate &dd, Qt3DCore::QNode *parent = nullptr); diff --git a/src/render/materialsystem/renderpass.cpp b/src/render/materialsystem/renderpass.cpp index e0fadddd9..aaeca3bb4 100644 --- a/src/render/materialsystem/renderpass.cpp +++ b/src/render/materialsystem/renderpass.cpp @@ -52,6 +52,8 @@ #include <Qt3DCore/qpropertynodeaddedchange.h> #include <Qt3DCore/qpropertynoderemovedchange.h> +#include <algorithm> + QT_BEGIN_NAMESPACE using namespace Qt3DCore; @@ -77,58 +79,33 @@ void RenderPass::cleanup() m_shaderUuid = Qt3DCore::QNodeId(); } -void RenderPass::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) -{ - const auto typedChange = qSharedPointerCast<Qt3DCore::QNodeCreatedChange<QRenderPassData>>(change); - const auto &data = typedChange->data; - m_filterKeyList = data.filterKeyIds; - m_parameterPack.setParameters(data.parameterIds); - for (const auto &renderStateId : qAsConst(data.renderStateIds)) - addRenderState(renderStateId); - m_shaderUuid = data.shaderId; -} - -void RenderPass::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) +void RenderPass::syncFromFrontEnd(const QNode *frontEnd, bool firstTime) { - switch (e->type()) { - case PropertyValueAdded: { - const auto change = qSharedPointerCast<QPropertyNodeAddedChange>(e); - if (change->propertyName() == QByteArrayLiteral("filterKeys")) - appendFilterKey(change->addedNodeId()); - else if (change->propertyName() == QByteArrayLiteral("shaderProgram")) - m_shaderUuid = change->addedNodeId(); - else if (change->propertyName() == QByteArrayLiteral("renderState")) - addRenderState(change->addedNodeId()); - else if (change->propertyName() == QByteArrayLiteral("parameter")) - m_parameterPack.appendParameter(change->addedNodeId()); - break; + BackendNode::syncFromFrontEnd(frontEnd, firstTime); + const QRenderPass *node = qobject_cast<const QRenderPass *>(frontEnd); + if (!node) + return; + + if ((node->shaderProgram() && node->shaderProgram()->id() != m_shaderUuid) || + (!node->shaderProgram() && !m_shaderUuid.isNull())) { + m_shaderUuid = node->shaderProgram() ? node->shaderProgram()->id() : QNodeId{}; } - case PropertyUpdated: { - const auto change = qSharedPointerCast<QPropertyUpdatedChange>(e); - if (change->propertyName() == QByteArrayLiteral("shaderProgram")) - m_shaderUuid = change->value().value<Qt3DCore::QNodeId>(); - break; - } + auto filterList = qIdsForNodes(node->filterKeys()); + std::sort(std::begin(filterList), std::end(filterList)); + if (m_filterKeyList != filterList) + m_filterKeyList = filterList; - case PropertyValueRemoved: { - const auto change = qSharedPointerCast<QPropertyNodeRemovedChange>(e); - if (change->propertyName() == QByteArrayLiteral("filterKeys")) - removeFilterKey(change->removedNodeId()); - else if (change->propertyName() == QByteArrayLiteral("shaderProgram")) - m_shaderUuid = QNodeId(); - else if (change->propertyName() == QByteArrayLiteral("renderState")) - removeRenderState(change->removedNodeId()); - else if (change->propertyName() == QByteArrayLiteral("parameter")) - m_parameterPack.removeParameter(change->removedNodeId()); - break; - } + auto parameters = qIdsForNodes(node->parameters()); + std::sort(std::begin(parameters), std::end(parameters)); + if (m_parameterPack.parameters() != parameters) + m_parameterPack.setParameters(parameters); - default: - break; - } + auto renderStates = qIdsForNodes(node->renderStates()); + std::sort(std::begin(renderStates), std::end(renderStates)); + if (m_renderStates != renderStates) + m_renderStates = renderStates; - BackendNode::sceneChangeEvent(e); markDirty(AbstractRenderer::AllDirty); } diff --git a/src/render/materialsystem/renderpass_p.h b/src/render/materialsystem/renderpass_p.h index 1ca02b1ad..314386ad1 100644 --- a/src/render/materialsystem/renderpass_p.h +++ b/src/render/materialsystem/renderpass_p.h @@ -79,7 +79,7 @@ public: void cleanup(); - void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) override; + void syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime) override; Qt3DCore::QNodeId shaderProgram() const; QVector<Qt3DCore::QNodeId> filterKeys() const; @@ -95,8 +95,6 @@ private: void addRenderState(Qt3DCore::QNodeId renderStateId); void removeRenderState(Qt3DCore::QNodeId renderStateId); - void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) final; - Qt3DCore::QNodeId m_shaderUuid; QVector<Qt3DCore::QNodeId> m_filterKeyList; ParameterPack m_parameterPack; diff --git a/src/render/materialsystem/technique.cpp b/src/render/materialsystem/technique.cpp index 42430883e..d4199b7e3 100644 --- a/src/render/materialsystem/technique.cpp +++ b/src/render/materialsystem/technique.cpp @@ -85,72 +85,48 @@ void Technique::cleanup() m_isCompatibleWithRenderer = false; } -void Technique::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) +void Technique::syncFromFrontEnd(const QNode *frontEnd, bool firstTime) { - const auto typedChange = qSharedPointerCast<Qt3DCore::QNodeCreatedChange<QTechniqueData>>(change); - const QTechniqueData &data = typedChange->data; - - m_graphicsApiFilterData = data.graphicsApiFilterData; - m_filterKeyList = data.filterKeyIds; - m_parameterPack.setParameters(data.parameterIds); - m_renderPasses = data.renderPassIds; - m_nodeManager->techniqueManager()->addDirtyTechnique(peerId()); - markDirty(AbstractRenderer::TechniquesDirty); -} + const QTechnique *node = qobject_cast<const QTechnique *>(frontEnd); -void Technique::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) -{ - switch (e->type()) { - case PropertyUpdated: { - const auto change = qSharedPointerCast<QPropertyUpdatedChange>(e); - if (change->propertyName() == QByteArrayLiteral("enabled")) { - markDirty(AbstractRenderer::TechniquesDirty); - } else if (change->propertyName() == QByteArrayLiteral("graphicsApiFilterData")) { - GraphicsApiFilterData filterData = change->value().value<GraphicsApiFilterData>(); - m_graphicsApiFilterData = filterData; - // Notify the manager that our graphicsApiFilterData has changed - // and that we therefore need to be check for compatibility again - m_isCompatibleWithRenderer = false; - m_nodeManager->techniqueManager()->addDirtyTechnique(peerId()); - markDirty(AbstractRenderer::TechniquesDirty); - } - break; + if (!node) + return; + + bool dirty = isEnabled() != frontEnd->isEnabled(); + BackendNode::syncFromFrontEnd(frontEnd, firstTime); + + auto renderPasses = qIdsForNodes(node->renderPasses()); + std::sort(std::begin(renderPasses), std::end(renderPasses)); + if (m_renderPasses != renderPasses) { + m_renderPasses = renderPasses; + dirty = true; } - case PropertyValueAdded: { - const auto change = qSharedPointerCast<QPropertyNodeAddedChange>(e); - if (change->propertyName() == QByteArrayLiteral("pass")) { - appendRenderPass(change->addedNodeId()); - markDirty(AbstractRenderer::TechniquesDirty); - } else if (change->propertyName() == QByteArrayLiteral("parameter")) { - m_parameterPack.appendParameter(change->addedNodeId()); - markDirty(AbstractRenderer::TechniquesDirty); - } else if (change->propertyName() == QByteArrayLiteral("filterKeys")) { - appendFilterKey(change->addedNodeId()); - markDirty(AbstractRenderer::TechniquesDirty); - } - break; + auto parameters = qIdsForNodes(node->parameters()); + std::sort(std::begin(parameters), std::end(parameters)); + if (m_parameterPack.parameters() != parameters) { + m_parameterPack.setParameters(parameters); + dirty = true; } - case PropertyValueRemoved: { - const auto change = qSharedPointerCast<QPropertyNodeRemovedChange>(e); - if (change->propertyName() == QByteArrayLiteral("pass")) { - removeRenderPass(change->removedNodeId()); - markDirty(AbstractRenderer::TechniquesDirty); - } else if (change->propertyName() == QByteArrayLiteral("parameter")) { - m_parameterPack.removeParameter(change->removedNodeId()); - markDirty(AbstractRenderer::TechniquesDirty); - } else if (change->propertyName() == QByteArrayLiteral("filterKeys")) { - removeFilterKey(change->removedNodeId()); - markDirty(AbstractRenderer::TechniquesDirty); - } - break; + auto filterKeys = qIdsForNodes(node->filterKeys()); + std::sort(std::begin(filterKeys), std::end(filterKeys)); + if (m_filterKeyList != filterKeys) { + m_filterKeyList = filterKeys; + dirty = true; + } + + auto graphicsApiFilterData = QGraphicsApiFilterPrivate::get(node->graphicsApiFilter())->m_data; + if (m_graphicsApiFilterData != graphicsApiFilterData) { + m_graphicsApiFilterData = graphicsApiFilterData; + m_isCompatibleWithRenderer = false; + dirty = true; } - default: - break; + if (dirty) { + m_nodeManager->techniqueManager()->addDirtyTechnique(peerId()); + markDirty(AbstractRenderer::TechniquesDirty); } - BackendNode::sceneChangeEvent(e); } QVector<Qt3DCore::QNodeId> Technique::parameters() const diff --git a/src/render/materialsystem/technique_p.h b/src/render/materialsystem/technique_p.h index d885c1b87..1d0d0a9dd 100644 --- a/src/render/materialsystem/technique_p.h +++ b/src/render/materialsystem/technique_p.h @@ -80,7 +80,8 @@ public: ~Technique(); void cleanup(); - void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) override; + void syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime) override; + QVector<Qt3DCore::QNodeId> parameters() const; void appendRenderPass(Qt3DCore::QNodeId renderPassId); @@ -102,7 +103,6 @@ public: NodeManagers *nodeManager() const; private: - void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) final; GraphicsApiFilterData m_graphicsApiFilterData; ParameterPack m_parameterPack; diff --git a/src/render/picking/qpickevent.cpp b/src/render/picking/qpickevent.cpp index a18c6ead8..ae5748082 100644 --- a/src/render/picking/qpickevent.cpp +++ b/src/render/picking/qpickevent.cpp @@ -309,14 +309,14 @@ int QPickEvent::modifiers() const * The viewport in which this event originated. A null value means the event originated from a frame graph branch without a Viewport. * If a frame graph branch has a Viewport inside a Viewport the property will contain the leaf viewport. * - * \since 5.13 + * \since 5.14 */ /*! * \property Qt3DRender::QPickEvent::viewport * The viewport in which this event originated. A null value means the event originated from a frame graph branch without a QViewport. * If a frame graph branch has a Viewport inside a Viewport the property will contain the leaf viewport. * - * \since 5.13 + * \since 5.14 */ QViewport *QPickEvent::viewport() const { @@ -332,7 +332,7 @@ QViewport *QPickEvent::viewport() const * If the object picker is not attached to a leaf node in the scene graph, * this is useful to find which child entity was actually picked. * - * \since 5.13 + * \since 5.14 */ /*! * \property Qt3DRender::QPickEvent::entity @@ -341,7 +341,7 @@ QViewport *QPickEvent::viewport() const * If the object picker is not attached to a leaf node in the scene graph, * this is useful to find which child entity was actually picked. * - * \since 5.13 + * \since 5.14 */ Qt3DCore::QEntity *QPickEvent::entity() const { diff --git a/src/render/picking/qpickevent.h b/src/render/picking/qpickevent.h index 21d072ffe..854008aaf 100644 --- a/src/render/picking/qpickevent.h +++ b/src/render/picking/qpickevent.h @@ -70,8 +70,8 @@ class Q_3DRENDERSHARED_EXPORT QPickEvent : public QObject Q_PROPERTY(Qt3DRender::QPickEvent::Buttons button READ button CONSTANT) Q_PROPERTY(int buttons READ buttons CONSTANT) Q_PROPERTY(int modifiers READ modifiers CONSTANT) - Q_PROPERTY(Qt3DRender::QViewport *viewport READ viewport CONSTANT) - Q_PROPERTY(Qt3DCore::QEntity *entity READ entity CONSTANT) + Q_PROPERTY(Qt3DRender::QViewport *viewport READ viewport CONSTANT REVISION 14) + Q_PROPERTY(Qt3DCore::QEntity *entity READ entity CONSTANT REVISION 14) public: enum Buttons { LeftButton = Qt::LeftButton, diff --git a/src/render/renderers/opengl/renderer/commandthread.cpp b/src/render/renderers/opengl/renderer/commandthread.cpp index dcaacadcc..a518d3b68 100644 --- a/src/render/renderers/opengl/renderer/commandthread.cpp +++ b/src/render/renderers/opengl/renderer/commandthread.cpp @@ -176,7 +176,7 @@ void CommandThread::run() m_commandRequestedSemaphore.acquire(); // Are we still running? - if (!m_running.load()) { + if (!m_running.loadRelaxed()) { m_graphicsContext->doneCurrent(); // to prevent executeCommand being locked m_commandExecutionSemaphore.release(); diff --git a/src/render/renderers/opengl/renderer/renderer.cpp b/src/render/renderers/opengl/renderer/renderer.cpp index e0d1f598f..845a4d8be 100644 --- a/src/render/renderers/opengl/renderer/renderer.cpp +++ b/src/render/renderers/opengl/renderer/renderer.cpp @@ -448,7 +448,7 @@ void Renderer::shutdown() QMutexLocker lock(&m_hasBeenInitializedMutex); qCDebug(Backend) << Q_FUNC_INFO << "Requesting renderer shutdown"; - m_running.store(0); + m_running.storeRelaxed(0); // We delete any renderqueue that we may not have had time to render // before the surface was destroyed @@ -619,7 +619,7 @@ void Renderer::render() // One scene description // One framegraph description - while (m_running.load() > 0) { + while (m_running.loadRelaxed() > 0) { doRender(); // TO DO: Restore windows exposed detection // Probably needs to happens some place else though @@ -789,7 +789,7 @@ void Renderer::enqueueRenderView(Render::RenderView *renderView, int submitOrder const bool isQueueComplete = m_renderQueue->queueRenderView(renderView, submitOrder); locker.unlock(); // We're done protecting the queue at this point if (isQueueComplete) { - if (m_renderThread && m_running.load()) + if (m_renderThread && m_running.loadRelaxed()) Q_ASSERT(m_submitRenderViewsSemaphore.available() == 0); m_submitRenderViewsSemaphore.release(1); } @@ -798,7 +798,7 @@ void Renderer::enqueueRenderView(Render::RenderView *renderView, int submitOrder bool Renderer::canRender() const { // Make sure that we've not been told to terminate - if (m_renderThread && !m_running.load()) { + if (m_renderThread && !m_running.loadRelaxed()) { qCDebug(Rendering) << "RenderThread termination requested whilst waiting"; return false; } @@ -817,7 +817,7 @@ bool Renderer::isReadyToSubmit() m_submitRenderViewsSemaphore.acquire(1); // Check if shutdown has been requested - if (m_running.load() == 0) + if (m_running.loadRelaxed() == 0) return false; // The semaphore should only @@ -1424,7 +1424,7 @@ Renderer::ViewSubmissionResultData Renderer::submitRenderViews(const QVector<Ren const int renderViewsCount = renderViews.size(); quint64 frameElapsed = queueElapsed; - m_lastFrameCorrect.store(1); // everything fine until now..... + m_lastFrameCorrect.storeRelaxed(1); // everything fine until now..... qCDebug(Memory) << Q_FUNC_INFO << "rendering frame "; @@ -1457,7 +1457,7 @@ Renderer::ViewSubmissionResultData Renderer::submitRenderViews(const QVector<Ren // to use when surface is null. Or if we should instead expose an // offscreensurface to Qt3D. if (!surface || !surfaceLock.isSurfaceValid()) { - m_lastFrameCorrect.store(0); + m_lastFrameCorrect.storeRelaxed(0); continue; } @@ -1477,7 +1477,7 @@ Renderer::ViewSubmissionResultData Renderer::submitRenderViews(const QVector<Ren // next RenderView. We won't get the full frame but we may get something if (!m_submissionContext->beginDrawing(surface)) { qWarning() << "Failed to make OpenGL context current on surface"; - m_lastFrameCorrect.store(0); + m_lastFrameCorrect.storeRelaxed(0); continue; } @@ -1578,7 +1578,7 @@ Renderer::ViewSubmissionResultData Renderer::submitRenderViews(const QVector<Ren // Execute the render commands if (!executeCommandsSubmission(renderView)) - m_lastFrameCorrect.store(0); // something went wrong; make sure to render the next frame! + m_lastFrameCorrect.storeRelaxed(0); // something went wrong; make sure to render the next frame! // executeCommandsSubmission takes care of restoring the stateset to the value // of gc->currentContext() at the moment it was called (either @@ -1681,7 +1681,7 @@ bool Renderer::shouldRender() || m_renderThread == nullptr // <==> we use Scene3D || m_dirtyBits.marked != 0 || m_dirtyBits.remaining != 0 - || !m_lastFrameCorrect.load()); + || !m_lastFrameCorrect.loadRelaxed()); } void Renderer::skipNextFrame() diff --git a/src/render/renderers/opengl/renderer/renderer_p.h b/src/render/renderers/opengl/renderer/renderer_p.h index 6286f1bce..0f911236a 100644 --- a/src/render/renderers/opengl/renderer/renderer_p.h +++ b/src/render/renderers/opengl/renderer/renderer_p.h @@ -185,7 +185,7 @@ public: void doRender(bool swapBuffers = true) override; void cleanGraphicsResources() override; - bool isRunning() const override { return m_running.load(); } + bool isRunning() const override { return m_running.loadRelaxed(); } void setSceneRoot(Entity *sgRoot) override; Entity *sceneRoot() const override { return m_renderSceneRoot; } diff --git a/src/render/renderstates/qdepthrange.cpp b/src/render/renderstates/qdepthrange.cpp index 58b8b744a..ec5bbce9f 100644 --- a/src/render/renderstates/qdepthrange.cpp +++ b/src/render/renderstates/qdepthrange.cpp @@ -48,7 +48,7 @@ namespace Qt3DRender { /*! \class Qt3DRender::QDepthRange \inmodule Qt3DRender - \since 5.13 + \since 5.14 \ingroup renderstates \brief Enables remapping depth values written into the depth buffer. @@ -65,7 +65,7 @@ namespace Qt3DRender { \inherits RenderState \inqmlmodule Qt3D.Render \ingroup renderstates - \since 5.13 + \since 5.14 \brief Enables remapping depth values written into the depth buffer. By default, OpenGL writes scene depth information into the depth buffer in diff --git a/src/render/texture/qabstracttexture.cpp b/src/render/texture/qabstracttexture.cpp index 399314f24..229d773ad 100644 --- a/src/render/texture/qabstracttexture.cpp +++ b/src/render/texture/qabstracttexture.cpp @@ -81,10 +81,7 @@ void QAbstractTexturePrivate::setDataFunctor(const QTextureGeneratorPtr &generat { if (generator != m_dataFunctor) { m_dataFunctor = generator; - auto change = Qt3DCore::QPropertyUpdatedChangePtr::create(m_id); - change->setPropertyName("generator"); - change->setValue(QVariant::fromValue(generator)); - notifyObservers(change); + update(); } } @@ -811,24 +808,15 @@ void QAbstractTexture::setWrapMode(const QTextureWrapMode &wrapMode) Q_D(QAbstractTexture); if (d->m_wrapMode.x() != wrapMode.x()) { d->m_wrapMode.setX(wrapMode.x()); - auto e = QPropertyUpdatedChangePtr::create(d->m_id); - e->setPropertyName("wrapModeX"); - e->setValue(static_cast<int>(d->m_wrapMode.x())); - d->notifyObservers(e); + d->update(); } if (d->m_wrapMode.y() != wrapMode.y()) { d->m_wrapMode.setY(wrapMode.y()); - auto e = QPropertyUpdatedChangePtr::create(d->m_id); - e->setPropertyName("wrapModeY"); - e->setValue(static_cast<int>(d->m_wrapMode.y())); - d->notifyObservers(e); + d->update(); } if (d->m_wrapMode.z() != wrapMode.z()) { d->m_wrapMode.setZ(wrapMode.z()); - auto e = QPropertyUpdatedChangePtr::create(d->m_id); - e->setPropertyName("wrapModeZ"); - e->setValue(static_cast<int>(d->m_wrapMode.z())); - d->notifyObservers(e); + d->update(); } } @@ -983,16 +971,8 @@ void QAbstractTexture::updateData(const QTextureDataUpdate &update) { Q_D(QAbstractTexture); - // Send update to backend if we have the changeArbiter - if (d->m_changeArbiter != nullptr) { - auto e = QPropertyUpdatedChangePtr::create(id()); - e->setPropertyName("updateData"); - e->setValue(QVariant::fromValue(update)); - notifyObservers(e); - } else { - // If we have no arbiter (no backend), record the update as part of the creation changes - d->m_initialDataUpdates.push_back(update); - } + d->m_pendingDataUpdates.push_back(update); + d->update(); } Qt3DCore::QNodeCreatedChangeBasePtr QAbstractTexture::createNodeCreationChange() const @@ -1019,8 +999,8 @@ Qt3DCore::QNodeCreatedChangeBasePtr QAbstractTexture::createNodeCreationChange() data.samples = d->m_samples; data.dataFunctor = d->m_dataFunctor; data.sharedTextureId = d->m_sharedTextureId; - data.initialDataUpdates = d->m_initialDataUpdates; - return creationChange; + data.initialDataUpdates = d->m_pendingDataUpdates; + return std::move(creationChange); } /*! diff --git a/src/render/texture/qabstracttexture_p.h b/src/render/texture/qabstracttexture_p.h index 072bd8159..573eac8c7 100644 --- a/src/render/texture/qabstracttexture_p.h +++ b/src/render/texture/qabstracttexture_p.h @@ -96,7 +96,7 @@ public : QTextureGeneratorPtr dataFunctor() const; void setDataFunctor(const QTextureGeneratorPtr &generator); - QVector<QTextureDataUpdate> m_initialDataUpdates; + QVector<QTextureDataUpdate> m_pendingDataUpdates; private: QTextureGeneratorPtr m_dataFunctor; diff --git a/src/render/texture/qabstracttextureimage.cpp b/src/render/texture/qabstracttextureimage.cpp index a95e1fffd..42f8eb747 100644 --- a/src/render/texture/qabstracttextureimage.cpp +++ b/src/render/texture/qabstracttextureimage.cpp @@ -255,12 +255,7 @@ void QAbstractTextureImage::setFace(QAbstractTexture::CubeMapFace face) void QAbstractTextureImage::notifyDataGeneratorChanged() { Q_D(QAbstractTextureImage); - if (d->m_changeArbiter != nullptr) { - auto change = QPropertyUpdatedChangePtr::create(d->m_id); - change->setPropertyName("dataGenerator"); - change->setValue(QVariant::fromValue(dataGenerator())); - d->notifyObservers(change); - } + d->update(); } /*! \internal */ diff --git a/src/render/texture/qtexturedataupdate.cpp b/src/render/texture/qtexturedataupdate.cpp index f196a6b7b..e3d5220f0 100644 --- a/src/render/texture/qtexturedataupdate.cpp +++ b/src/render/texture/qtexturedataupdate.cpp @@ -68,6 +68,7 @@ static bool operator==(const QTextureDataUpdatePrivate &lhs, const QTextureDataU as well as the eventual layer, mipLevel and face. \sa QAbstractTexture + \since 5.14 */ QTextureDataUpdate::QTextureDataUpdate() diff --git a/src/render/texture/texture.cpp b/src/render/texture/texture.cpp index c7a739724..53216d27d 100644 --- a/src/render/texture/texture.cpp +++ b/src/render/texture/texture.cpp @@ -61,6 +61,7 @@ Texture::Texture() // We need backend -> frontend notifications to update the status of the texture : BackendNode(ReadWrite) , m_dirty(DirtyImageGenerators|DirtyProperties|DirtyParameters|DirtyDataGenerator) + , m_sharedTextureId(-1) { } @@ -130,67 +131,6 @@ void Texture::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) DirtyFlags dirty; switch (e->type()) { - case PropertyUpdated: { - QPropertyUpdatedChangePtr propertyChange = qSharedPointerCast<QPropertyUpdatedChange>(e); - if (propertyChange->propertyName() == QByteArrayLiteral("width")) { - m_properties.width = propertyChange->value().toInt(); - dirty = DirtyProperties; - } else if (propertyChange->propertyName() == QByteArrayLiteral("height")) { - m_properties.height = propertyChange->value().toInt(); - dirty = DirtyProperties; - } else if (propertyChange->propertyName() == QByteArrayLiteral("depth")) { - m_properties.depth = propertyChange->value().toInt(); - dirty = DirtyProperties; - } else if (propertyChange->propertyName() == QByteArrayLiteral("format")) { - m_properties.format = static_cast<QAbstractTexture::TextureFormat>(propertyChange->value().toInt()); - dirty = DirtyProperties; - } else if (propertyChange->propertyName() == QByteArrayLiteral("target")) { - m_properties.target = static_cast<QAbstractTexture::Target>(propertyChange->value().toInt()); - dirty = DirtyProperties; - } else if (propertyChange->propertyName() == QByteArrayLiteral("mipmaps")) { - m_properties.generateMipMaps = propertyChange->value().toBool(); - dirty = DirtyProperties; - } else if (propertyChange->propertyName() == QByteArrayLiteral("minificationFilter")) { - m_parameters.minificationFilter = static_cast<QAbstractTexture::Filter>(propertyChange->value().toInt()); - dirty = DirtyParameters; - } else if (propertyChange->propertyName() == QByteArrayLiteral("magnificationFilter")) { - m_parameters.magnificationFilter = static_cast<QAbstractTexture::Filter>(propertyChange->value().toInt()); - dirty = DirtyParameters; - } else if (propertyChange->propertyName() == QByteArrayLiteral("wrapModeX")) { - m_parameters.wrapModeX = static_cast<QTextureWrapMode::WrapMode>(propertyChange->value().toInt()); - dirty = DirtyParameters; - } else if (propertyChange->propertyName() == QByteArrayLiteral("wrapModeY")) { - m_parameters.wrapModeY = static_cast<QTextureWrapMode::WrapMode>(propertyChange->value().toInt()); - dirty = DirtyParameters; - } else if (propertyChange->propertyName() == QByteArrayLiteral("wrapModeZ")) { - m_parameters.wrapModeZ =static_cast<QTextureWrapMode::WrapMode>(propertyChange->value().toInt()); - dirty = DirtyParameters; - } else if (propertyChange->propertyName() == QByteArrayLiteral("maximumAnisotropy")) { - m_parameters.maximumAnisotropy = propertyChange->value().toFloat(); - dirty = DirtyParameters; - } else if (propertyChange->propertyName() == QByteArrayLiteral("comparisonFunction")) { - m_parameters.comparisonFunction = propertyChange->value().value<QAbstractTexture::ComparisonFunction>(); - dirty = DirtyParameters; - } else if (propertyChange->propertyName() == QByteArrayLiteral("comparisonMode")) { - m_parameters.comparisonMode = propertyChange->value().value<QAbstractTexture::ComparisonMode>(); - dirty = DirtyParameters; - } else if (propertyChange->propertyName() == QByteArrayLiteral("layers")) { - m_properties.layers = propertyChange->value().toInt(); - dirty = DirtyProperties; - } else if (propertyChange->propertyName() == QByteArrayLiteral("samples")) { - m_properties.samples = propertyChange->value().toInt(); - dirty = DirtyProperties; - } else if (propertyChange->propertyName() == QByteArrayLiteral("generator")) { - setDataGenerator(propertyChange->value().value<QTextureGeneratorPtr>()); - } else if (propertyChange->propertyName() == QByteArrayLiteral("textureId")) { - m_sharedTextureId = propertyChange->value().toInt(); - dirty = DirtySharedTextureId; - } else if (propertyChange->propertyName() == QByteArrayLiteral("updateData")) { - Qt3DRender::QTextureDataUpdate updateData = propertyChange->value().value<Qt3DRender::QTextureDataUpdate>(); - addTextureDataUpdate(updateData); - } - break; - } case PropertyValueAdded: { const auto change = qSharedPointerCast<QPropertyNodeAddedChange>(e); @@ -217,6 +157,62 @@ void Texture::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) BackendNode::sceneChangeEvent(e); } +void Texture::syncFromFrontEnd(const QNode *frontEnd, bool firstTime) +{ + BackendNode::syncFromFrontEnd(frontEnd, firstTime); + const QAbstractTexture *node = qobject_cast<const QAbstractTexture *>(frontEnd); + if (!node) + return; + + TextureProperties p = m_properties; + p.width = node->width(); + p.height = node->height(); + p.depth = node->depth(); + p.format = node->format(); + p.target = node->target(); + p.generateMipMaps = node->generateMipMaps(); + p.layers = node->layers(); + p.samples = node->samples(); + if (p != m_properties) { + m_properties = p; + addDirtyFlag(DirtyProperties); + } + + TextureParameters q = m_parameters; + q.magnificationFilter = node->magnificationFilter(); + q.minificationFilter = node->minificationFilter(); + q.wrapModeX = const_cast<QAbstractTexture *>(node)->wrapMode()->x(); + q.wrapModeY = const_cast<QAbstractTexture *>(node)->wrapMode()->y(); + q.wrapModeZ = const_cast<QAbstractTexture *>(node)->wrapMode()->z(); + q.maximumAnisotropy = node->maximumAnisotropy(); + q.comparisonFunction = node->comparisonFunction(); + q.comparisonMode = node->comparisonMode(); + if (q != m_parameters) { + m_parameters = q; + addDirtyFlag(DirtyParameters); + } + + auto newGenerator = node->dataGenerator(); + if (newGenerator != m_dataFunctor) { + setDataGenerator(newGenerator); + } + + QAbstractTexturePrivate *dnode = dynamic_cast<QAbstractTexturePrivate *>(QAbstractTexturePrivate::get(const_cast<QAbstractTexture *>(node))); + if (dnode) { + for (const QTextureDataUpdate &pendingUpdate : dnode->m_pendingDataUpdates) + addTextureDataUpdate(pendingUpdate); + dnode->m_pendingDataUpdates.clear(); + + for (const auto imgNode : dnode->m_textureImages) + addTextureImage(imgNode->id()); + } + + if (dnode->m_sharedTextureId != m_sharedTextureId) { + m_sharedTextureId = dnode->m_sharedTextureId; + addDirtyFlag(DirtySharedTextureId); + } +} + // Called by sceneChangeEvent or TextureDownloadRequest (both in AspectThread context) void Texture::setDataGenerator(const QTextureGeneratorPtr &generator) { @@ -308,7 +304,7 @@ void Texture::updatePropertiesAndNotify(const TextureUpdateInfo &updateInfo) bool Texture::isValid(TextureImageManager *manager) const { - for (const QNodeId id : m_textureImageIds) { + for (const QNodeId &id : m_textureImageIds) { TextureImage *img = manager->lookupResource(id); if (img == nullptr) return false; @@ -340,7 +336,7 @@ void Texture::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &chan m_dataFunctor = data.dataFunctor; m_sharedTextureId = data.sharedTextureId; - for (const QNodeId imgId : data.textureImageIds) + for (const QNodeId &imgId : data.textureImageIds) addTextureImage(imgId); const QVector<QTextureDataUpdate> initialDataUpdates = data.initialDataUpdates; diff --git a/src/render/texture/texture_p.h b/src/render/texture/texture_p.h index 28580c92a..967b2a44a 100644 --- a/src/render/texture/texture_p.h +++ b/src/render/texture/texture_p.h @@ -164,6 +164,7 @@ public: QVector<QTextureDataUpdate> takePendingTextureDataUpdates() { return std::move(m_pendingTextureDataUpdates); } void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) override; + void syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime) override; inline const TextureProperties& properties() const { return m_properties; } inline const TextureParameters& parameters() const { return m_parameters; } diff --git a/tests/auto/core/common/qbackendnodetester.cpp b/tests/auto/core/common/qbackendnodetester.cpp index 5d4a10b81..a2685f556 100644 --- a/tests/auto/core/common/qbackendnodetester.cpp +++ b/tests/auto/core/common/qbackendnodetester.cpp @@ -36,7 +36,6 @@ #include "qbackendnodetester.h" #include <Qt3DCore/qbackendnode.h> -#include <Qt3DCore/qnode.h> QT_BEGIN_NAMESPACE diff --git a/tests/auto/core/common/qbackendnodetester.h b/tests/auto/core/common/qbackendnodetester.h index a9738dff0..a0b89e503 100644 --- a/tests/auto/core/common/qbackendnodetester.h +++ b/tests/auto/core/common/qbackendnodetester.h @@ -41,13 +41,13 @@ #include <Qt3DCore/qnodeid.h> #include <Qt3DCore/qscenechange.h> #include <Qt3DCore/qnodecreatedchange.h> +#include <Qt3DCore/qnode.h> QT_BEGIN_NAMESPACE namespace Qt3DCore { class QBackendNode; -class QNode; class QBackendNodeTester : public QObject { @@ -57,9 +57,21 @@ public: // Proxies to allow test classes to call private methods on QBackendNode void setPeerId(QBackendNode *backend, QNodeId id); - void simulateInitialization(QNode *frontend, QBackendNode *backend); void sceneChangeEvent(QBackendNode *backend, const Qt3DCore::QSceneChangePtr &e); Qt3DCore::QNodeCreatedChangeBasePtr creationChange(QNode *frontend) const; + + template<class Backend> + void simulateInitializationSync(QNode *frontend, Backend *backend) + { + Q_ASSERT(frontend); + Q_ASSERT(backend); + + backend->setPeerId(frontend->id()); + backend->setEnabled(frontend->isEnabled()); + backend->syncFromFrontEnd(frontend, true); + } + + void simulateInitialization(QNode *frontend, QBackendNode *backend); }; } // namespace Qt3DCore diff --git a/tests/auto/core/nodes/tst_nodes.cpp b/tests/auto/core/nodes/tst_nodes.cpp index 150df3ef0..c5369ab3e 100644 --- a/tests/auto/core/nodes/tst_nodes.cpp +++ b/tests/auto/core/nodes/tst_nodes.cpp @@ -31,6 +31,7 @@ #include <Qt3DCore/qentity.h> #include <Qt3DCore/qcomponent.h> #include <Qt3DCore/qaspectengine.h> +#include <Qt3DCore/qabstractaspect.h> #include <Qt3DCore/private/qscene_p.h> #include <Qt3DCore/qpropertyupdatedchange.h> #include <Qt3DCore/qcomponentaddedchange.h> @@ -40,6 +41,7 @@ #include <Qt3DCore/qpropertynoderemovedchange.h> #include <Qt3DCore/private/qnodecreatedchangegenerator_p.h> #include <Qt3DCore/private/qaspectengine_p.h> +#include <private/qabstractaspect_p.h> #include <private/qpostman_p.h> #include <Qt3DCore/private/qlockableobserverinterface_p.h> @@ -76,6 +78,8 @@ private slots: void checkParentChangeToOtherParent(); void checkParentChangeFromExistingBackendParentToNewlyCreatedParent(); void checkBackendNodesCreatedFromTopDown(); //QTBUG-74106 + void checkBackendNodesCreatedFromTopDownWithReparenting(); + void checkAllBackendCreationDoneInSingleFrame(); void removingSingleChildNodeFromNode(); void removingMultipleChildNodesFromNode(); @@ -425,6 +429,124 @@ public: } }; +class TestAspectPrivate; +class TestAspect : public Qt3DCore::QAbstractAspect +{ + Q_OBJECT +public: + explicit TestAspect(QObject *parent = nullptr); + + enum ChangeType { Creation, Destruction }; + + void clearNodes() + { + events.clear(); + allNodes.clear(); + } + + void addEvent(const Qt3DCore::QNodeId &id, ChangeType change) + { + events.push_back(Event{ change, id}); + } + + QVector<Qt3DCore::QNodeId> filteredEvents(ChangeType change) const + { + QVector<Qt3DCore::QNodeId> result; + for (const auto &event : events) { + if (event.type == change) + result.push_back(event.nodeId); + } + return result; + } + + struct Event{ + ChangeType type; + Qt3DCore::QNodeId nodeId; + }; + + mutable QVector<Event> events; + mutable QHash<Qt3DCore::QNodeId, Qt3DCore::QNode *> allNodes; + +private: + Q_DECLARE_PRIVATE(TestAspect) + explicit TestAspect(TestAspectPrivate &dd, QObject *parent); +}; + +class TestFunctor : public Qt3DCore::QBackendNodeMapper +{ +public: + TestFunctor(TestAspect *aspect) : m_aspect(aspect) {} + + Qt3DCore::QBackendNode *create(const Qt3DCore::QNodeCreatedChangeBasePtr &change) const override + { + auto node = new Qt3DCore::QBackendNode; + m_Nodes.insert(change->subjectId(), node); + m_aspect->addEvent(change->subjectId(), TestAspect::Creation); + return node; + } + + Qt3DCore::QBackendNode *get(Qt3DCore::QNodeId id) const override + { + return m_Nodes.value(id, nullptr); + } + + void destroy(Qt3DCore::QNodeId id) const override + { + if (m_Nodes.contains(id)) { + m_aspect->addEvent(id, TestAspect::Destruction); + delete m_Nodes.take(id); + } + } + +private: + mutable QHash<Qt3DCore::QNodeId, Qt3DCore::QBackendNode *> m_Nodes; + TestAspect *m_aspect; +}; + +class TestAspectPrivate : public Qt3DCore::QAbstractAspectPrivate +{ +public: + TestAspectPrivate() = default; + void syncDirtyFrontEndNode(Qt3DCore::QNode *node, Qt3DCore::QBackendNode *backend, + bool firstTime) const override + { + Q_UNUSED(backend); + auto q = q_func(); + if (firstTime) + q->allNodes.insert(node->id(), node); + } + + Q_DECLARE_PUBLIC(TestAspect) +}; + +TestAspect::TestAspect(QObject *parent) : TestAspect(*new TestAspectPrivate, parent) +{ + registerBackendType<Qt3DCore::QEntity, true>(QSharedPointer<TestFunctor>::create(this)); + registerBackendType<MyQEntity, true>(QSharedPointer<TestFunctor>::create(this)); + registerBackendType<MyQNode, true>(QSharedPointer<TestFunctor>::create(this)); + registerBackendType<Qt3DCore::QNode, true>(QSharedPointer<TestFunctor>::create(this)); +} + +TestAspect::TestAspect(TestAspectPrivate &dd, QObject *parent) + : Qt3DCore::QAbstractAspect(dd, parent) +{ + setObjectName(QStringLiteral("Test Aspect")); +} + +namespace { +void verifyChildrenCreatedBeforeParents(Qt3DCore::QNode *root, TestAspect *aspect) +{ + QSet<Qt3DCore::QNodeId> processedNodes; + processedNodes.insert(root->id()); + for (const auto &nodeId : aspect->filteredEvents(TestAspect::Creation)) { + const auto node = aspect->allNodes.value(nodeId); + Q_ASSERT(node); + const auto parentNode = node->parentNode(); + QVERIFY(parentNode == nullptr || processedNodes.contains(parentNode->id())); + processedNodes.insert(nodeId); + } +} +} void tst_Nodes::initTestCase() { @@ -802,17 +924,27 @@ void tst_Nodes::checkParentChangeFromExistingBackendParentToNewlyCreatedParent() Qt3DCore::QAspectEngine engine; QScopedPointer<MyQEntity> root(new MyQEntity()); root->setArbiterAndEngine(&spy, &engine); + auto aspect = new TestAspect; + engine.registerAspect(aspect); + MyQNode *child(new MyQNode(root.data())); MyQNode *child2(new MyQNode(root.data())); + QCoreApplication::processEvents(); // Due to the way we create root, it has a backend QVERIFY(Qt3DCore::QNodePrivate::get(root.data())->m_hasBackendNode == true); + QCOMPARE(aspect->events.count(), 2); + QCOMPARE(aspect->events[0].type, TestAspect::Creation); + QCOMPARE(aspect->events[0].nodeId, child->id()); + QCOMPARE(aspect->events[1].type, TestAspect::Creation); + QCOMPARE(aspect->events[1].nodeId, child2->id()); // THEN QCOMPARE(spy.events.size(), 2); // 2 x (1 child added to parent change) // WHEN -> Reparenting child with backend node to new parent with no backend yet + aspect->clearNodes(); spy.events.clear(); QScopedPointer<Qt3DCore::QNode> newParent(new MyQNode(root.data())); child->setParent(newParent.data()); @@ -851,9 +983,22 @@ void tst_Nodes::checkParentChangeFromExistingBackendParentToNewlyCreatedParent() QCOMPARE(event2->addedNodeId(), newParent->id()); QCOMPARE(event2->metaObject(), newParent->metaObject()); QCOMPARE(event2->subjectId(), root->id()); + + QCOMPARE(aspect->events.count(), 3); + + // child backend is destroyed because it was reparented to node without backend (newParent) + QCOMPARE(aspect->events[0].type, TestAspect::Destruction); + QCOMPARE(aspect->events[0].nodeId, child->id()); + + // newParent and child both get backends created + QCOMPARE(aspect->events[1].type, TestAspect::Creation); + QCOMPARE(aspect->events[1].nodeId, newParent->id()); + QCOMPARE(aspect->events[2].type, TestAspect::Creation); + QCOMPARE(aspect->events[2].nodeId, child->id()); } // WHEN -> Changing parent to node with existing backend + aspect->clearNodes(); child->setParent(child2); // THEN @@ -911,6 +1056,10 @@ void tst_Nodes::checkParentChangeFromExistingBackendParentToNewlyCreatedParent() QCOMPARE(event2->addedNodeId(), newParent2->id()); QCOMPARE(event2->metaObject(), newParent2->metaObject()); QCOMPARE(event2->subjectId(), root->id()); + + // child backend is destroyed because it was reparented to node without backend (newParent) + QCOMPARE(aspect->events[0].type, TestAspect::Destruction); + QCOMPARE(aspect->events[0].nodeId, child->id()); } } @@ -922,7 +1071,10 @@ void tst_Nodes::checkBackendNodesCreatedFromTopDown() // GIVEN ObserverSpy spy; Qt3DCore::QAspectEngine engine; + auto aspect = new TestAspect; + engine.registerAspect(aspect); QScopedPointer<MyQEntity> root(new MyQEntity()); + root->setArbiterAndEngine(&spy, &engine); QScopedPointer<Qt3DCore::QNode> parentWithBackend(new MyQNode(root.data())); @@ -936,7 +1088,7 @@ void tst_Nodes::checkBackendNodesCreatedFromTopDown() MyQNode *dummyParent(new MyQNode(parentWithBackend.data())); MyQNode *child1(new MyQNode(parentWithBackend.data())); MyQNode *child2(new MyQNode(dummyParent)); - child2->setNodeProperty(child1); + child1->setNodeProperty(child2); // THEN - we should have no events because the new nodes have no backend yet QCOMPARE(spy.events.count(), 0); @@ -970,9 +1122,57 @@ void tst_Nodes::checkBackendNodesCreatedFromTopDown() QCOMPARE(event2->type(), Qt3DCore::PropertyValueAdded); QCOMPARE(event2->addedNodeId(), child1->id()); QCOMPARE(event2->subjectId(), parentWithBackend->id()); + + verifyChildrenCreatedBeforeParents(root.get(), aspect); } + } +void tst_Nodes::checkBackendNodesCreatedFromTopDownWithReparenting() +{ + // GIVEN + ObserverSpy spy; + Qt3DCore::QAspectEngine engine; + auto aspect = new TestAspect; + engine.registerAspect(aspect); + QScopedPointer<MyQEntity> root(new MyQEntity()); + + root->setArbiterAndEngine(&spy, &engine); + QScopedPointer<Qt3DCore::QNode> parentWithBackend(new MyQNode(root.data())); + + // create parent backend node + QCoreApplication::processEvents(); + QCoreApplication::processEvents(); + QVERIFY(Qt3DCore::QNodePrivate::get(parentWithBackend.get())->m_hasBackendNode); + + // WHEN -> creating a node with a parent with backend, then reparenting it to another + // parent with backend created after it. + spy.events.clear(); + auto node1 = new MyQNode(parentWithBackend.data()); + auto parent1 = new MyQNode(parentWithBackend.data()); + node1->setParent(parent1); + + QCoreApplication::processEvents(); + + // THEN + QVERIFY(node1->parent() == parent1); + QVERIFY(parent1->parent() == parentWithBackend.data()); + verifyChildrenCreatedBeforeParents(root.get(), aspect); + + + // WHEN -> creating 2 nodes with no parent and reparenting the first to the second + auto node2 = new MyQNode(nullptr); + auto parent2 = new MyQNode(nullptr); + node2->setParent(parent2); + parent2->setParent(parentWithBackend.get()); + + QCoreApplication::processEvents(); + + // THEN + QVERIFY(node2->parent() == parent2); + QVERIFY(parent2->parent() == parentWithBackend.data()); + verifyChildrenCreatedBeforeParents(root.get(), aspect); +} void tst_Nodes::removingSingleChildNodeFromNode() { @@ -1010,6 +1210,52 @@ void tst_Nodes::removingSingleChildNodeFromNode() QCOMPARE(removalEvent->metaObject(), child->metaObject()); } +void tst_Nodes::checkAllBackendCreationDoneInSingleFrame() +{ + // GIVEN + ObserverSpy spy; + Qt3DCore::QAspectEngine engine; + auto aspect = new TestAspect; + engine.registerAspect(aspect); + + QScopedPointer<MyQEntity> root(new MyQEntity()); + root->setArbiterAndEngine(&spy, &engine); + + QCoreApplication::processEvents(); + + // THEN + // Due to the way we create root, it has a backend + QVERIFY(Qt3DCore::QNodePrivate::get(root.data())->m_hasBackendNode == true); + QCOMPARE(aspect->events.count(), 1); + QCOMPARE(aspect->events[0].type, TestAspect::Creation); + QCOMPARE(aspect->events[0].nodeId, root->id()); + + // WHEN -> create 2 children: + // 1. a child with parent with backend node + // 2. a child with no parent that is then reparented to a parent with backend node + aspect->clearNodes(); + auto child1 = new MyQNode(root.data()); + auto child2 = new MyQNode; + child2->setParent(root.data()); + + // THEN - reparented child should have a backend node, but other child should + // still be waiting + QCOMPARE(child1->parent(), root.data()); + QCOMPARE(child2->parent(), root.data()); + QVERIFY(Qt3DCore::QNodePrivate::get(child1)->m_hasBackendNode == false); + QVERIFY(Qt3DCore::QNodePrivate::get(child2)->m_hasBackendNode == true); + + // WHEN + QCoreApplication::processEvents(); + + // THEN - both children have their backend nodes actually created. + QCOMPARE(aspect->events.count(), 2); + QCOMPARE(aspect->events[0].type, TestAspect::Creation); + QCOMPARE(aspect->events[0].nodeId, child2->id()); + QCOMPARE(aspect->events[1].type, TestAspect::Creation); + QCOMPARE(aspect->events[1].nodeId, child1->id()); +} + void tst_Nodes::removingMultipleChildNodesFromNode() { // GIVEN @@ -1098,6 +1344,8 @@ void tst_Nodes::checkConstructionSetParentMix() // GIVEN ObserverSpy spy; Qt3DCore::QAspectEngine engine; + auto aspect = new TestAspect; + engine.registerAspect(aspect); QScopedPointer<MyQEntity> root(new MyQEntity()); // WHEN @@ -1122,10 +1370,7 @@ void tst_Nodes::checkConstructionSetParentMix() QCOMPARE(spy.events.size(), 1); // 1 child added (subTree to root) // Ensure first event is subTreeRoot -// const Qt3DCore::QNodeCreatedChangeBasePtr firstEvent = spy.events.takeFirst().change().dynamicCast<Qt3DCore::QNodeCreatedChangeBase>(); -// QVERIFY(!firstEvent.isNull()); -// QCOMPARE(firstEvent->subjectId(), subTreeRoot->id()); -// QCOMPARE(firstEvent->parentId(), root->id()); + verifyChildrenCreatedBeforeParents(root.data(), aspect); const Qt3DCore::QPropertyNodeAddedChangePtr lastEvent = spy.events.takeLast().change().dynamicCast<Qt3DCore::QPropertyNodeAddedChange>(); QVERIFY(!lastEvent.isNull()); @@ -1170,8 +1415,7 @@ void tst_Nodes::checkParentingQEntityToQNode() // THEN we should get // - one child removed change for childEntity->subTreeRoot, // - one child added change for childEntity->childNode, - // - and one property updated event specifying the correct QEntity parent (subTreeRoot) - QCOMPARE(spy.events.size(), 3); + QCOMPARE(spy.events.size(), 2); const auto removedEvent = spy.events.takeFirst().change().dynamicCast<Qt3DCore::QPropertyNodeRemovedChange>(); QVERIFY(!removedEvent.isNull()); @@ -1181,11 +1425,15 @@ void tst_Nodes::checkParentingQEntityToQNode() QVERIFY(!addedEvent.isNull()); QCOMPARE(addedEvent->subjectId(), childNode->id()); - const auto parentChangeEvent = spy.events.takeFirst().change().dynamicCast<Qt3DCore::QPropertyUpdatedChange>(); - QVERIFY(!parentChangeEvent.isNull()); - QCOMPARE(parentChangeEvent->subjectId(), childEntity->id()); - QCOMPARE(parentChangeEvent->propertyName(), "parentEntityUpdated"); - QCOMPARE(parentChangeEvent->value().value<Qt3DCore::QNodeId>(), subTreeRoot->id()); + // The arbiter's dirtyNodes should contain the childEntity and + // - the dirty node's parent should be childNode + // - the dirty node's parent entity should be the subTreeRoot + QCOMPARE(spy.dirtyNodes.size(), 1); + const auto dirtyEntity = qobject_cast<Qt3DCore::QEntity*>(spy.dirtyNodes.takeFirst()); + QVERIFY(dirtyEntity); + QCOMPARE(dirtyEntity, childEntity); + QCOMPARE(dirtyEntity->parent(), childNode); + QCOMPARE(dirtyEntity->parentEntity(), subTreeRoot); } void tst_Nodes::checkConstructionWithParent() @@ -1206,8 +1454,7 @@ void tst_Nodes::checkConstructionWithParent() auto *node = new MyQNode(root.data()); root->setNodeProperty(node); - // THEN we should get one creation change, one child added change - // in that order. + // THEN we should get one child added change QCoreApplication::processEvents(); QCOMPARE(root->children().count(), 1); QCOMPARE(spy.events.size(), 1); // 1 child added change diff --git a/tests/auto/quick3d/3dcore/3dcore.qml b/tests/auto/quick3d/3dcore/3dcore.qml index 72514591c..d0a5c6f09 100644 --- a/tests/auto/quick3d/3dcore/3dcore.qml +++ b/tests/auto/quick3d/3dcore/3dcore.qml @@ -30,6 +30,7 @@ import Qt3D.Core 2.0 as QQ3Core20 import Qt3D.Core 2.9 as QQ3Core29 import Qt3D.Core 2.10 as QQ3Core210 +import Qt3D.Core 2.14 as QQ3Core214 import QtQuick 2.0 Item { @@ -47,4 +48,6 @@ Item { QQ3Core210.Armature {} QQ3Core210.SkeletonLoader {} QQ3Core210.Joint {} + + QQ3Core214.Transform {} } diff --git a/tests/auto/quick3d/3drender/3drender.qml b/tests/auto/quick3d/3drender/3drender.qml index 150b7c1fe..8c200f3c0 100644 --- a/tests/auto/quick3d/3drender/3drender.qml +++ b/tests/auto/quick3d/3drender/3drender.qml @@ -163,4 +163,7 @@ Item { QQ3Render20.StencilOperation {} //Qt3DRender::QStencilOperation QQ3Render20.StencilMask {} //Qt3DRender::QStencilMask + QQ3Render214.DepthRange {} + QQ3Render214.RasterMode {} + } diff --git a/tests/auto/render/armature/tst_armature.cpp b/tests/auto/render/armature/tst_armature.cpp index 2c481db7a..4f9380a3b 100644 --- a/tests/auto/render/armature/tst_armature.cpp +++ b/tests/auto/render/armature/tst_armature.cpp @@ -56,7 +56,7 @@ private Q_SLOTS: armature.setSkeleton(skeleton); // WHEN - simulateInitialization(&armature, &backendArmature); + simulateInitializationSync(&armature, &backendArmature); // THEN QCOMPARE(backendArmature.peerId(), armature.id()); @@ -80,7 +80,7 @@ private Q_SLOTS: armature.setSkeleton(skeleton); // WHEN - simulateInitialization(&armature, &backendArmature); + simulateInitializationSync(&armature, &backendArmature); backendArmature.cleanup(); // THEN @@ -91,24 +91,21 @@ private Q_SLOTS: void checkPropertyChanges() { // GIVEN + QArmature armature; Armature backendArmature; - Qt3DCore::QPropertyUpdatedChangePtr updateChange; + simulateInitializationSync(&armature, &backendArmature); // WHEN - updateChange.reset(new Qt3DCore::QPropertyUpdatedChange(Qt3DCore::QNodeId())); - updateChange->setPropertyName("enabled"); - updateChange->setValue(true); - backendArmature.sceneChangeEvent(updateChange); + armature.setEnabled(false); + backendArmature.syncFromFrontEnd(&armature, false); // THEN - QCOMPARE(backendArmature.isEnabled(), true); + QCOMPARE(backendArmature.isEnabled(), false); // WHEN auto newSkeleton = new QSkeleton(); - updateChange.reset(new Qt3DCore::QPropertyUpdatedChange(Qt3DCore::QNodeId())); - updateChange->setPropertyName("skeleton"); - updateChange->setValue(QVariant::fromValue(newSkeleton->id())); - backendArmature.sceneChangeEvent(updateChange); + armature.setSkeleton(newSkeleton); + backendArmature.syncFromFrontEnd(&armature, false); // THEN QCOMPARE(backendArmature.skeletonId(), newSkeleton->id()); diff --git a/tests/auto/render/attribute/tst_attribute.cpp b/tests/auto/render/attribute/tst_attribute.cpp index e0f6f6b5c..12b99b37d 100644 --- a/tests/auto/render/attribute/tst_attribute.cpp +++ b/tests/auto/render/attribute/tst_attribute.cpp @@ -36,12 +36,15 @@ class tst_Attribute : public Qt3DCore::QBackendNodeTester { Q_OBJECT + private Q_SLOTS: void checkPeerPropertyMirroring() { // GIVEN + TestRenderer renderer; Qt3DRender::Render::Attribute renderAttribute; + renderAttribute.setRenderer(&renderer); Qt3DRender::QAttribute attribute; attribute.setAttributeType(Qt3DRender::QAttribute::IndexAttribute); @@ -59,7 +62,7 @@ private Q_SLOTS: attribute.setBuffer(&buffer); // WHEN - simulateInitialization(&attribute, &renderAttribute); + simulateInitializationSync(&attribute, &renderAttribute); // THEN QCOMPARE(renderAttribute.peerId(), attribute.id()); @@ -111,7 +114,7 @@ private Q_SLOTS: attribute.setBuffer(&buffer); // WHEN - simulateInitialization(&attribute, &renderAttribute); + simulateInitializationSync(&attribute, &renderAttribute); renderAttribute.cleanup(); // THEN @@ -130,17 +133,20 @@ private Q_SLOTS: void checkPropertyChanges() { // GIVEN + Qt3DRender::QAttribute attribute; TestRenderer renderer; Qt3DRender::Render::Attribute renderAttribute; renderAttribute.setRenderer(&renderer); + simulateInitializationSync(&attribute, &renderAttribute); + renderAttribute.cleanup(); + renderer.resetDirty(); QVERIFY(!renderAttribute.isDirty()); + QVERIFY(!renderer.dirtyBits()); // WHEN - Qt3DCore::QPropertyUpdatedChangePtr updateChange(new Qt3DCore::QPropertyUpdatedChange(Qt3DCore::QNodeId())); - updateChange->setValue(static_cast<int>(Qt3DRender::QAttribute::Int)); - updateChange->setPropertyName("vertexBaseType"); - renderAttribute.sceneChangeEvent(updateChange); + attribute.setVertexBaseType(Qt3DRender::QAttribute::Int); + renderAttribute.syncFromFrontEnd(&attribute, false); // THEN QCOMPARE(renderAttribute.vertexBaseType(), Qt3DRender::QAttribute::Int); @@ -153,10 +159,8 @@ private Q_SLOTS: QVERIFY(!renderer.dirtyBits()); // WHEN - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - updateChange->setValue(3); - updateChange->setPropertyName("vertexSize"); - renderAttribute.sceneChangeEvent(updateChange); + attribute.setVertexSize(3); + renderAttribute.syncFromFrontEnd(&attribute, false); // THEN QCOMPARE(renderAttribute.vertexSize(), 3U); @@ -168,10 +172,8 @@ private Q_SLOTS: QVERIFY(!renderAttribute.isDirty()); // WHEN - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - updateChange->setValue(static_cast<int>(Qt3DRender::QAttribute::IndexAttribute)); - updateChange->setPropertyName("attributeType"); - renderAttribute.sceneChangeEvent(updateChange); + attribute.setAttributeType(Qt3DRender::QAttribute::IndexAttribute); + renderAttribute.syncFromFrontEnd(&attribute, false); // THEN QCOMPARE(renderAttribute.attributeType(), Qt3DRender::QAttribute::IndexAttribute); @@ -183,10 +185,8 @@ private Q_SLOTS: QVERIFY(!renderAttribute.isDirty()); // WHEN - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - updateChange->setValue(static_cast<int>(Qt3DRender::QAttribute::DrawIndirectAttribute)); - updateChange->setPropertyName("attributeType"); - renderAttribute.sceneChangeEvent(updateChange); + attribute.setAttributeType(Qt3DRender::QAttribute::DrawIndirectAttribute); + renderAttribute.syncFromFrontEnd(&attribute, false); // THEN QCOMPARE(renderAttribute.attributeType(), Qt3DRender::QAttribute::DrawIndirectAttribute); @@ -198,10 +198,8 @@ private Q_SLOTS: QVERIFY(!renderAttribute.isDirty()); // WHEN - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - updateChange->setValue(1340); - updateChange->setPropertyName("count"); - renderAttribute.sceneChangeEvent(updateChange); + attribute.setCount(1340); + renderAttribute.syncFromFrontEnd(&attribute, false); // THEN QCOMPARE(renderAttribute.count(), 1340U); @@ -213,10 +211,8 @@ private Q_SLOTS: QVERIFY(!renderAttribute.isDirty()); // WHEN - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - updateChange->setValue(QStringLiteral("L88")); - updateChange->setPropertyName("name"); - renderAttribute.sceneChangeEvent(updateChange); + attribute.setName(QStringLiteral("L88")); + renderAttribute.syncFromFrontEnd(&attribute, false); // THEN QCOMPARE(renderAttribute.name(), QStringLiteral("L88")); @@ -228,10 +224,8 @@ private Q_SLOTS: QVERIFY(!renderAttribute.isDirty()); // WHEN - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - updateChange->setValue(555); - updateChange->setPropertyName("byteOffset"); - renderAttribute.sceneChangeEvent(updateChange); + attribute.setByteOffset(555U); + renderAttribute.syncFromFrontEnd(&attribute, false); // THEN QCOMPARE(renderAttribute.byteOffset(), 555U); @@ -243,10 +237,8 @@ private Q_SLOTS: QVERIFY(!renderAttribute.isDirty()); // WHEN - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - updateChange->setValue(454); - updateChange->setPropertyName("byteStride"); - renderAttribute.sceneChangeEvent(updateChange); + attribute.setByteStride(454); + renderAttribute.syncFromFrontEnd(&attribute, false); // THEN QCOMPARE(renderAttribute.byteStride(), 454U); @@ -258,10 +250,8 @@ private Q_SLOTS: QVERIFY(!renderAttribute.isDirty()); // WHEN - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - updateChange->setValue(1450); - updateChange->setPropertyName("divisor"); - renderAttribute.sceneChangeEvent(updateChange); + attribute.setDivisor(1450); + renderAttribute.syncFromFrontEnd(&attribute, false); // THEN QCOMPARE(renderAttribute.divisor(), 1450U); @@ -273,14 +263,12 @@ private Q_SLOTS: QVERIFY(!renderAttribute.isDirty()); // WHEN - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - Qt3DCore::QNodeId bufferId = Qt3DCore::QNodeId::createId(); - updateChange->setValue(QVariant::fromValue(bufferId)); - updateChange->setPropertyName("buffer"); - renderAttribute.sceneChangeEvent(updateChange); + auto buffer = new Qt3DRender::QBuffer(); + attribute.setBuffer(buffer); + renderAttribute.syncFromFrontEnd(&attribute, false); // THEN - QCOMPARE(renderAttribute.bufferId(), bufferId); + QCOMPARE(renderAttribute.bufferId(), buffer->id()); QVERIFY(renderAttribute.isDirty()); QVERIFY(renderer.dirtyBits() != 0); diff --git a/tests/auto/render/boundingsphere/tst_boundingsphere.cpp b/tests/auto/render/boundingsphere/tst_boundingsphere.cpp index 98993209a..f1c228f17 100644 --- a/tests/auto/render/boundingsphere/tst_boundingsphere.cpp +++ b/tests/auto/render/boundingsphere/tst_boundingsphere.cpp @@ -314,13 +314,13 @@ private Q_SLOTS: Qt3DRender::Render::Buffer *vbufferBackend = test->nodeManagers()->bufferManager()->getOrCreateResource(vbuffer->id()); vbufferBackend->setRenderer(test->renderer()); vbufferBackend->setManager(test->nodeManagers()->bufferManager()); - simulateInitialization(vbuffer, vbufferBackend); + simulateInitializationSync(vbuffer, vbufferBackend); ibuffer->setData(idata); Qt3DRender::Render::Buffer *ibufferBackend = test->nodeManagers()->bufferManager()->getOrCreateResource(ibuffer->id()); ibufferBackend->setRenderer(test->renderer()); ibufferBackend->setManager(test->nodeManagers()->bufferManager()); - simulateInitialization(ibuffer, ibufferBackend); + simulateInitializationSync(ibuffer, ibufferBackend); Qt3DRender::QGeometry *g = new Qt3DRender::QGeometry; for (int i = 0; i < 2; ++i) @@ -354,23 +354,23 @@ private Q_SLOTS: Qt3DRender::Render::Attribute *attr0Backend = test->nodeManagers()->attributeManager()->getOrCreateResource(attrs[0]->id()); attr0Backend->setRenderer(test->renderer()); - simulateInitialization(attrs[0], attr0Backend); + simulateInitializationSync(attrs[0], attr0Backend); Qt3DRender::Render::Attribute *attr1Backend = test->nodeManagers()->attributeManager()->getOrCreateResource(attrs[1]->id()); attr1Backend->setRenderer(test->renderer()); - simulateInitialization(attrs[1], attr1Backend); + simulateInitializationSync(attrs[1], attr1Backend); Qt3DRender::Render::Geometry *gBackend = test->nodeManagers()->geometryManager()->getOrCreateResource(g->id()); gBackend->setRenderer(test->renderer()); - simulateInitialization(g, gBackend); + simulateInitializationSync(g, gBackend); Qt3DRender::Render::GeometryRenderer *grBackend = test->nodeManagers()->geometryRendererManager()->getOrCreateResource(gr->id()); grBackend->setRenderer(test->renderer()); grBackend->setManager(test->nodeManagers()->geometryRendererManager()); - simulateInitialization(gr, grBackend); + simulateInitializationSync(gr, grBackend); Qt3DRender::Render::Entity *entityBackend = test->nodeManagers()->renderNodesManager()->getOrCreateResource(entity->id()); entityBackend->setRenderer(test->renderer()); - simulateInitialization(entity.data(), entityBackend); + simulateInitializationSync(entity.data(), entityBackend); Qt3DRender::Render::CalculateBoundingVolumeJob calcBVolume; calcBVolume.setManagers(test->nodeManagers()); @@ -382,10 +382,10 @@ private Q_SLOTS: qDebug() << radius << center; // truncate and compare integers only - QVERIFY(int(radius) == int(expectedRadius)); - QVERIFY(int(center.x()) == int(expectedCenter.x())); - QVERIFY(int(center.y()) == int(expectedCenter.y())); - QVERIFY(int(center.z()) == int(expectedCenter.z())); + QCOMPARE(int(radius), int(expectedRadius)); + QCOMPARE(int(center.x()), int(expectedCenter.x())); + QCOMPARE(int(center.y()), int(expectedCenter.y())); + QCOMPARE(int(center.z()), int(expectedCenter.z())); } void checkCustomPackedGeometry() @@ -426,7 +426,7 @@ private Q_SLOTS: Qt3DRender::Render::Buffer *vbufferBackend = test->nodeManagers()->bufferManager()->getOrCreateResource(vbuffer->id()); vbufferBackend->setRenderer(test->renderer()); vbufferBackend->setManager(test->nodeManagers()->bufferManager()); - simulateInitialization(vbuffer, vbufferBackend); + simulateInitializationSync(vbuffer, vbufferBackend); Qt3DRender::QGeometry *g = new Qt3DRender::QGeometry; g->addAttribute(new Qt3DRender::QAttribute); @@ -448,20 +448,20 @@ private Q_SLOTS: Qt3DRender::Render::Attribute *attr0Backend = test->nodeManagers()->attributeManager()->getOrCreateResource(attrs[0]->id()); attr0Backend->setRenderer(test->renderer()); - simulateInitialization(attrs[0], attr0Backend); + simulateInitializationSync(attrs[0], attr0Backend); Qt3DRender::Render::Geometry *gBackend = test->nodeManagers()->geometryManager()->getOrCreateResource(g->id()); gBackend->setRenderer(test->renderer()); - simulateInitialization(g, gBackend); + simulateInitializationSync(g, gBackend); Qt3DRender::Render::GeometryRenderer *grBackend = test->nodeManagers()->geometryRendererManager()->getOrCreateResource(gr->id()); grBackend->setRenderer(test->renderer()); grBackend->setManager(test->nodeManagers()->geometryRendererManager()); - simulateInitialization(gr, grBackend); + simulateInitializationSync(gr, grBackend); Qt3DRender::Render::Entity *entityBackend = test->nodeManagers()->renderNodesManager()->getOrCreateResource(entity->id()); entityBackend->setRenderer(test->renderer()); - simulateInitialization(entity.data(), entityBackend); + simulateInitializationSync(entity.data(), entityBackend); Qt3DRender::Render::CalculateBoundingVolumeJob calcBVolume; calcBVolume.setManagers(test->nodeManagers()); diff --git a/tests/auto/render/buffer/tst_buffer.cpp b/tests/auto/render/buffer/tst_buffer.cpp index da853d4e9..1487d3728 100644 --- a/tests/auto/render/buffer/tst_buffer.cpp +++ b/tests/auto/render/buffer/tst_buffer.cpp @@ -65,6 +65,7 @@ private: class tst_RenderBuffer : public Qt3DCore::QBackendNodeTester { Q_OBJECT + private Q_SLOTS: void checkPeerPropertyMirroring() @@ -82,7 +83,7 @@ private Q_SLOTS: // WHEN renderBuffer.setRenderer(&renderer); renderBuffer.setManager(&bufferManager); - simulateInitialization(&buffer, &renderBuffer); + simulateInitializationSync(&buffer, &renderBuffer); // THEN QCOMPARE(renderBuffer.peerId(), buffer.id()); @@ -98,170 +99,154 @@ private Q_SLOTS: void checkInitialAndCleanedUpState() { // GIVEN - Qt3DRender::Render::Buffer renderBuffer; + Qt3DRender::Render::Buffer backendBuffer; Qt3DRender::Render::BufferManager bufferManager; TestRenderer renderer; // THEN - QCOMPARE(renderBuffer.isDirty(), false); - QCOMPARE(renderBuffer.usage(), Qt3DRender::QBuffer::StaticDraw); - QVERIFY(renderBuffer.data().isEmpty()); - QVERIFY(renderBuffer.peerId().isNull()); - QVERIFY(renderBuffer.dataGenerator().isNull()); - QVERIFY(renderBuffer.pendingBufferUpdates().empty()); + QCOMPARE(backendBuffer.isDirty(), false); + QCOMPARE(backendBuffer.usage(), Qt3DRender::QBuffer::StaticDraw); + QVERIFY(backendBuffer.data().isEmpty()); + QVERIFY(backendBuffer.peerId().isNull()); + QVERIFY(backendBuffer.dataGenerator().isNull()); + QVERIFY(backendBuffer.pendingBufferUpdates().empty()); // GIVEN - Qt3DRender::QBuffer buffer; - buffer.setUsage(Qt3DRender::QBuffer::DynamicCopy); - buffer.setData(QByteArrayLiteral("C7")); - buffer.setDataGenerator(Qt3DRender::QBufferDataGeneratorPtr(new TestFunctor(73))); + Qt3DRender::QBuffer frontendBuffer; + frontendBuffer.setUsage(Qt3DRender::QBuffer::DynamicCopy); + frontendBuffer.setData(QByteArrayLiteral("C7KR4")); + frontendBuffer.setDataGenerator(Qt3DRender::QBufferDataGeneratorPtr(new TestFunctor(73))); // WHEN - renderBuffer.setManager(&bufferManager); - renderBuffer.setRenderer(&renderer); - simulateInitialization(&buffer, &renderBuffer); + backendBuffer.setManager(&bufferManager); + backendBuffer.setRenderer(&renderer); + simulateInitializationSync(&frontendBuffer, &backendBuffer); - Qt3DCore::QPropertyUpdatedChangePtr updateChange(new Qt3DCore::QPropertyUpdatedChange(Qt3DCore::QNodeId())); - Qt3DRender::QBufferUpdate updateData; - updateData.offset = 2; - updateData.data = QByteArrayLiteral("LS5"); - updateChange->setValue(QVariant::fromValue(updateData)); - updateChange->setPropertyName("updateData"); - renderBuffer.sceneChangeEvent(updateChange); + frontendBuffer.updateData(2, QByteArrayLiteral("LS5")); + backendBuffer.syncFromFrontEnd(&frontendBuffer, false); // THEN - QCOMPARE(renderBuffer.usage(), Qt3DRender::QBuffer::DynamicCopy); - QCOMPARE(renderBuffer.isDirty(), true); - QCOMPARE(renderBuffer.data(), QByteArrayLiteral("C7LS5")); - QVERIFY(!renderBuffer.dataGenerator().isNull()); - QVERIFY(!renderBuffer.pendingBufferUpdates().empty()); + QCOMPARE(backendBuffer.usage(), Qt3DRender::QBuffer::DynamicCopy); + QCOMPARE(backendBuffer.isDirty(), true); + QCOMPARE(backendBuffer.data(), QByteArrayLiteral("C7LS5")); + QVERIFY(!backendBuffer.dataGenerator().isNull()); + QVERIFY(!backendBuffer.pendingBufferUpdates().empty()); // WHEN - renderBuffer.cleanup(); + backendBuffer.cleanup(); // THEN - QCOMPARE(renderBuffer.isDirty(), false); - QCOMPARE(renderBuffer.usage(), Qt3DRender::QBuffer::StaticDraw); - QVERIFY(renderBuffer.data().isEmpty()); - QVERIFY(renderBuffer.dataGenerator().isNull()); - QVERIFY(renderBuffer.pendingBufferUpdates().empty()); + QCOMPARE(backendBuffer.isDirty(), false); + QCOMPARE(backendBuffer.usage(), Qt3DRender::QBuffer::StaticDraw); + QVERIFY(backendBuffer.data().isEmpty()); + QVERIFY(backendBuffer.dataGenerator().isNull()); + QVERIFY(backendBuffer.pendingBufferUpdates().empty()); } void checkPropertyChanges() { // GIVEN TestRenderer renderer; - Qt3DRender::Render::Buffer renderBuffer; - renderBuffer.setRenderer(&renderer); + Qt3DRender::QBuffer frontendBuffer; + Qt3DRender::Render::Buffer backendBuffer; + backendBuffer.setRenderer(&renderer); + simulateInitializationSync(&frontendBuffer, &backendBuffer); // THEN - QVERIFY(renderBuffer.data().isEmpty()); - QVERIFY(renderBuffer.usage() != Qt3DRender::QBuffer::DynamicRead); - QVERIFY(!renderBuffer.isDirty()); - QVERIFY(!(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::BuffersDirty)); + QVERIFY(backendBuffer.data().isEmpty()); + QVERIFY(backendBuffer.usage() != Qt3DRender::QBuffer::DynamicRead); + QVERIFY(!backendBuffer.isDirty()); + QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::BuffersDirty); renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty); // WHEN - Qt3DCore::QPropertyUpdatedChangePtr updateChange(new Qt3DCore::QPropertyUpdatedChange(Qt3DCore::QNodeId())); - updateChange->setValue(static_cast<int>(Qt3DRender::QBuffer::DynamicRead)); - updateChange->setPropertyName("usage"); - renderBuffer.sceneChangeEvent(updateChange); + frontendBuffer.setUsage(Qt3DRender::QBuffer::DynamicRead); + backendBuffer.syncFromFrontEnd(&frontendBuffer, false); // THEN - QCOMPARE(renderBuffer.usage(), Qt3DRender::QBuffer::DynamicRead); - QVERIFY(renderBuffer.isDirty()); + QCOMPARE(backendBuffer.usage(), Qt3DRender::QBuffer::DynamicRead); + QVERIFY(backendBuffer.isDirty()); QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::BuffersDirty); renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty); - renderBuffer.unsetDirty(); - QVERIFY(!renderBuffer.isDirty()); + backendBuffer.unsetDirty(); + QVERIFY(!backendBuffer.isDirty()); // WHEN - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - updateChange->setValue(QByteArrayLiteral("LS9")); - updateChange->setPropertyName("data"); - renderBuffer.sceneChangeEvent(updateChange); + frontendBuffer.setData(QByteArrayLiteral("LS9SL")); + backendBuffer.syncFromFrontEnd(&frontendBuffer, false); // THEN - QCOMPARE(renderBuffer.data(), QByteArrayLiteral("LS9")); - QVERIFY(renderBuffer.isDirty()); - QCOMPARE(renderBuffer.pendingBufferUpdates().size(), 1); - QCOMPARE(renderBuffer.pendingBufferUpdates().first().offset, -1); + QCOMPARE(backendBuffer.data(), QByteArrayLiteral("LS9SL")); + QVERIFY(backendBuffer.isDirty()); + QCOMPARE(backendBuffer.pendingBufferUpdates().size(), 1); + QCOMPARE(backendBuffer.pendingBufferUpdates().first().offset, -1); - renderBuffer.pendingBufferUpdates().clear(); + backendBuffer.pendingBufferUpdates().clear(); QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::BuffersDirty); renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty); - renderBuffer.unsetDirty(); - QVERIFY(!renderBuffer.isDirty()); + backendBuffer.unsetDirty(); + QVERIFY(!backendBuffer.isDirty()); // WHEN Qt3DRender::QBufferDataGeneratorPtr functor(new TestFunctor(355)); - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - updateChange->setValue(QVariant::fromValue(functor)); - updateChange->setPropertyName("dataGenerator"); - renderBuffer.sceneChangeEvent(updateChange); + frontendBuffer.setDataGenerator(functor); + backendBuffer.syncFromFrontEnd(&frontendBuffer, false); // THEN - QCOMPARE(renderBuffer.dataGenerator(), functor); - QVERIFY(renderBuffer.isDirty()); + QCOMPARE(backendBuffer.dataGenerator(), functor); + QVERIFY(backendBuffer.isDirty()); QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::BuffersDirty); renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty); - renderBuffer.unsetDirty(); - QVERIFY(!renderBuffer.isDirty()); + backendBuffer.unsetDirty(); + QVERIFY(!backendBuffer.isDirty()); // WHEN - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - updateChange->setValue(true); - updateChange->setPropertyName("syncData"); - renderBuffer.sceneChangeEvent(updateChange); + frontendBuffer.setSyncData(true); + backendBuffer.syncFromFrontEnd(&frontendBuffer, false); // THEN - QCOMPARE(renderBuffer.isSyncData(), true); - QVERIFY(!renderBuffer.isDirty()); + QCOMPARE(backendBuffer.isSyncData(), true); + QVERIFY(!backendBuffer.isDirty()); QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::BuffersDirty); renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty); // WHEN TestArbiter arbiter; - Qt3DCore::QBackendNodePrivate::get(&renderBuffer)->setArbiter(&arbiter); - renderBuffer.executeFunctor(); + Qt3DCore::QBackendNodePrivate::get(&backendBuffer)->setArbiter(&arbiter); + backendBuffer.executeFunctor(); // THEN QCOMPARE(arbiter.events.count(), 1); Qt3DCore::QPropertyUpdatedChangePtr change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>(); QCOMPARE(change->propertyName(), "data"); QCOMPARE(change->value().toByteArray(), QByteArrayLiteral("454")); - QCOMPARE(renderBuffer.pendingBufferUpdates().size(), 1); - QCOMPARE(renderBuffer.pendingBufferUpdates().first().offset, -1); + QCOMPARE(backendBuffer.pendingBufferUpdates().size(), 1); + QCOMPARE(backendBuffer.pendingBufferUpdates().first().offset, -1); arbiter.events.clear(); - renderBuffer.pendingBufferUpdates().clear(); + backendBuffer.pendingBufferUpdates().clear(); // WHEN - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - Qt3DRender::QBufferUpdate updateData; - updateData.offset = 2; - updateData.data = QByteArrayLiteral("LS5"); - updateChange->setValue(QVariant::fromValue(updateData)); - updateChange->setPropertyName("updateData"); - renderBuffer.sceneChangeEvent(updateChange); + frontendBuffer.updateData(2, QByteArrayLiteral("LS5")); + backendBuffer.syncFromFrontEnd(&frontendBuffer, false); // THEN - QVERIFY(!renderBuffer.pendingBufferUpdates().empty()); - QCOMPARE(renderBuffer.pendingBufferUpdates().first().offset, 2); - QVERIFY(renderBuffer.isDirty()); + QVERIFY(!backendBuffer.pendingBufferUpdates().empty()); + QCOMPARE(backendBuffer.pendingBufferUpdates().first().offset, 2); + QVERIFY(backendBuffer.isDirty()); QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::BuffersDirty); renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty); - renderBuffer.unsetDirty(); - QVERIFY(!renderBuffer.isDirty()); + backendBuffer.unsetDirty(); + QVERIFY(!backendBuffer.isDirty()); } void checkBufferManagerReferenceCount() @@ -275,7 +260,7 @@ private Q_SLOTS: // WHEN renderBuffer.setRenderer(&renderer); renderBuffer.setManager(&bufferManager); - simulateInitialization(&buffer, &renderBuffer); + simulateInitializationSync(&buffer, &renderBuffer); // THEN QVERIFY(bufferManager.takeBuffersToRelease().empty()); @@ -305,7 +290,7 @@ private Q_SLOTS: QCOMPARE(renderer.dirtyBits(), 0); // WHEN - simulateInitialization(&buffer, &renderBuffer); + simulateInitializationSync(&buffer, &renderBuffer); // THEN QCOMPARE(renderer.dirtyBits(), Qt3DRender::Render::AbstractRenderer::BuffersDirty); diff --git a/tests/auto/render/coordinatereader/tst_coordinatereader.cpp b/tests/auto/render/coordinatereader/tst_coordinatereader.cpp index afb18fe55..417684245 100644 --- a/tests/auto/render/coordinatereader/tst_coordinatereader.cpp +++ b/tests/auto/render/coordinatereader/tst_coordinatereader.cpp @@ -101,7 +101,7 @@ private Q_SLOTS: ->getOrCreateResource(geometryRenderer->id()); backendRenderer->setRenderer(&renderer); backendRenderer->setManager(nodeManagers->geometryRendererManager()); - simulateInitialization(geometryRenderer.data(), backendRenderer); + simulateInitializationSync(geometryRenderer.data(), backendRenderer); // WHEN bool ret = reader.setGeometry(backendRenderer, QString("")); @@ -149,7 +149,7 @@ private Q_SLOTS: Buffer *backendBuffer = nodeManagers->bufferManager()->getOrCreateResource(dataBuffer->id()); backendBuffer->setRenderer(&renderer); backendBuffer->setManager(nodeManagers->bufferManager()); - simulateInitialization(dataBuffer.data(), backendBuffer); + simulateInitializationSync(dataBuffer.data(), backendBuffer); positionAttribute->setBuffer(dataBuffer.data()); positionAttribute->setName(Qt3DRender::QAttribute::defaultPositionAttributeName()); @@ -167,18 +167,18 @@ private Q_SLOTS: Attribute *backendAttribute = nodeManagers->attributeManager() ->getOrCreateResource(positionAttribute->id()); backendAttribute->setRenderer(&renderer); - simulateInitialization(positionAttribute.data(), backendAttribute); + simulateInitializationSync(positionAttribute.data(), backendAttribute); Geometry *backendGeometry = nodeManagers->geometryManager() ->getOrCreateResource(geometry->id()); backendGeometry->setRenderer(&renderer); - simulateInitialization(geometry, backendGeometry); + simulateInitializationSync(geometry, backendGeometry); GeometryRenderer *backendRenderer = nodeManagers->geometryRendererManager() ->getOrCreateResource(geometryRenderer->id()); backendRenderer->setRenderer(&renderer); backendRenderer->setManager(nodeManagers->geometryRendererManager()); - simulateInitialization(geometryRenderer.data(), backendRenderer); + simulateInitializationSync(geometryRenderer.data(), backendRenderer); // WHEN bool ret = reader.setGeometry(backendRenderer, @@ -232,7 +232,7 @@ private Q_SLOTS: Buffer *backendBuffer = nodeManagers->bufferManager()->getOrCreateResource(dataBuffer->id()); backendBuffer->setRenderer(&renderer); backendBuffer->setManager(nodeManagers->bufferManager()); - simulateInitialization(dataBuffer.data(), backendBuffer); + simulateInitializationSync(dataBuffer.data(), backendBuffer); positionAttribute->setBuffer(dataBuffer.data()); positionAttribute->setName(Qt3DRender::QAttribute::defaultPositionAttributeName()); @@ -250,18 +250,18 @@ private Q_SLOTS: Attribute *backendAttribute = nodeManagers->attributeManager() ->getOrCreateResource(positionAttribute->id()); backendAttribute->setRenderer(&renderer); - simulateInitialization(positionAttribute.data(), backendAttribute); + simulateInitializationSync(positionAttribute.data(), backendAttribute); Geometry *backendGeometry = nodeManagers->geometryManager() ->getOrCreateResource(geometry->id()); backendGeometry->setRenderer(&renderer); - simulateInitialization(geometry, backendGeometry); + simulateInitializationSync(geometry, backendGeometry); GeometryRenderer *backendRenderer = nodeManagers->geometryRendererManager() ->getOrCreateResource(geometryRenderer->id()); backendRenderer->setRenderer(&renderer); backendRenderer->setManager(nodeManagers->geometryRendererManager()); - simulateInitialization(geometryRenderer.data(), backendRenderer); + simulateInitializationSync(geometryRenderer.data(), backendRenderer); // WHEN bool ret = reader.setGeometry(backendRenderer, @@ -326,7 +326,7 @@ private Q_SLOTS: Buffer *backendBuffer = nodeManagers->bufferManager()->getOrCreateResource(dataBuffer->id()); backendBuffer->setRenderer(&renderer); backendBuffer->setManager(nodeManagers->bufferManager()); - simulateInitialization(dataBuffer.data(), backendBuffer); + simulateInitializationSync(dataBuffer.data(), backendBuffer); positionAttribute->setBuffer(dataBuffer.data()); positionAttribute->setName(Qt3DRender::QAttribute::defaultPositionAttributeName()); @@ -344,18 +344,18 @@ private Q_SLOTS: Attribute *backendAttribute = nodeManagers->attributeManager() ->getOrCreateResource(positionAttribute->id()); backendAttribute->setRenderer(&renderer); - simulateInitialization(positionAttribute.data(), backendAttribute); + simulateInitializationSync(positionAttribute.data(), backendAttribute); Geometry *backendGeometry = nodeManagers->geometryManager() ->getOrCreateResource(geometry->id()); backendGeometry->setRenderer(&renderer); - simulateInitialization(geometry, backendGeometry); + simulateInitializationSync(geometry, backendGeometry); GeometryRenderer *backendRenderer = nodeManagers->geometryRendererManager() ->getOrCreateResource(geometryRenderer->id()); backendRenderer->setRenderer(&renderer); backendRenderer->setManager(nodeManagers->geometryRendererManager()); - simulateInitialization(geometryRenderer.data(), backendRenderer); + simulateInitializationSync(geometryRenderer.data(), backendRenderer); // WHEN bool ret = reader.setGeometry(backendRenderer, @@ -415,7 +415,7 @@ private Q_SLOTS: Buffer *backendBuffer = nodeManagers->bufferManager()->getOrCreateResource(dataBuffer->id()); backendBuffer->setRenderer(&renderer); backendBuffer->setManager(nodeManagers->bufferManager()); - simulateInitialization(dataBuffer.data(), backendBuffer); + simulateInitializationSync(dataBuffer.data(), backendBuffer); positionAttribute->setBuffer(dataBuffer.data()); positionAttribute->setName(Qt3DRender::QAttribute::defaultPositionAttributeName()); @@ -443,23 +443,23 @@ private Q_SLOTS: Attribute *backendAttribute = nodeManagers->attributeManager()->getOrCreateResource( positionAttribute->id()); backendAttribute->setRenderer(&renderer); - simulateInitialization(positionAttribute.data(), backendAttribute); + simulateInitializationSync(positionAttribute.data(), backendAttribute); Attribute *backendTexcoordAttribute = nodeManagers->attributeManager() ->getOrCreateResource(texcoordAttribute->id()); backendTexcoordAttribute->setRenderer(&renderer); - simulateInitialization(texcoordAttribute.data(), backendTexcoordAttribute); + simulateInitializationSync(texcoordAttribute.data(), backendTexcoordAttribute); Geometry *backendGeometry = nodeManagers->geometryManager() ->getOrCreateResource(geometry->id()); backendGeometry->setRenderer(&renderer); - simulateInitialization(geometry, backendGeometry); + simulateInitializationSync(geometry, backendGeometry); GeometryRenderer *backendRenderer = nodeManagers->geometryRendererManager() ->getOrCreateResource(geometryRenderer->id()); backendRenderer->setRenderer(&renderer); backendRenderer->setManager(nodeManagers->geometryRendererManager()); - simulateInitialization(geometryRenderer.data(), backendRenderer); + simulateInitializationSync(geometryRenderer.data(), backendRenderer); // WHEN bool ret = reader.setGeometry(backendRenderer, diff --git a/tests/auto/render/effect/tst_effect.cpp b/tests/auto/render/effect/tst_effect.cpp index 30df242f4..cb2ca41e1 100644 --- a/tests/auto/render/effect/tst_effect.cpp +++ b/tests/auto/render/effect/tst_effect.cpp @@ -72,7 +72,7 @@ private Q_SLOTS: Qt3DRender::QParameter parameter; effect.addTechnique(&technique); effect.addParameter(¶meter); - simulateInitialization(&effect, &backendEffect); + simulateInitializationSync(&effect, &backendEffect); } backendEffect.cleanup(); @@ -95,7 +95,7 @@ private Q_SLOTS: { // WHEN Qt3DRender::Render::Effect backendEffect; - simulateInitialization(&effect, &backendEffect); + simulateInitializationSync(&effect, &backendEffect); // THEN QCOMPARE(backendEffect.isEnabled(), true); @@ -109,7 +109,7 @@ private Q_SLOTS: // WHEN Qt3DRender::Render::Effect backendEffect; effect.setEnabled(false); - simulateInitialization(&effect, &backendEffect); + simulateInitializationSync(&effect, &backendEffect); // THEN QCOMPARE(backendEffect.peerId(), effect.id()); @@ -120,17 +120,17 @@ private Q_SLOTS: void checkSceneChangeEvents() { // GIVEN + Qt3DRender::QEffect effect; Qt3DRender::Render::Effect backendEffect; TestRenderer renderer; backendEffect.setRenderer(&renderer); + simulateInitializationSync(&effect, &backendEffect); { // WHEN const bool newValue = false; - const auto change = Qt3DCore::QPropertyUpdatedChangePtr::create(Qt3DCore::QNodeId()); - change->setPropertyName("enabled"); - change->setValue(newValue); - backendEffect.sceneChangeEvent(change); + effect.setEnabled(newValue); + backendEffect.syncFromFrontEnd(&effect, false); // THEN QCOMPARE(backendEffect.isEnabled(), newValue); @@ -139,9 +139,8 @@ private Q_SLOTS: Qt3DRender::QTechnique technique; { // WHEN - const auto change = Qt3DCore::QPropertyNodeAddedChangePtr::create(Qt3DCore::QNodeId(), &technique); - change->setPropertyName("technique"); - backendEffect.sceneChangeEvent(change); + effect.addTechnique(&technique); + backendEffect.syncFromFrontEnd(&effect, false); // THEN QCOMPARE(backendEffect.techniques().size(), 1); @@ -149,9 +148,8 @@ private Q_SLOTS: } { // WHEN - const auto change = Qt3DCore::QPropertyNodeRemovedChangePtr::create(Qt3DCore::QNodeId(), &technique); - change->setPropertyName("technique"); - backendEffect.sceneChangeEvent(change); + effect.removeTechnique(&technique); + backendEffect.syncFromFrontEnd(&effect, false); // THEN QCOMPARE(backendEffect.techniques().size(), 0); @@ -162,9 +160,8 @@ private Q_SLOTS: { // WHEN - const auto change = Qt3DCore::QPropertyNodeAddedChangePtr::create(Qt3DCore::QNodeId(), ¶meter); - change->setPropertyName("parameter"); - backendEffect.sceneChangeEvent(change); + effect.addParameter(¶meter); + backendEffect.syncFromFrontEnd(&effect, false); // THEN QCOMPARE(backendEffect.parameters().size(), 1); @@ -172,9 +169,8 @@ private Q_SLOTS: } { // WHEN - const auto change = Qt3DCore::QPropertyNodeRemovedChangePtr::create(Qt3DCore::QNodeId(), ¶meter); - change->setPropertyName("parameter"); - backendEffect.sceneChangeEvent(change); + effect.removeParameter(¶meter); + backendEffect.syncFromFrontEnd(&effect, false); // THEN QCOMPARE(backendEffect.parameters().size(), 0); diff --git a/tests/auto/render/entity/tst_entity.cpp b/tests/auto/render/entity/tst_entity.cpp index 08d08404c..7e5150a77 100644 --- a/tests/auto/render/entity/tst_entity.cpp +++ b/tests/auto/render/entity/tst_entity.cpp @@ -237,13 +237,8 @@ private slots: QVERIFY(renderer.dirtyBits() == 0); auto sendParentChange = [&nodeManagers](const Qt3DCore::QEntity &entity) { - const auto parentChange = QPropertyUpdatedChangePtr::create(entity.id()); - parentChange->setPropertyName("parentEntityUpdated"); - auto parent = entity.parentEntity(); - parentChange->setValue(QVariant::fromValue(parent ? parent->id() : Qt3DCore::QNodeId())); - Entity *backendEntity = nodeManagers.renderNodesManager()->getOrCreateResource(entity.id()); - backendEntity->sceneChangeEvent(parentChange); + backendEntity->syncFromFrontEnd(&entity, false); }; // reparent B to A and C to B. @@ -452,6 +447,7 @@ private slots: entity->setNodeManagers(&nodeManagers); entity->setHandle(renderNodeHandle); entity->setRenderer(&renderer); + entity->syncFromFrontEnd(&frontEndEntity, true); return entity; }; @@ -460,13 +456,8 @@ private slots: auto backendC = entityCreator(frontendEntityC); auto sendParentChange = [&nodeManagers](const Qt3DCore::QEntity &entity) { - const auto parentChange = QPropertyUpdatedChangePtr::create(entity.id()); - parentChange->setPropertyName("parentEntityUpdated"); - auto parent = entity.parentEntity(); - parentChange->setValue(QVariant::fromValue(parent ? parent->id() : Qt3DCore::QNodeId())); - Entity *backendEntity = nodeManagers.renderNodesManager()->getOrCreateResource(entity.id()); - backendEntity->sceneChangeEvent(parentChange); + backendEntity->syncFromFrontEnd(&entity, false); }; // reparent B to A and C to B. @@ -499,12 +490,17 @@ private slots: NodeManagers nodeManagers; Qt3DCore::QEntity frontendEntityA, frontendEntityB, frontendEntityC; + frontendEntityA.setEnabled(false); + frontendEntityB.setEnabled(false); + frontendEntityC.setEnabled(false); + auto entityCreator = [&nodeManagers, &renderer](const Qt3DCore::QEntity &frontEndEntity) { HEntity renderNodeHandle = nodeManagers.renderNodesManager()->getOrAcquireHandle(frontEndEntity.id()); Entity *entity = nodeManagers.renderNodesManager()->data(renderNodeHandle); entity->setNodeManagers(&nodeManagers); entity->setHandle(renderNodeHandle); entity->setRenderer(&renderer); + entity->syncFromFrontEnd(&frontEndEntity, true); return entity; }; @@ -513,13 +509,8 @@ private slots: auto backendC = entityCreator(frontendEntityC); auto sendParentChange = [&nodeManagers](const Qt3DCore::QEntity &entity) { - const auto parentChange = QPropertyUpdatedChangePtr::create(entity.id()); - parentChange->setPropertyName("parentEntityUpdated"); - auto parent = entity.parentEntity(); - parentChange->setValue(QVariant::fromValue(parent ? parent->id() : Qt3DCore::QNodeId())); - Entity *backendEntity = nodeManagers.renderNodesManager()->getOrCreateResource(entity.id()); - backendEntity->sceneChangeEvent(parentChange); + backendEntity->syncFromFrontEnd(&entity, false); }; // reparent B to A and C to B. @@ -547,8 +538,8 @@ private slots: // THEN QCOMPARE(v1.count, 3); - QCOMPARE(v2.count, 1); // nodes disabled by default but the first one is still visited before visitation finds out it's disabled - QCOMPARE(v3.count, 0); // nodes disabled by default + QCOMPARE(v2.count, 1); // nodes disabled but the first one is still visited before visitation finds out it's disabled + QCOMPARE(v3.count, 0); // nodes disabled } void accumulator() @@ -558,12 +549,17 @@ private slots: NodeManagers nodeManagers; Qt3DCore::QEntity frontendEntityA, frontendEntityB, frontendEntityC; + frontendEntityA.setEnabled(false); + frontendEntityB.setEnabled(false); + frontendEntityC.setEnabled(false); + auto entityCreator = [&nodeManagers, &renderer](const Qt3DCore::QEntity &frontEndEntity) { HEntity renderNodeHandle = nodeManagers.renderNodesManager()->getOrAcquireHandle(frontEndEntity.id()); Entity *entity = nodeManagers.renderNodesManager()->data(renderNodeHandle); entity->setNodeManagers(&nodeManagers); entity->setHandle(renderNodeHandle); entity->setRenderer(&renderer); + entity->syncFromFrontEnd(&frontEndEntity, true); return entity; }; @@ -572,13 +568,8 @@ private slots: auto backendC = entityCreator(frontendEntityC); auto sendParentChange = [&nodeManagers](const Qt3DCore::QEntity &entity) { - const auto parentChange = QPropertyUpdatedChangePtr::create(entity.id()); - parentChange->setPropertyName("parentEntityUpdated"); - auto parent = entity.parentEntity(); - parentChange->setValue(QVariant::fromValue(parent ? parent->id() : Qt3DCore::QNodeId())); - Entity *backendEntity = nodeManagers.renderNodesManager()->getOrCreateResource(entity.id()); - backendEntity->sceneChangeEvent(parentChange); + backendEntity->syncFromFrontEnd(&entity, false); }; // reparent B to A and C to B. diff --git a/tests/auto/render/geometry/tst_geometry.cpp b/tests/auto/render/geometry/tst_geometry.cpp index 7e65d27aa..54a28e776 100644 --- a/tests/auto/render/geometry/tst_geometry.cpp +++ b/tests/auto/render/geometry/tst_geometry.cpp @@ -50,6 +50,7 @@ public: class tst_RenderGeometry : public Qt3DCore::QBackendNodeTester { Q_OBJECT + private Q_SLOTS: void checkPeerPropertyMirroring() @@ -72,7 +73,7 @@ private Q_SLOTS: renderGeometry.setRenderer(&renderer); // WHEN - simulateInitialization(&geometry, &renderGeometry); + simulateInitializationSync(&geometry, &renderGeometry); // THEN QCOMPARE(renderGeometry.peerId(), geometry.id()); @@ -80,8 +81,9 @@ private Q_SLOTS: QCOMPARE(renderGeometry.attributes().count(), 4); QCOMPARE(renderGeometry.boundingPositionAttribute(), attr1.id()); - for (int i = 0; i < 4; ++i) - QCOMPARE(geometry.attributes().at(i)->id(), renderGeometry.attributes().at(i)); + Qt3DCore::QNodeIdVector attribs = Qt3DCore::qIdsForNodes(geometry.attributes()); + std::sort(std::begin(attribs), std::end(attribs)); + QCOMPARE(attribs, renderGeometry.attributes()); } void checkSetRendererDirtyOnInitialization() @@ -97,7 +99,7 @@ private Q_SLOTS: QCOMPARE(renderer.dirtyBits(), 0); // WHEN - simulateInitialization(&geometry, &renderGeometry); + simulateInitializationSync(&geometry, &renderGeometry); // THEN QCOMPARE(renderer.dirtyBits(), Qt3DRender::Render::AbstractRenderer::GeometryDirty); @@ -130,7 +132,7 @@ private Q_SLOTS: geometry.addAttribute(&attr4); // WHEN - simulateInitialization(&geometry, &renderGeometry); + simulateInitializationSync(&geometry, &renderGeometry); renderGeometry.cleanup(); // THEN @@ -145,13 +147,15 @@ private Q_SLOTS: TestRenderer renderer; Qt3DRender::Render::Geometry renderGeometry; renderGeometry.setRenderer(&renderer); + Qt3DRender::QGeometry geometry; + + simulateInitializationSync(&geometry, &renderGeometry); DummyAttribute attribute; // WHEN - const auto nodeAddedChange = Qt3DCore::QPropertyNodeAddedChangePtr::create(Qt3DCore::QNodeId(), &attribute); - nodeAddedChange->setPropertyName("attribute"); - renderGeometry.sceneChangeEvent(nodeAddedChange); + geometry.addAttribute(&attribute); + renderGeometry.syncFromFrontEnd(&geometry, false); // THEN QCOMPARE(renderGeometry.attributes().count(), 1); @@ -163,9 +167,8 @@ private Q_SLOTS: QVERIFY(!renderGeometry.isDirty()); // WHEN - const auto nodeRemovedChange = Qt3DCore::QPropertyNodeRemovedChangePtr::create(Qt3DCore::QNodeId(), &attribute); - nodeRemovedChange->setPropertyName("attribute"); - renderGeometry.sceneChangeEvent(nodeRemovedChange); + geometry.removeAttribute(&attribute); + renderGeometry.syncFromFrontEnd(&geometry, false); // THEN QCOMPARE(renderGeometry.attributes().count(), 0); @@ -177,14 +180,11 @@ private Q_SLOTS: QVERIFY(!renderGeometry.isDirty()); // WHEN - const Qt3DCore::QNodeId boundingAttrId = Qt3DCore::QNodeId::createId(); - Qt3DCore::QPropertyUpdatedChangePtr updateChange(new Qt3DCore::QPropertyUpdatedChange(Qt3DCore::QNodeId())); - updateChange->setValue(QVariant::fromValue(boundingAttrId)); - updateChange->setPropertyName("boundingVolumePositionAttribute"); - renderGeometry.sceneChangeEvent(updateChange); + geometry.setBoundingVolumePositionAttribute(&attribute); + renderGeometry.syncFromFrontEnd(&geometry, false); // THEN - QCOMPARE(renderGeometry.boundingPositionAttribute(), boundingAttrId); + QCOMPARE(renderGeometry.boundingPositionAttribute(), attribute.id()); QVERIFY(!renderGeometry.isDirty()); QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::GeometryDirty); renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty); diff --git a/tests/auto/render/geometryrenderer/tst_geometryrenderer.cpp b/tests/auto/render/geometryrenderer/tst_geometryrenderer.cpp index d07ec9914..db997a5e5 100644 --- a/tests/auto/render/geometryrenderer/tst_geometryrenderer.cpp +++ b/tests/auto/render/geometryrenderer/tst_geometryrenderer.cpp @@ -75,6 +75,7 @@ public: class tst_RenderGeometryRenderer : public Qt3DCore::QBackendNodeTester { Q_OBJECT + private Q_SLOTS: void checkPeerPropertyMirroring() @@ -102,7 +103,7 @@ private Q_SLOTS: // WHEN renderGeometryRenderer.setRenderer(&renderer); renderGeometryRenderer.setManager(&geometryRendererManager); - simulateInitialization(&geometryRenderer, &renderGeometryRenderer); + simulateInitializationSync(&geometryRenderer, &renderGeometryRenderer); // THEN QCOMPARE(renderGeometryRenderer.peerId(), geometryRenderer.id()); @@ -163,7 +164,7 @@ private Q_SLOTS: // WHEN renderGeometryRenderer.setRenderer(&renderer); renderGeometryRenderer.setManager(&geometryRendererManager); - simulateInitialization(&geometryRenderer, &renderGeometryRenderer); + simulateInitializationSync(&geometryRenderer, &renderGeometryRenderer); renderGeometryRenderer.cleanup(); // THEN @@ -184,210 +185,185 @@ private Q_SLOTS: void checkPropertyChanges() { // GIVEN - Qt3DRender::Render::GeometryRenderer renderGeometryRenderer; + Qt3DRender::QGeometryRenderer frontEndRenderer; + Qt3DRender::Render::GeometryRenderer backEndRenderer; TestRenderer renderer; - renderGeometryRenderer.setRenderer(&renderer); + backEndRenderer.setRenderer(&renderer); - QVERIFY(!renderGeometryRenderer.isDirty()); + QVERIFY(!backEndRenderer.isDirty()); // WHEN - Qt3DCore::QPropertyUpdatedChangePtr updateChange(new Qt3DCore::QPropertyUpdatedChange(Qt3DCore::QNodeId())); - updateChange->setPropertyName("instanceCount"); - updateChange->setValue(2); - renderGeometryRenderer.sceneChangeEvent(updateChange); + frontEndRenderer.setInstanceCount(2); + backEndRenderer.syncFromFrontEnd(&frontEndRenderer, false); // THEN - QCOMPARE(renderGeometryRenderer.instanceCount(), 2); - QVERIFY(renderGeometryRenderer.isDirty()); + QCOMPARE(backEndRenderer.instanceCount(), 2); + QVERIFY(backEndRenderer.isDirty()); QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::GeometryDirty); renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty); - renderGeometryRenderer.unsetDirty(); - QVERIFY(!renderGeometryRenderer.isDirty()); + backEndRenderer.unsetDirty(); + QVERIFY(!backEndRenderer.isDirty()); // WHEN - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - updateChange->setPropertyName("vertexCount"); - updateChange->setValue(56); - renderGeometryRenderer.sceneChangeEvent(updateChange); + frontEndRenderer.setVertexCount(56); + backEndRenderer.syncFromFrontEnd(&frontEndRenderer, false); // THEN - QCOMPARE(renderGeometryRenderer.vertexCount(), 56); - QVERIFY(renderGeometryRenderer.isDirty()); + QCOMPARE(backEndRenderer.vertexCount(), 56); + QVERIFY(backEndRenderer.isDirty()); QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::GeometryDirty); renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty); - renderGeometryRenderer.unsetDirty(); - QVERIFY(!renderGeometryRenderer.isDirty()); + backEndRenderer.unsetDirty(); + QVERIFY(!backEndRenderer.isDirty()); // WHEN - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - updateChange->setPropertyName("indexOffset"); - updateChange->setValue(65); - renderGeometryRenderer.sceneChangeEvent(updateChange); + frontEndRenderer.setIndexOffset(65); + backEndRenderer.syncFromFrontEnd(&frontEndRenderer, false); // THEN - QCOMPARE(renderGeometryRenderer.indexOffset(), 65); - QVERIFY(renderGeometryRenderer.isDirty()); + QCOMPARE(backEndRenderer.indexOffset(), 65); + QVERIFY(backEndRenderer.isDirty()); QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::GeometryDirty); renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty); - renderGeometryRenderer.unsetDirty(); - QVERIFY(!renderGeometryRenderer.isDirty()); + backEndRenderer.unsetDirty(); + QVERIFY(!backEndRenderer.isDirty()); // WHEN - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - updateChange->setPropertyName("firstInstance"); - updateChange->setValue(82); - renderGeometryRenderer.sceneChangeEvent(updateChange); + frontEndRenderer.setFirstInstance(82); + backEndRenderer.syncFromFrontEnd(&frontEndRenderer, false); // THEN - QCOMPARE(renderGeometryRenderer.firstInstance(), 82); - QVERIFY(renderGeometryRenderer.isDirty()); + QCOMPARE(backEndRenderer.firstInstance(), 82); + QVERIFY(backEndRenderer.isDirty()); QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::GeometryDirty); renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty); - renderGeometryRenderer.unsetDirty(); - QVERIFY(!renderGeometryRenderer.isDirty()); + backEndRenderer.unsetDirty(); + QVERIFY(!backEndRenderer.isDirty()); // WHEN - updateChange.reset(new Qt3DCore::QPropertyUpdatedChange(Qt3DCore::QNodeId())); - updateChange->setPropertyName("indexBufferByteOffset"); - updateChange->setValue(96); - renderGeometryRenderer.sceneChangeEvent(updateChange); + frontEndRenderer.setIndexBufferByteOffset(96); + backEndRenderer.syncFromFrontEnd(&frontEndRenderer, false); // THEN - QCOMPARE(renderGeometryRenderer.indexBufferByteOffset(), 96); - QVERIFY(renderGeometryRenderer.isDirty()); + QCOMPARE(backEndRenderer.indexBufferByteOffset(), 96); + QVERIFY(backEndRenderer.isDirty()); QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::GeometryDirty); renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty); - renderGeometryRenderer.unsetDirty(); - QVERIFY(!renderGeometryRenderer.isDirty()); + backEndRenderer.unsetDirty(); + QVERIFY(!backEndRenderer.isDirty()); // WHEN - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - updateChange->setPropertyName("restartIndexValue"); - updateChange->setValue(46); - renderGeometryRenderer.sceneChangeEvent(updateChange); + frontEndRenderer.setRestartIndexValue(46); + backEndRenderer.syncFromFrontEnd(&frontEndRenderer, false); // THEN - QCOMPARE(renderGeometryRenderer.restartIndexValue(), 46); - QVERIFY(renderGeometryRenderer.isDirty()); + QCOMPARE(backEndRenderer.restartIndexValue(), 46); + QVERIFY(backEndRenderer.isDirty()); QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::GeometryDirty); renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty); - renderGeometryRenderer.unsetDirty(); - QVERIFY(!renderGeometryRenderer.isDirty()); + backEndRenderer.unsetDirty(); + QVERIFY(!backEndRenderer.isDirty()); // WHEN - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - updateChange->setPropertyName("primitiveRestartEnabled"); - updateChange->setValue(true); - renderGeometryRenderer.sceneChangeEvent(updateChange); + frontEndRenderer.setPrimitiveRestartEnabled(true); + backEndRenderer.syncFromFrontEnd(&frontEndRenderer, false); // THEN - QCOMPARE(renderGeometryRenderer.primitiveRestartEnabled(), true); - QVERIFY(renderGeometryRenderer.isDirty()); + QCOMPARE(backEndRenderer.primitiveRestartEnabled(), true); + QVERIFY(backEndRenderer.isDirty()); QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::GeometryDirty); renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty); - renderGeometryRenderer.unsetDirty(); - QVERIFY(!renderGeometryRenderer.isDirty()); + backEndRenderer.unsetDirty(); + QVERIFY(!backEndRenderer.isDirty()); // WHEN - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - updateChange->setPropertyName("primitiveType"); - updateChange->setValue(static_cast<int>(Qt3DRender::QGeometryRenderer::LineLoop)); - renderGeometryRenderer.sceneChangeEvent(updateChange); + frontEndRenderer.setPrimitiveType(Qt3DRender::QGeometryRenderer::LineLoop); + backEndRenderer.syncFromFrontEnd(&frontEndRenderer, false); // THEN - QCOMPARE(renderGeometryRenderer.primitiveType(), Qt3DRender::QGeometryRenderer::LineLoop); - QVERIFY(renderGeometryRenderer.isDirty()); + QCOMPARE(backEndRenderer.primitiveType(), Qt3DRender::QGeometryRenderer::LineLoop); + QVERIFY(backEndRenderer.isDirty()); QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::GeometryDirty); renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty); - renderGeometryRenderer.unsetDirty(); - QVERIFY(!renderGeometryRenderer.isDirty()); + backEndRenderer.unsetDirty(); + QVERIFY(!backEndRenderer.isDirty()); // WHEN - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - updateChange->setPropertyName("geometryFactory"); Qt3DRender::QGeometryFactoryPtr factory(new TestFactory(1450)); - updateChange->setValue(QVariant::fromValue(factory)); - renderGeometryRenderer.sceneChangeEvent(updateChange); + frontEndRenderer.setGeometryFactory(factory); + backEndRenderer.syncFromFrontEnd(&frontEndRenderer, false); // THEN - QCOMPARE(renderGeometryRenderer.geometryFactory(), factory); - QVERIFY(renderGeometryRenderer.isDirty()); + QCOMPARE(backEndRenderer.geometryFactory(), factory); + QVERIFY(backEndRenderer.isDirty()); QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::GeometryDirty); renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty); - renderGeometryRenderer.unsetDirty(); - QVERIFY(!renderGeometryRenderer.isDirty()); + backEndRenderer.unsetDirty(); + QVERIFY(!backEndRenderer.isDirty()); // WHEN we set an identical factory again - updateChange.reset(new Qt3DCore::QPropertyUpdatedChange(Qt3DCore::QNodeId())); - updateChange->setPropertyName("geometryFactory"); Qt3DRender::QGeometryFactoryPtr factory2(new TestFactory(1450)); - updateChange->setValue(QVariant::fromValue(factory2)); - renderGeometryRenderer.sceneChangeEvent(updateChange); + frontEndRenderer.setGeometryFactory(factory2); + backEndRenderer.syncFromFrontEnd(&frontEndRenderer, false); // THEN not dirty and still uses original factory - QCOMPARE(renderGeometryRenderer.geometryFactory(), factory); - QVERIFY(!renderGeometryRenderer.isDirty()); + QCOMPARE(backEndRenderer.geometryFactory(), factory); + QVERIFY(!backEndRenderer.isDirty()); // WHEN DummyGeometry geometry; const Qt3DCore::QNodeId geometryId = geometry.id(); - const auto nodeAddedChange = Qt3DCore::QPropertyUpdatedChangePtr::create(Qt3DCore::QNodeId()); - nodeAddedChange->setPropertyName("geometry"); - nodeAddedChange->setValue(QVariant::fromValue(geometryId)); - renderGeometryRenderer.sceneChangeEvent(nodeAddedChange); + frontEndRenderer.setGeometry(&geometry); + backEndRenderer.syncFromFrontEnd(&frontEndRenderer, false); // THEN - QCOMPARE(renderGeometryRenderer.geometryId(), geometryId); - QVERIFY(renderGeometryRenderer.isDirty()); + QCOMPARE(backEndRenderer.geometryId(), geometryId); + QVERIFY(backEndRenderer.isDirty()); QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::GeometryDirty); renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty); - renderGeometryRenderer.unsetDirty(); - QVERIFY(!renderGeometryRenderer.isDirty()); + backEndRenderer.unsetDirty(); + QVERIFY(!backEndRenderer.isDirty()); // WHEN - const auto nodeRemovedChange = Qt3DCore::QPropertyUpdatedChangePtr::create(Qt3DCore::QNodeId()); - nodeRemovedChange->setPropertyName("geometry"); - nodeRemovedChange->setValue(QVariant::fromValue(Qt3DCore::QNodeId())); - renderGeometryRenderer.sceneChangeEvent(nodeRemovedChange); + frontEndRenderer.setGeometry(nullptr); + backEndRenderer.syncFromFrontEnd(&frontEndRenderer, false); // THEN - QCOMPARE(renderGeometryRenderer.geometryId(), Qt3DCore::QNodeId()); - QVERIFY(renderGeometryRenderer.isDirty()); + QCOMPARE(backEndRenderer.geometryId(), Qt3DCore::QNodeId()); + QVERIFY(backEndRenderer.isDirty()); QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::GeometryDirty); renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty); - renderGeometryRenderer.unsetDirty(); - QVERIFY(!renderGeometryRenderer.isDirty()); + backEndRenderer.unsetDirty(); + QVERIFY(!backEndRenderer.isDirty()); // WHEN - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - updateChange->setValue(QVariant::fromValue(true)); - updateChange->setPropertyName("enabled"); - renderGeometryRenderer.sceneChangeEvent(updateChange); + frontEndRenderer.setEnabled(true); + backEndRenderer.syncFromFrontEnd(&frontEndRenderer, false); // THEN - QCOMPARE(renderGeometryRenderer.isEnabled(), true); - QVERIFY(!renderGeometryRenderer.isDirty()); + QCOMPARE(backEndRenderer.isEnabled(), true); + QVERIFY(!backEndRenderer.isDirty()); } void checkSetRendererDirtyOnInitialization() @@ -405,7 +381,7 @@ private Q_SLOTS: QCOMPARE(renderer.dirtyBits(), 0); // WHEN - simulateInitialization(&geometryRenderer, &renderGeometryRenderer); + simulateInitializationSync(&geometryRenderer, &renderGeometryRenderer); // THEN QCOMPARE(renderer.dirtyBits(), Qt3DRender::Render::AbstractRenderer::GeometryDirty); diff --git a/tests/auto/render/joint/tst_joint.cpp b/tests/auto/render/joint/tst_joint.cpp index 13aa915d2..c08d36725 100644 --- a/tests/auto/render/joint/tst_joint.cpp +++ b/tests/auto/render/joint/tst_joint.cpp @@ -60,6 +60,7 @@ private Q_SLOTS: Joint backendJoint; backendJoint.setRenderer(&renderer); backendJoint.setJointManager(nodeManagers.jointManager()); + backendJoint.setSkeletonManager(nodeManagers.skeletonManager()); QJoint joint; joint.setTranslation(QVector3D(1.0f, 2.0f, 3.0f)); @@ -77,7 +78,7 @@ private Q_SLOTS: } // WHEN - simulateInitialization(&joint, &backendJoint); + simulateInitializationSync(&joint, &backendJoint); // THEN QCOMPARE(backendJoint.peerId(), joint.id()); @@ -100,6 +101,7 @@ private Q_SLOTS: Joint backendJoint; backendJoint.setRenderer(&renderer); backendJoint.setJointManager(nodeManagers.jointManager()); + backendJoint.setSkeletonManager(nodeManagers.skeletonManager()); // THEN QVERIFY(backendJoint.peerId().isNull()); @@ -128,7 +130,7 @@ private Q_SLOTS: } // WHEN - simulateInitialization(&joint, &backendJoint); + simulateInitializationSync(&joint, &backendJoint); backendJoint.cleanup(); // THEN @@ -235,6 +237,88 @@ private Q_SLOTS: } } } + + void checkDirectPropertyChanges() + { + // GIVEN + TestRenderer renderer; + NodeManagers nodeManagers; + renderer.setNodeManagers(&nodeManagers); + Joint backendJoint; + backendJoint.setRenderer(&renderer); + backendJoint.setJointManager(nodeManagers.jointManager()); + backendJoint.setSkeletonManager(nodeManagers.skeletonManager()); + + QJoint joint; + simulateInitializationSync(&joint, &backendJoint); + + // WHEN + joint.setEnabled(false); + backendJoint.syncFromFrontEnd(&joint, false); + + // THEN + QCOMPARE(backendJoint.isEnabled(), false); + + // WHEN + const QVector3D newTranslation = QVector3D(1.0f, 2.0f, 3.0f); + joint.setTranslation(newTranslation); + backendJoint.syncFromFrontEnd(&joint, false); + + // THEN + QCOMPARE(backendJoint.translation(), newTranslation); + + // WHEN + const QQuaternion newRotation = QQuaternion::fromAxisAndAngle(1.0f, 0.0f, 0.0f, 45.0f); + joint.setRotation(newRotation); + backendJoint.syncFromFrontEnd(&joint, false); + + // THEN + QCOMPARE(backendJoint.rotation(), newRotation); + + // WHEN + const QVector3D newScale = QVector3D(1.5f, 2.5f, 3.5f); + joint.setScale(newScale); + backendJoint.syncFromFrontEnd(&joint, false); + + // THEN + QCOMPARE(backendJoint.scale(), newScale); + + // WHEN + QMatrix4x4 newInverseBind; + newInverseBind.scale(5.4f); + joint.setInverseBindMatrix(newInverseBind); + backendJoint.syncFromFrontEnd(&joint, false); + + // THEN + QCOMPARE(backendJoint.inverseBindMatrix(), newInverseBind); + + // WHEN + QVector<QJoint *> childJoints; + for (int i = 0; i < 10; ++i) { + const auto childJoint = new QJoint(); + joint.addChildJoint(childJoint); + childJoints.push_back(childJoint); + } + backendJoint.syncFromFrontEnd(&joint, false); + + // THEN + for (int i = 0; i < childJoints.size(); ++i) { + QCOMPARE(backendJoint.childJointIds()[i], childJoints[i]->id()); + } + + for (int i = 0; i < 10; ++i) { + // WHEN + const auto childJoint = childJoints.takeLast(); + + joint.removeChildJoint(childJoint); + backendJoint.syncFromFrontEnd(&joint, false); + + // THEN + for (int i = 0; i < childJoints.size(); ++i) { + QCOMPARE(backendJoint.childJointIds()[i], childJoints[i]->id()); + } + } + } }; QTEST_APPLESS_MAIN(tst_Joint) diff --git a/tests/auto/render/material/tst_material.cpp b/tests/auto/render/material/tst_material.cpp index 9dfa0c246..e47eaea34 100644 --- a/tests/auto/render/material/tst_material.cpp +++ b/tests/auto/render/material/tst_material.cpp @@ -45,6 +45,7 @@ using namespace Qt3DRender::Render; class tst_RenderMaterial : public Qt3DCore::QBackendNodeTester { Q_OBJECT + public: tst_RenderMaterial() {} @@ -117,7 +118,7 @@ void tst_RenderMaterial::shouldHavePropertiesMirroringFromItsPeer() // GIVEN backend.setRenderer(&renderer); - simulateInitialization(frontendMaterial, &backend); + simulateInitializationSync(frontendMaterial, &backend); // THEN QVERIFY(backend.isEnabled() == frontendMaterial->isEnabled()); @@ -136,15 +137,17 @@ void tst_RenderMaterial::shouldHavePropertiesMirroringFromItsPeer() void tst_RenderMaterial::shouldHandleParametersPropertyChange() { // GIVEN - QScopedPointer<QParameter> parameter(new QParameter()); + QParameter *parameter = new QParameter(); Material backend; TestRenderer renderer; backend.setRenderer(&renderer); + QMaterial material; + simulateInitializationSync(&material, &backend); + // WHEN - const auto addChange = Qt3DCore::QPropertyNodeAddedChangePtr::create(Qt3DCore::QNodeId(), parameter.data()); - addChange->setPropertyName("parameter"); - backend.sceneChangeEvent(addChange); + material.addParameter(parameter); + backend.syncFromFrontEnd(&material, false); // THEN QCOMPARE(backend.parameters().count(), 1); @@ -152,9 +155,8 @@ void tst_RenderMaterial::shouldHandleParametersPropertyChange() QVERIFY(renderer.dirtyBits() != 0); // WHEN - const auto removeChange = Qt3DCore::QPropertyNodeRemovedChangePtr::create(Qt3DCore::QNodeId(), parameter.data()); - removeChange->setPropertyName("parameter"); - backend.sceneChangeEvent(removeChange); + material.removeParameter(parameter); + backend.syncFromFrontEnd(&material, false); // THEN QVERIFY(backend.parameters().isEmpty()); @@ -167,24 +169,23 @@ void tst_RenderMaterial::shouldHandleEnablePropertyChange() TestRenderer renderer; backend.setRenderer(&renderer); + QMaterial material; + simulateInitializationSync(&material, &backend); + // WHEN - auto updateChange = QPropertyUpdatedChangePtr::create(QNodeId()); - updateChange->setValue(true); - updateChange->setPropertyName("enabled"); - backend.sceneChangeEvent(updateChange); + material.setEnabled(false); + backend.syncFromFrontEnd(&material, false); // THEN - QVERIFY(backend.isEnabled()); + QVERIFY(!backend.isEnabled()); QVERIFY(renderer.dirtyBits() != 0); // WHEN - auto secondUpdateChange = QPropertyUpdatedChangePtr::create(QNodeId()); - secondUpdateChange->setValue(false); - secondUpdateChange->setPropertyName("enabled"); - backend.sceneChangeEvent(secondUpdateChange); + material.setEnabled(true); + backend.syncFromFrontEnd(&material, false); // THEN - QVERIFY(!backend.isEnabled()); + QVERIFY(backend.isEnabled()); } @@ -195,15 +196,16 @@ void tst_RenderMaterial::shouldHandleEffectPropertyChange() TestRenderer renderer; backend.setRenderer(&renderer); + QMaterial material; + simulateInitializationSync(&material, &backend); + // WHEN - QPropertyUpdatedChangePtr updateChange(new Qt3DCore::QPropertyUpdatedChange(Qt3DCore::QNodeId())); - Qt3DCore::QNodeId effectId = Qt3DCore::QNodeId::createId(); - updateChange->setValue(QVariant::fromValue(effectId)); - updateChange->setPropertyName("effect"); - backend.sceneChangeEvent(updateChange); + QEffect effect; + material.setEffect(&effect); + backend.syncFromFrontEnd(&material, false); // THEN - QCOMPARE(backend.effect(), effectId); + QCOMPARE(backend.effect(), effect.id()); QVERIFY(renderer.dirtyBits() != 0); } diff --git a/tests/auto/render/parameter/tst_parameter.cpp b/tests/auto/render/parameter/tst_parameter.cpp index 3b83c1c82..44e7b7020 100644 --- a/tests/auto/render/parameter/tst_parameter.cpp +++ b/tests/auto/render/parameter/tst_parameter.cpp @@ -66,7 +66,7 @@ private Q_SLOTS: // WHEN backendParameter.setRenderer(&renderer); - simulateInitialization(¶meter, &backendParameter); + simulateInitializationSync(¶meter, &backendParameter); backendParameter.cleanup(); // THEN @@ -89,7 +89,7 @@ private Q_SLOTS: // WHEN Qt3DRender::Render::Parameter backendParameter; backendParameter.setRenderer(&renderer); - simulateInitialization(¶meter, &backendParameter); + simulateInitializationSync(¶meter, &backendParameter); // THEN QCOMPARE(backendParameter.isEnabled(), true); @@ -105,7 +105,7 @@ private Q_SLOTS: Qt3DRender::Render::Parameter backendParameter; backendParameter.setRenderer(&renderer); parameter.setEnabled(false); - simulateInitialization(¶meter, &backendParameter); + simulateInitializationSync(¶meter, &backendParameter); // THEN QCOMPARE(backendParameter.peerId(), parameter.id()); @@ -121,13 +121,14 @@ private Q_SLOTS: TestRenderer renderer; backendParameter.setRenderer(&renderer); + Qt3DRender::QParameter parameter; + simulateInitializationSync(¶meter, &backendParameter); + { // WHEN const bool newValue = false; - const auto change = Qt3DCore::QPropertyUpdatedChangePtr::create(Qt3DCore::QNodeId()); - change->setPropertyName("enabled"); - change->setValue(newValue); - backendParameter.sceneChangeEvent(change); + parameter.setEnabled(newValue); + backendParameter.syncFromFrontEnd(¶meter, false); // THEN QCOMPARE(backendParameter.isEnabled(), newValue); @@ -137,10 +138,8 @@ private Q_SLOTS: { // WHEN const QString newValue = QStringLiteral("C7"); - const auto change = Qt3DCore::QPropertyUpdatedChangePtr::create(Qt3DCore::QNodeId()); - change->setPropertyName("name"); - change->setValue(QVariant::fromValue(newValue)); - backendParameter.sceneChangeEvent(change); + parameter.setName(newValue); + backendParameter.syncFromFrontEnd(¶meter, false); // THEN QCOMPARE(backendParameter.name(), newValue); @@ -152,10 +151,8 @@ private Q_SLOTS: // WHEN const QVariant value = QVariant::fromValue(QVector3D(350.0f, 427.0f, 454.0f)); const Qt3DRender::Render::UniformValue newValue = Qt3DRender::Render::UniformValue::fromVariant(value); - const auto change = Qt3DCore::QPropertyUpdatedChangePtr::create(Qt3DCore::QNodeId()); - change->setPropertyName("value"); - change->setValue(value); - backendParameter.sceneChangeEvent(change); + parameter.setValue(value); + backendParameter.syncFromFrontEnd(¶meter, false); // THEN QCOMPARE(backendParameter.uniformValue(), newValue); diff --git a/tests/auto/render/qabstracttexture/tst_qabstracttexture.cpp b/tests/auto/render/qabstracttexture/tst_qabstracttexture.cpp index 04364e2d9..6db8d20f5 100644 --- a/tests/auto/render/qabstracttexture/tst_qabstracttexture.cpp +++ b/tests/auto/render/qabstracttexture/tst_qabstracttexture.cpp @@ -37,6 +37,7 @@ #include <Qt3DCore/qpropertynodeaddedchange.h> #include <Qt3DCore/qpropertynoderemovedchange.h> #include <Qt3DCore/private/qnodecreatedchangegenerator_p.h> +#include <Qt3DCore/private/qnodevisitor_p.h> #include <Qt3DCore/qnodecreatedchange.h> #include "testpostmanarbiter.h" @@ -1099,28 +1100,6 @@ private Q_SLOTS: { { // GIVEN - FakeTexture abstractTexture; - Qt3DRender::QTextureDataUpdate update; - - // WHEN - abstractTexture.updateData(update); - - // THEN (no arbiter -> should be stored in the initial changes) - Qt3DCore::QNodeCreatedChangeGenerator creationChangeGenerator(&abstractTexture); - const QVector<Qt3DCore::QNodeCreatedChangeBasePtr> creationChanges = creationChangeGenerator.creationChanges(); - - QCOMPARE(creationChanges.size(), 1); - const auto typedChange = qSharedPointerCast<Qt3DCore::QNodeCreatedChange<Qt3DRender::QAbstractTextureData>>(creationChanges.first()); - - QVERIFY(typedChange); - const Qt3DRender::QAbstractTextureData data = typedChange->data; - - QCOMPARE(data.initialDataUpdates.size(), 1); - QVERIFY(data.initialDataUpdates.contains(update)); - } - - { - // GIVEN TestArbiter arbiter; FakeTexture abstractTexture; Qt3DRender::QTextureDataUpdate update; @@ -1131,23 +1110,10 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN (arbiter -> should not be stored in the initial changes but only send as a property change) - Qt3DCore::QNodeCreatedChangeGenerator creationChangeGenerator(&abstractTexture); - const QVector<Qt3DCore::QNodeCreatedChangeBasePtr> creationChanges = creationChangeGenerator.creationChanges(); - - QCOMPARE(creationChanges.size(), 1); - const auto typedChange = qSharedPointerCast<Qt3DCore::QNodeCreatedChange<Qt3DRender::QAbstractTextureData>>(creationChanges.first()); - - QVERIFY(typedChange); - const Qt3DRender::QAbstractTextureData data = typedChange->data; - - QCOMPARE(data.initialDataUpdates.size(), 0); - - // THEN - QCOMPARE(arbiter.events.size(), 1); - auto change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>(); - QCOMPARE(change->propertyName(), "updateData"); - QCOMPARE(change->value().value<Qt3DRender::QTextureDataUpdate>(), update); - QCOMPARE(change->type(), Qt3DCore::PropertyUpdated); + auto d = static_cast<Qt3DRender::QAbstractTexturePrivate*>(Qt3DRender::QAbstractTexturePrivate::get(&abstractTexture)); + QCOMPARE(d->m_pendingDataUpdates.size(), 1); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QCOMPARE(arbiter.dirtyNodes.front(), &abstractTexture); } } diff --git a/tests/auto/render/qbuffer/tst_qbuffer.cpp b/tests/auto/render/qbuffer/tst_qbuffer.cpp index 8a9a25408..94c0a49cb 100644 --- a/tests/auto/render/qbuffer/tst_qbuffer.cpp +++ b/tests/auto/render/qbuffer/tst_qbuffer.cpp @@ -154,12 +154,10 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - auto change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>(); - QCOMPARE(change->propertyName(), "dataGenerator"); - QCOMPARE(change->value().value<Qt3DRender::QBufferDataGeneratorPtr>(), functor); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QCOMPARE(arbiter.dirtyNodes.front(), buffer.data()); - arbiter.events.clear(); + arbiter.dirtyNodes.clear(); // WHEN buffer->setSyncData(true); @@ -176,13 +174,8 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - QCOMPARE(buffer->data(), QByteArrayLiteral("ZL1")); - change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>(); - QCOMPARE(change->propertyName(), "updateData"); - Qt3DRender::QBufferUpdate updateData = change->value().value<Qt3DRender::QBufferUpdate>(); - QCOMPARE(updateData.offset, 1); - QCOMPARE(updateData.data, QByteArrayLiteral("L1")); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QCOMPARE(arbiter.dirtyNodes.front(), buffer.data()); } }; diff --git a/tests/auto/render/qeffect/tst_qeffect.cpp b/tests/auto/render/qeffect/tst_qeffect.cpp index 7449fee2c..955b58a1e 100644 --- a/tests/auto/render/qeffect/tst_qeffect.cpp +++ b/tests/auto/render/qeffect/tst_qeffect.cpp @@ -217,13 +217,8 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - auto change = arbiter.events.first().staticCast<Qt3DCore::QPropertyNodeAddedChange>(); - QCOMPARE(change->propertyName(), "parameter"); - QCOMPARE(change->addedNodeId(), parameter.id()); - QCOMPARE(change->type(), Qt3DCore::PropertyValueAdded); - - arbiter.events.clear(); + QCOMPARE(arbiter.events.size(), 0); + QVERIFY(effect.parameters().contains(¶meter)); } { @@ -232,13 +227,8 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - auto change = arbiter.events.first().staticCast<Qt3DCore::QPropertyNodeRemovedChange>(); - QCOMPARE(change->propertyName(), "parameter"); - QCOMPARE(change->removedNodeId(), parameter.id()); - QCOMPARE(change->type(), Qt3DCore::PropertyValueRemoved); - - arbiter.events.clear(); + QCOMPARE(arbiter.events.size(), 0); + QVERIFY(!effect.parameters().contains(¶meter)); } } @@ -257,13 +247,10 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - auto change = arbiter.events.first().staticCast<Qt3DCore::QPropertyNodeAddedChange>(); - QCOMPARE(change->propertyName(), "technique"); - QCOMPARE(change->addedNodeId(), technique.id()); - QCOMPARE(change->type(), Qt3DCore::PropertyValueAdded); - - arbiter.events.clear(); + QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QCOMPARE(arbiter.dirtyNodes.front(), &effect); + arbiter.dirtyNodes.clear(); } { @@ -272,13 +259,10 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - auto change = arbiter.events.first().staticCast<Qt3DCore::QPropertyNodeRemovedChange>(); - QCOMPARE(change->propertyName(), "technique"); - QCOMPARE(change->removedNodeId(), technique.id()); - QCOMPARE(change->type(), Qt3DCore::PropertyValueRemoved); - - arbiter.events.clear(); + QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QCOMPARE(arbiter.dirtyNodes.front(), &effect); + arbiter.dirtyNodes.clear(); } } diff --git a/tests/auto/render/qgeometry/tst_qgeometry.cpp b/tests/auto/render/qgeometry/tst_qgeometry.cpp index 55b7e752c..b82c53de1 100644 --- a/tests/auto/render/qgeometry/tst_qgeometry.cpp +++ b/tests/auto/render/qgeometry/tst_qgeometry.cpp @@ -130,13 +130,11 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - Qt3DCore::QPropertyNodeAddedChangePtr nodeAddedChange = arbiter.events.first().staticCast<Qt3DCore::QPropertyNodeAddedChange>(); - QCOMPARE(nodeAddedChange->propertyName(), "attribute"); - QCOMPARE(nodeAddedChange->addedNodeId(), attr.id()); - QCOMPARE(nodeAddedChange->type(), Qt3DCore::PropertyValueAdded); + QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QCOMPARE(arbiter.dirtyNodes.front(), geometry.data()); - arbiter.events.clear(); + arbiter.dirtyNodes.clear(); // WHEN geometry->addAttribute(&attr); @@ -144,17 +142,16 @@ private Q_SLOTS: // THEN QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 0); // WHEN geometry->removeAttribute(&attr); QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - Qt3DCore::QPropertyNodeRemovedChangePtr nodeRemovedChange = arbiter.events.first().staticCast<Qt3DCore::QPropertyNodeRemovedChange>(); - QCOMPARE(nodeRemovedChange->propertyName(), "attribute"); - QCOMPARE(nodeRemovedChange->removedNodeId(), attr.id()); - QCOMPARE(nodeRemovedChange->type(), Qt3DCore::PropertyValueRemoved); + QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QCOMPARE(arbiter.dirtyNodes.front(), geometry.data()); arbiter.events.clear(); } diff --git a/tests/auto/render/qgeometryrenderer/tst_qgeometryrenderer.cpp b/tests/auto/render/qgeometryrenderer/tst_qgeometryrenderer.cpp index 15cf98de0..b03d48663 100644 --- a/tests/auto/render/qgeometryrenderer/tst_qgeometryrenderer.cpp +++ b/tests/auto/render/qgeometryrenderer/tst_qgeometryrenderer.cpp @@ -262,13 +262,11 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - auto change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>(); - QCOMPARE(change->propertyName(), "geometryFactory"); - QCOMPARE(change->value().value<Qt3DRender::QGeometryFactoryPtr>(), factory); - QCOMPARE(change->type(), Qt3DCore::PropertyUpdated); + QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QCOMPARE(arbiter.dirtyNodes.front(), geometryRenderer.data()); - arbiter.events.clear(); + arbiter.dirtyNodes.clear(); // WHEN Qt3DRender::QGeometry geom; diff --git a/tests/auto/render/qmaterial/tst_qmaterial.cpp b/tests/auto/render/qmaterial/tst_qmaterial.cpp index 5b24c6127..501d50556 100644 --- a/tests/auto/render/qmaterial/tst_qmaterial.cpp +++ b/tests/auto/render/qmaterial/tst_qmaterial.cpp @@ -295,13 +295,9 @@ private Q_SLOTS: QCOMPARE(param->parent(), material); // THEN - QCOMPARE(arbiter.events.size(), 1); - Qt3DCore::QPropertyNodeAddedChangePtr change = arbiter.events.first().staticCast<Qt3DCore::QPropertyNodeAddedChange>(); - QCOMPARE(change->propertyName(), "parameter"); - QCOMPARE(change->addedNodeId(), param->id()); - QCOMPARE(change->type(), Qt3DCore::PropertyValueAdded); - - arbiter.events.clear(); + QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QVERIFY(material->parameters().contains(param)); // WHEN (add parameter to effect) param = new Qt3DRender::QParameter("testParamEffect", QVariant::fromValue(383.0f)); @@ -309,13 +305,9 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - change = arbiter.events.first().staticCast<Qt3DCore::QPropertyNodeAddedChange>(); - QCOMPARE(change->propertyName(), "parameter"); - QCOMPARE(change->addedNodeId(), param->id()); - QCOMPARE(change->type(), Qt3DCore::PropertyValueAdded); - - arbiter.events.clear(); + QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 2); + QVERIFY(material->effect()->parameters().contains(param)); // WHEN (add parameter to technique) param = new Qt3DRender::QParameter("testParamTechnique", QVariant::fromValue(383.0f)); @@ -323,13 +315,10 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - change = arbiter.events.first().staticCast<Qt3DCore::QPropertyNodeAddedChange>(); - QCOMPARE(change->propertyName(), "parameter"); - QCOMPARE(change->addedNodeId(), param->id()); - QCOMPARE(change->type(), Qt3DCore::PropertyValueAdded); + QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 3); + QVERIFY(material->m_technique->parameters().contains(param)); - arbiter.events.clear(); // WHEN (add parameter to renderpass) param = new Qt3DRender::QParameter("testParamRenderPass", QVariant::fromValue(383.0f)); @@ -337,13 +326,9 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - change = arbiter.events.first().staticCast<Qt3DCore::QPropertyNodeAddedChange>(); - QCOMPARE(change->propertyName(), "parameter"); - QCOMPARE(change->addedNodeId(), param->id()); - QCOMPARE(change->type(), Qt3DCore::PropertyValueAdded); - - arbiter.events.clear(); + QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 4); + QVERIFY(material->m_renderPass->parameters().contains(param)); } void checkShaderProgramUpdates() diff --git a/tests/auto/render/qmesh/tst_qmesh.cpp b/tests/auto/render/qmesh/tst_qmesh.cpp index fbc566395..49679e29e 100644 --- a/tests/auto/render/qmesh/tst_qmesh.cpp +++ b/tests/auto/render/qmesh/tst_qmesh.cpp @@ -186,18 +186,10 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - auto change = arbiter.events.last().staticCast<Qt3DCore::QPropertyUpdatedChange>(); - QCOMPARE(change->propertyName(), "geometryFactory"); - QCOMPARE(change->type(), Qt3DCore::PropertyUpdated); - - Qt3DRender::QGeometryFactoryPtr factory = change->value().value<Qt3DRender::QGeometryFactoryPtr>(); - QSharedPointer<Qt3DRender::MeshLoaderFunctor> meshFunctor = qSharedPointerCast<Qt3DRender::MeshLoaderFunctor>(factory); - QVERIFY(meshFunctor != nullptr); - QCOMPARE(meshFunctor->mesh(), mesh.id()); - QCOMPARE(meshFunctor->sourcePath(), mesh.source()); - - arbiter.events.clear(); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QCOMPARE(arbiter.dirtyNodes.front(), &mesh); + + arbiter.dirtyNodes.clear(); } { @@ -206,7 +198,7 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 0); } } @@ -231,18 +223,10 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - auto change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>(); - QCOMPARE(change->propertyName(), "geometryFactory"); - QCOMPARE(change->type(), Qt3DCore::PropertyUpdated); - - Qt3DRender::QGeometryFactoryPtr factory = change->value().value<Qt3DRender::QGeometryFactoryPtr>(); - QSharedPointer<Qt3DRender::MeshLoaderFunctor> meshFunctor = qSharedPointerCast<Qt3DRender::MeshLoaderFunctor>(factory); - QVERIFY(meshFunctor != nullptr); - QCOMPARE(meshFunctor->mesh(), mesh.id()); - QCOMPARE(meshFunctor->meshName(), mesh.meshName()); - - arbiter.events.clear(); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QCOMPARE(arbiter.dirtyNodes.front(), &mesh); + + arbiter.dirtyNodes.clear(); } { @@ -251,7 +235,7 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 0); } } diff --git a/tests/auto/render/qrenderpass/tst_qrenderpass.cpp b/tests/auto/render/qrenderpass/tst_qrenderpass.cpp index 38b66de94..ce9c6581b 100644 --- a/tests/auto/render/qrenderpass/tst_qrenderpass.cpp +++ b/tests/auto/render/qrenderpass/tst_qrenderpass.cpp @@ -338,11 +338,9 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - auto change = arbiter.events.first().staticCast<Qt3DCore::QPropertyNodeAddedChange>(); - QCOMPARE(change->propertyName(), "filterKeys"); - QCOMPARE(change->addedNodeId(), filterKey.id()); - QCOMPARE(change->type(), Qt3DCore::PropertyValueAdded); + QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QCOMPARE(arbiter.dirtyNodes.front(), &renderPass); arbiter.events.clear(); } @@ -353,11 +351,9 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - auto change = arbiter.events.first().staticCast<Qt3DCore::QPropertyNodeRemovedChange>(); - QCOMPARE(change->propertyName(), "filterKeys"); - QCOMPARE(change->removedNodeId(), filterKey.id()); - QCOMPARE(change->type(), Qt3DCore::PropertyValueRemoved); + QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QCOMPARE(arbiter.dirtyNodes.front(), &renderPass); arbiter.events.clear(); } @@ -378,11 +374,9 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - auto change = arbiter.events.first().staticCast<Qt3DCore::QPropertyNodeAddedChange>(); - QCOMPARE(change->propertyName(), "renderState"); - QCOMPARE(change->addedNodeId(), renderState.id()); - QCOMPARE(change->type(), Qt3DCore::PropertyValueAdded); + QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QCOMPARE(arbiter.dirtyNodes.front(), &renderPass); arbiter.events.clear(); } @@ -393,11 +387,9 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - auto change = arbiter.events.first().staticCast<Qt3DCore::QPropertyNodeRemovedChange>(); - QCOMPARE(change->propertyName(), "renderState"); - QCOMPARE(change->removedNodeId(), renderState.id()); - QCOMPARE(change->type(), Qt3DCore::PropertyValueRemoved); + QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QCOMPARE(arbiter.dirtyNodes.front(), &renderPass); arbiter.events.clear(); } @@ -418,11 +410,9 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - auto change = arbiter.events.first().staticCast<Qt3DCore::QPropertyNodeAddedChange>(); - QCOMPARE(change->propertyName(), "parameter"); - QCOMPARE(change->addedNodeId(), parameter.id()); - QCOMPARE(change->type(), Qt3DCore::PropertyValueAdded); + QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QCOMPARE(arbiter.dirtyNodes.front(), &renderPass); arbiter.events.clear(); } @@ -433,11 +423,9 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - auto change = arbiter.events.first().staticCast<Qt3DCore::QPropertyNodeRemovedChange>(); - QCOMPARE(change->propertyName(), "parameter"); - QCOMPARE(change->removedNodeId(), parameter.id()); - QCOMPARE(change->type(), Qt3DCore::PropertyValueRemoved); + QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QCOMPARE(arbiter.dirtyNodes.front(), &renderPass); arbiter.events.clear(); } diff --git a/tests/auto/render/qtechnique/tst_qtechnique.cpp b/tests/auto/render/qtechnique/tst_qtechnique.cpp index 1026dddc0..1e7e4b440 100644 --- a/tests/auto/render/qtechnique/tst_qtechnique.cpp +++ b/tests/auto/render/qtechnique/tst_qtechnique.cpp @@ -329,28 +329,21 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - auto change = arbiter.events.first().staticCast<Qt3DCore::QPropertyNodeAddedChange>(); - QCOMPARE(change->propertyName(), "pass"); - QCOMPARE(change->addedNodeId(), pass.id()); - QCOMPARE(change->type(), Qt3DCore::PropertyValueAdded); + QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QVERIFY(arbiter.dirtyNodes.contains(&technique)); - arbiter.events.clear(); + arbiter.dirtyNodes.clear(); } - { // WHEN technique.removeRenderPass(&pass); QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - auto change = arbiter.events.first().staticCast<Qt3DCore::QPropertyNodeRemovedChange>(); - QCOMPARE(change->propertyName(), "pass"); - QCOMPARE(change->removedNodeId(), pass.id()); - QCOMPARE(change->type(), Qt3DCore::PropertyValueRemoved); - - arbiter.events.clear(); + QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QVERIFY(arbiter.dirtyNodes.contains(&technique)); } } @@ -368,13 +361,11 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - auto change = arbiter.events.first().staticCast<Qt3DCore::QPropertyNodeAddedChange>(); - QCOMPARE(change->propertyName(), "parameter"); - QCOMPARE(change->addedNodeId(), parameter.id()); - QCOMPARE(change->type(), Qt3DCore::PropertyValueAdded); + QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QVERIFY(arbiter.dirtyNodes.contains(&technique)); - arbiter.events.clear(); + arbiter.dirtyNodes.clear(); } { @@ -383,13 +374,11 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - auto change = arbiter.events.first().staticCast<Qt3DCore::QPropertyNodeRemovedChange>(); - QCOMPARE(change->propertyName(), "parameter"); - QCOMPARE(change->removedNodeId(), parameter.id()); - QCOMPARE(change->type(), Qt3DCore::PropertyValueRemoved); + QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QVERIFY(arbiter.dirtyNodes.contains(&technique)); - arbiter.events.clear(); + arbiter.dirtyNodes.clear(); } } @@ -407,13 +396,11 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - auto change = arbiter.events.first().staticCast<Qt3DCore::QPropertyNodeAddedChange>(); - QCOMPARE(change->propertyName(), "filterKeys"); - QCOMPARE(change->addedNodeId(), filterKey.id()); - QCOMPARE(change->type(), Qt3DCore::PropertyValueAdded); + QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QVERIFY(arbiter.dirtyNodes.contains(&technique)); - arbiter.events.clear(); + arbiter.dirtyNodes.clear(); } { @@ -422,13 +409,11 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - auto change = arbiter.events.first().staticCast<Qt3DCore::QPropertyNodeRemovedChange>(); - QCOMPARE(change->propertyName(), "filterKeys"); - QCOMPARE(change->removedNodeId(), filterKey.id()); - QCOMPARE(change->type(), Qt3DCore::PropertyValueRemoved); + QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QVERIFY(arbiter.dirtyNodes.contains(&technique)); - arbiter.events.clear(); + arbiter.dirtyNodes.clear(); } } @@ -445,14 +430,11 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - auto change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>(); - QCOMPARE(change->propertyName(), "graphicsApiFilterData"); - QCOMPARE(change->type(), Qt3DCore::PropertyUpdated); - Qt3DRender::GraphicsApiFilterData data = change->value().value<Qt3DRender::GraphicsApiFilterData>(); - QCOMPARE(data.m_major, 4); - - arbiter.events.clear(); + QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QVERIFY(arbiter.dirtyNodes.contains(&technique)); + + arbiter.dirtyNodes.clear(); } { // WHEN @@ -460,14 +442,11 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - auto change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>(); - QCOMPARE(change->propertyName(), "graphicsApiFilterData"); - QCOMPARE(change->type(), Qt3DCore::PropertyUpdated); - Qt3DRender::GraphicsApiFilterData data = change->value().value<Qt3DRender::GraphicsApiFilterData>(); - QCOMPARE(data.m_minor, 5); - - arbiter.events.clear(); + QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QVERIFY(arbiter.dirtyNodes.contains(&technique)); + + arbiter.dirtyNodes.clear(); } { // WHEN @@ -475,14 +454,11 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - auto change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>(); - QCOMPARE(change->propertyName(), "graphicsApiFilterData"); - QCOMPARE(change->type(), Qt3DCore::PropertyUpdated); - Qt3DRender::GraphicsApiFilterData data = change->value().value<Qt3DRender::GraphicsApiFilterData>(); - QCOMPARE(data.m_vendor, QStringLiteral("AMD")); - - arbiter.events.clear(); + QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QVERIFY(arbiter.dirtyNodes.contains(&technique)); + + arbiter.dirtyNodes.clear(); } { // WHEN @@ -490,14 +466,11 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - auto change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>(); - QCOMPARE(change->propertyName(), "graphicsApiFilterData"); - QCOMPARE(change->type(), Qt3DCore::PropertyUpdated); - Qt3DRender::GraphicsApiFilterData data = change->value().value<Qt3DRender::GraphicsApiFilterData>(); - QCOMPARE(data.m_profile, Qt3DRender::QGraphicsApiFilter::CompatibilityProfile); - - arbiter.events.clear(); + QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QVERIFY(arbiter.dirtyNodes.contains(&technique)); + + arbiter.dirtyNodes.clear(); } } }; diff --git a/tests/auto/render/qtextureimage/tst_qtextureimage.cpp b/tests/auto/render/qtextureimage/tst_qtextureimage.cpp index 224784011..8ea656c28 100644 --- a/tests/auto/render/qtextureimage/tst_qtextureimage.cpp +++ b/tests/auto/render/qtextureimage/tst_qtextureimage.cpp @@ -174,14 +174,8 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - auto change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>(); - QCOMPARE(change->propertyName(), "dataGenerator"); - QCOMPARE(change->type(), Qt3DCore::PropertyUpdated); - - const auto generator = qSharedPointerCast<Qt3DRender::QImageTextureDataFunctor>(change->value().value<Qt3DRender::QTextureImageDataGeneratorPtr>()); - QVERIFY(generator); - QCOMPARE(generator->url(), textureImage.source()); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QCOMPARE(arbiter.dirtyNodes.front(), &textureImage); arbiter.events.clear(); } @@ -210,14 +204,8 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - auto change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>(); - QCOMPARE(change->propertyName(), "dataGenerator"); - QCOMPARE(change->type(), Qt3DCore::PropertyUpdated); - - const auto generator = qSharedPointerCast<Qt3DRender::QImageTextureDataFunctor>(change->value().value<Qt3DRender::QTextureImageDataGeneratorPtr>()); - QVERIFY(generator); - QCOMPARE(generator->isMirrored(), textureImage.isMirrored()); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QCOMPARE(arbiter.dirtyNodes.front(), &textureImage); arbiter.events.clear(); } diff --git a/tests/auto/render/qtextureloader/tst_qtextureloader.cpp b/tests/auto/render/qtextureloader/tst_qtextureloader.cpp index 56ad55adf..eebbf5d41 100644 --- a/tests/auto/render/qtextureloader/tst_qtextureloader.cpp +++ b/tests/auto/render/qtextureloader/tst_qtextureloader.cpp @@ -168,16 +168,14 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - const auto change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>(); - QCOMPARE(change->propertyName(), "generator"); - QCOMPARE(change->type(), Qt3DCore::PropertyUpdated); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QCOMPARE(arbiter.dirtyNodes.front(), &textureLoader); - const auto generator = qSharedPointerCast<Qt3DRender::QTextureFromSourceGenerator>(change->value().value<Qt3DRender::QTextureGeneratorPtr>()); + Qt3DRender::QAbstractTexturePrivate *d = dynamic_cast<Qt3DRender::QAbstractTexturePrivate *>(Qt3DRender::QAbstractTexturePrivate::get(&textureLoader)); + const auto generator = qSharedPointerCast<Qt3DRender::QTextureFromSourceGenerator>(d->dataFunctor()); QVERIFY(generator); QCOMPARE(generator->url(), QUrl(QStringLiteral("Gary"))); - arbiter.events.clear(); } @@ -205,16 +203,15 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - const auto change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>(); - QCOMPARE(change->propertyName(), "generator"); - QCOMPARE(change->type(), Qt3DCore::PropertyUpdated); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QCOMPARE(arbiter.dirtyNodes.front(), &textureLoader); - const auto generator = qSharedPointerCast<Qt3DRender::QTextureFromSourceGenerator>(change->value().value<Qt3DRender::QTextureGeneratorPtr>()); + Qt3DRender::QAbstractTexturePrivate *d = dynamic_cast<Qt3DRender::QAbstractTexturePrivate *>(Qt3DRender::QAbstractTexturePrivate::get(&textureLoader)); + const auto generator = qSharedPointerCast<Qt3DRender::QTextureFromSourceGenerator>(d->dataFunctor()); QVERIFY(generator); QCOMPARE(generator->isMirrored(), false); - arbiter.events.clear(); + arbiter.dirtyNodes.clear(); } { @@ -223,7 +220,7 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 0); } } diff --git a/tests/auto/render/renderpass/tst_renderpass.cpp b/tests/auto/render/renderpass/tst_renderpass.cpp index a4a2762ba..7be741936 100644 --- a/tests/auto/render/renderpass/tst_renderpass.cpp +++ b/tests/auto/render/renderpass/tst_renderpass.cpp @@ -70,6 +70,7 @@ using namespace Qt3DRender::Render; class tst_RenderRenderPass : public Qt3DCore::QBackendNodeTester { Q_OBJECT + public: tst_RenderRenderPass() : m_renderStateManager(new RenderStateManager()) @@ -96,6 +97,8 @@ private slots: { // GIVEN RenderPass backend; + TestRenderer renderer; + backend.setRenderer(&renderer); // WHEN backend.setEnabled(true); @@ -112,7 +115,7 @@ private slots: frontend.addRenderState(&state); frontend.setShaderProgram(&program); - simulateInitialization(&frontend, &backend); + simulateInitializationSync(&frontend, &backend); } backend.cleanup(); @@ -141,12 +144,14 @@ private slots: frontend.addRenderState(frontendState); RenderPass backend; + TestRenderer renderer; + backend.setRenderer(&renderer); RenderStateNode *backendState = m_renderStateManager->getOrCreateResource(frontendState->id()); - simulateInitialization(frontendState, backendState); + simulateInitializationSync(frontendState, backendState); // WHEN - simulateInitialization(&frontend, &backend); + simulateInitializationSync(&frontend, &backend); // THEN QCOMPARE(backend.shaderProgram(), frontend.shaderProgram()->id()); @@ -165,25 +170,26 @@ private slots: void shouldHandleShaderPropertyChangeEvents() { // GIVEN - QScopedPointer<QShaderProgram> shader(new QShaderProgram); + QShaderProgram *shader = new QShaderProgram; RenderPass backend; TestRenderer renderer; backend.setRenderer(&renderer); + QRenderPass frontend; + simulateInitializationSync(&frontend, &backend); + // WHEN - const auto addChange = Qt3DCore::QPropertyNodeAddedChangePtr::create(Qt3DCore::QNodeId(), shader.data()); - addChange->setPropertyName("shaderProgram"); - backend.sceneChangeEvent(addChange); + frontend.setShaderProgram(shader); + backend.syncFromFrontEnd(&frontend, false); // THEN QCOMPARE(backend.shaderProgram(), shader->id()); QVERIFY(renderer.dirtyBits() != 0); // WHEN - const auto removeChange = Qt3DCore::QPropertyNodeRemovedChangePtr::create(Qt3DCore::QNodeId(), shader.data()); - removeChange->setPropertyName("shaderProgram"); - backend.sceneChangeEvent(removeChange); + frontend.setShaderProgram(nullptr); + backend.syncFromFrontEnd(&frontend, false); // THEN QVERIFY(backend.shaderProgram().isNull()); @@ -192,16 +198,18 @@ private slots: void shouldHandleAnnotationsPropertyChangeEvents() { // GIVEN - QScopedPointer<QFilterKey> annotation(new QFilterKey); + QFilterKey *annotation = new QFilterKey; RenderPass backend; TestRenderer renderer; backend.setRenderer(&renderer); + QRenderPass frontend; + simulateInitializationSync(&frontend, &backend); + // WHEN - const auto addChange = Qt3DCore::QPropertyNodeAddedChangePtr::create(Qt3DCore::QNodeId(), annotation.data()); - addChange->setPropertyName("filterKeys"); - backend.sceneChangeEvent(addChange); + frontend.addFilterKey(annotation); + backend.syncFromFrontEnd(&frontend, false); // THEN QCOMPARE(backend.filterKeys().size(), 1); @@ -209,9 +217,8 @@ private slots: QVERIFY(renderer.dirtyBits() != 0); // WHEN - const auto removeChange = Qt3DCore::QPropertyNodeRemovedChangePtr::create(Qt3DCore::QNodeId(), annotation.data()); - removeChange->setPropertyName("filterKeys"); - backend.sceneChangeEvent(removeChange); + frontend.removeFilterKey(annotation); + backend.syncFromFrontEnd(&frontend, false); // THEN QVERIFY(backend.filterKeys().isEmpty()); @@ -220,16 +227,18 @@ private slots: void shouldHandleParametersPropertyChangeEvents() { // GIVEN - QScopedPointer<QParameter> parameter(new QParameter); + QParameter *parameter = new QParameter; RenderPass backend; TestRenderer renderer; backend.setRenderer(&renderer); + QRenderPass frontend; + simulateInitializationSync(&frontend, &backend); + // WHEN - const auto addChange = Qt3DCore::QPropertyNodeAddedChangePtr::create(Qt3DCore::QNodeId(), parameter.data()); - addChange->setPropertyName("parameter"); - backend.sceneChangeEvent(addChange); + frontend.addParameter(parameter); + backend.syncFromFrontEnd(&frontend, false); // THEN QCOMPARE(backend.parameters().size(), 1); @@ -237,9 +246,8 @@ private slots: QVERIFY(renderer.dirtyBits() != 0); // WHEN - const auto removeChange = Qt3DCore::QPropertyNodeRemovedChangePtr::create(Qt3DCore::QNodeId(), parameter.data()); - removeChange->setPropertyName("parameter"); - backend.sceneChangeEvent(removeChange); + frontend.removeParameter(parameter); + backend.syncFromFrontEnd(&frontend, false); // THEN QVERIFY(backend.parameters().isEmpty()); @@ -254,12 +262,14 @@ private slots: backend.setRenderer(&renderer); RenderStateNode *backendState = m_renderStateManager->getOrCreateResource(frontendState->id()); - simulateInitialization(frontendState, backendState); + simulateInitializationSync(frontendState, backendState); + + QRenderPass frontend; + simulateInitializationSync(&frontend, &backend); // WHEN - const auto addChange = Qt3DCore::QPropertyNodeAddedChangePtr::create(Qt3DCore::QNodeId(), frontendState); - addChange->setPropertyName("renderState"); - backend.sceneChangeEvent(addChange); + frontend.addRenderState(frontendState); + backend.syncFromFrontEnd(&frontend, false); // THEN QCOMPARE(backend.renderStates().size(), 1); @@ -267,32 +277,13 @@ private slots: QVERIFY(renderer.dirtyBits() != 0); // WHEN - const auto removeChange = Qt3DCore::QPropertyNodeRemovedChangePtr::create(Qt3DCore::QNodeId(), frontendState); - removeChange->setPropertyName("renderState"); - backend.sceneChangeEvent(removeChange); + frontend.removeRenderState(frontendState); + backend.syncFromFrontEnd(&frontend, false); // THEN QVERIFY(backend.renderStates().isEmpty()); } - void shouldHandleShaderProgramPropertyChangeEvents() - { - // GIVEN - RenderPass backend; - TestRenderer renderer; - backend.setRenderer(&renderer); - - // WHEN - Qt3DCore::QNodeId shaderId = Qt3DCore::QNodeId::createId(); - const auto shaderChange = Qt3DCore::QPropertyUpdatedChangePtr::create(Qt3DCore::QNodeId()); - shaderChange->setPropertyName("shaderProgram"); - shaderChange->setValue(QVariant::fromValue(shaderId)); - backend.sceneChangeEvent(shaderChange); - - // THEN - QCOMPARE(backend.shaderProgram(), shaderId); - } - private: RenderStateManager *m_renderStateManager; }; diff --git a/tests/auto/render/scene2d/tst_scene2d.cpp b/tests/auto/render/scene2d/tst_scene2d.cpp index c30400202..f620064ed 100644 --- a/tests/auto/render/scene2d/tst_scene2d.cpp +++ b/tests/auto/render/scene2d/tst_scene2d.cpp @@ -276,7 +276,7 @@ private Q_SLOTS: Buffer *backendBuffer = nodeManagers->bufferManager()->getOrCreateResource(dataBuffer->id()); backendBuffer->setRenderer(&renderer); backendBuffer->setManager(nodeManagers->bufferManager()); - simulateInitialization(dataBuffer, backendBuffer); + simulateInitializationSync(dataBuffer, backendBuffer); positionAttribute->setBuffer(dataBuffer); positionAttribute->setName(Qt3DRender::QAttribute::defaultPositionAttributeName()); @@ -304,28 +304,28 @@ private Q_SLOTS: Attribute *backendAttribute = nodeManagers->attributeManager()->getOrCreateResource( positionAttribute->id()); backendAttribute->setRenderer(&renderer); - simulateInitialization(positionAttribute, backendAttribute); + simulateInitializationSync(positionAttribute, backendAttribute); Attribute *backendTexcoordAttribute = nodeManagers->attributeManager() ->getOrCreateResource(texcoordAttribute->id()); backendTexcoordAttribute->setRenderer(&renderer); - simulateInitialization(texcoordAttribute, backendTexcoordAttribute); + simulateInitializationSync(texcoordAttribute, backendTexcoordAttribute); Geometry *backendGeometry = nodeManagers->geometryManager() ->getOrCreateResource(geometry->id()); backendGeometry->setRenderer(&renderer); - simulateInitialization(geometry, backendGeometry); + simulateInitializationSync(geometry, backendGeometry); GeometryRenderer *backendRenderer = nodeManagers->geometryRendererManager() ->getOrCreateResource(geometryRenderer->id()); backendRenderer->setRenderer(&renderer); backendRenderer->setManager(nodeManagers->geometryRendererManager()); - simulateInitialization(geometryRenderer, backendRenderer); + simulateInitializationSync(geometryRenderer, backendRenderer); Entity *backendEntity = nodeManagers->renderNodesManager()->getOrCreateResource(entity->id()); backendEntity->setRenderer(&renderer); backendEntity->setNodeManagers(nodeManagers.data()); - simulateInitialization(entity.data(), backendEntity); + simulateInitializationSync(entity.data(), backendEntity); #define PICK_TRIANGLE(tri, v0, v1, v2, uvw) \ new Qt3DRender::QPickTriangleEvent(QPointF(), QVector3D(), QVector3D(), 0.0f, \ diff --git a/tests/auto/render/segmentvisitor/tst_segmentvisitor.cpp b/tests/auto/render/segmentvisitor/tst_segmentvisitor.cpp index da420e1ac..4db12136a 100644 --- a/tests/auto/render/segmentvisitor/tst_segmentvisitor.cpp +++ b/tests/auto/render/segmentvisitor/tst_segmentvisitor.cpp @@ -185,7 +185,7 @@ private Q_SLOTS: Buffer *backendBuffer = nodeManagers->bufferManager()->getOrCreateResource(dataBuffer->id()); backendBuffer->setRenderer(&renderer); backendBuffer->setManager(nodeManagers->bufferManager()); - simulateInitialization(dataBuffer.data(), backendBuffer); + simulateInitializationSync(dataBuffer.data(), backendBuffer); positionAttribute->setBuffer(dataBuffer.data()); positionAttribute->setName(Qt3DRender::QAttribute::defaultPositionAttributeName()); @@ -202,16 +202,16 @@ private Q_SLOTS: Attribute *backendAttribute = nodeManagers->attributeManager()->getOrCreateResource(positionAttribute->id()); backendAttribute->setRenderer(&renderer); - simulateInitialization(positionAttribute.data(), backendAttribute); + simulateInitializationSync(positionAttribute.data(), backendAttribute); Geometry *backendGeometry = nodeManagers->geometryManager()->getOrCreateResource(geometry->id()); backendGeometry->setRenderer(&renderer); - simulateInitialization(geometry, backendGeometry); + simulateInitializationSync(geometry, backendGeometry); GeometryRenderer *backendRenderer = nodeManagers->geometryRendererManager()->getOrCreateResource(geometryRenderer->id()); backendRenderer->setRenderer(&renderer); backendRenderer->setManager(nodeManagers->geometryRendererManager()); - simulateInitialization(geometryRenderer.data(), backendRenderer); + simulateInitializationSync(geometryRenderer.data(), backendRenderer); // WHEN visitor.apply(backendRenderer, Qt3DCore::QNodeId()); @@ -254,7 +254,7 @@ private Q_SLOTS: Buffer *backendBuffer = nodeManagers->bufferManager()->getOrCreateResource(dataBuffer->id()); backendBuffer->setRenderer(&renderer); backendBuffer->setManager(nodeManagers->bufferManager()); - simulateInitialization(dataBuffer.data(), backendBuffer); + simulateInitializationSync(dataBuffer.data(), backendBuffer); QByteArray indexData; indexData.resize(sizeof(uint) * 2 * 5); @@ -274,7 +274,7 @@ private Q_SLOTS: Buffer *backendIndexBuffer = nodeManagers->bufferManager()->getOrCreateResource(indexDataBuffer->id()); backendIndexBuffer->setRenderer(&renderer); backendIndexBuffer->setManager(nodeManagers->bufferManager()); - simulateInitialization(indexDataBuffer.data(), backendIndexBuffer); + simulateInitializationSync(indexDataBuffer.data(), backendIndexBuffer); positionAttribute->setBuffer(dataBuffer.data()); positionAttribute->setName(Qt3DRender::QAttribute::defaultPositionAttributeName()); @@ -298,20 +298,20 @@ private Q_SLOTS: Attribute *backendAttribute = nodeManagers->attributeManager()->getOrCreateResource(positionAttribute->id()); backendAttribute->setRenderer(&renderer); - simulateInitialization(positionAttribute.data(), backendAttribute); + simulateInitializationSync(positionAttribute.data(), backendAttribute); Attribute *backendIndexAttribute = nodeManagers->attributeManager()->getOrCreateResource(indexAttribute->id()); backendIndexAttribute->setRenderer(&renderer); - simulateInitialization(indexAttribute.data(), backendIndexAttribute); + simulateInitializationSync(indexAttribute.data(), backendIndexAttribute); Geometry *backendGeometry = nodeManagers->geometryManager()->getOrCreateResource(geometry->id()); backendGeometry->setRenderer(&renderer); - simulateInitialization(geometry, backendGeometry); + simulateInitializationSync(geometry, backendGeometry); GeometryRenderer *backendRenderer = nodeManagers->geometryRendererManager()->getOrCreateResource(geometryRenderer->id()); backendRenderer->setRenderer(&renderer); backendRenderer->setManager(nodeManagers->geometryRendererManager()); - simulateInitialization(geometryRenderer.data(), backendRenderer); + simulateInitializationSync(geometryRenderer.data(), backendRenderer); // WHEN visitor.apply(backendRenderer, Qt3DCore::QNodeId()); @@ -354,7 +354,7 @@ private Q_SLOTS: Buffer *backendBuffer = nodeManagers->bufferManager()->getOrCreateResource(dataBuffer->id()); backendBuffer->setRenderer(&renderer); backendBuffer->setManager(nodeManagers->bufferManager()); - simulateInitialization(dataBuffer.data(), backendBuffer); + simulateInitializationSync(dataBuffer.data(), backendBuffer); positionAttribute->setBuffer(dataBuffer.data()); positionAttribute->setName(Qt3DRender::QAttribute::defaultPositionAttributeName()); @@ -371,16 +371,16 @@ private Q_SLOTS: Attribute *backendAttribute = nodeManagers->attributeManager()->getOrCreateResource(positionAttribute->id()); backendAttribute->setRenderer(&renderer); - simulateInitialization(positionAttribute.data(), backendAttribute); + simulateInitializationSync(positionAttribute.data(), backendAttribute); Geometry *backendGeometry = nodeManagers->geometryManager()->getOrCreateResource(geometry->id()); backendGeometry->setRenderer(&renderer); - simulateInitialization(geometry, backendGeometry); + simulateInitializationSync(geometry, backendGeometry); GeometryRenderer *backendRenderer = nodeManagers->geometryRendererManager()->getOrCreateResource(geometryRenderer->id()); backendRenderer->setRenderer(&renderer); backendRenderer->setManager(nodeManagers->geometryRendererManager()); - simulateInitialization(geometryRenderer.data(), backendRenderer); + simulateInitializationSync(geometryRenderer.data(), backendRenderer); // WHEN visitor.apply(backendRenderer, Qt3DCore::QNodeId()); @@ -423,7 +423,7 @@ private Q_SLOTS: Buffer *backendBuffer = nodeManagers->bufferManager()->getOrCreateResource(dataBuffer->id()); backendBuffer->setRenderer(&renderer); backendBuffer->setManager(nodeManagers->bufferManager()); - simulateInitialization(dataBuffer.data(), backendBuffer); + simulateInitializationSync(dataBuffer.data(), backendBuffer); QByteArray indexData; indexData.resize(sizeof(uint) * 2 * 4); @@ -437,7 +437,7 @@ private Q_SLOTS: Buffer *backendIndexBuffer = nodeManagers->bufferManager()->getOrCreateResource(indexDataBuffer->id()); backendIndexBuffer->setRenderer(&renderer); backendIndexBuffer->setManager(nodeManagers->bufferManager()); - simulateInitialization(indexDataBuffer.data(), backendIndexBuffer); + simulateInitializationSync(indexDataBuffer.data(), backendIndexBuffer); positionAttribute->setBuffer(dataBuffer.data()); positionAttribute->setName(Qt3DRender::QAttribute::defaultPositionAttributeName()); @@ -461,20 +461,20 @@ private Q_SLOTS: Attribute *backendAttribute = nodeManagers->attributeManager()->getOrCreateResource(positionAttribute->id()); backendAttribute->setRenderer(&renderer); - simulateInitialization(positionAttribute.data(), backendAttribute); + simulateInitializationSync(positionAttribute.data(), backendAttribute); Attribute *backendIndexAttribute = nodeManagers->attributeManager()->getOrCreateResource(indexAttribute->id()); backendIndexAttribute->setRenderer(&renderer); - simulateInitialization(indexAttribute.data(), backendIndexAttribute); + simulateInitializationSync(indexAttribute.data(), backendIndexAttribute); Geometry *backendGeometry = nodeManagers->geometryManager()->getOrCreateResource(geometry->id()); backendGeometry->setRenderer(&renderer); - simulateInitialization(geometry, backendGeometry); + simulateInitializationSync(geometry, backendGeometry); GeometryRenderer *backendRenderer = nodeManagers->geometryRendererManager()->getOrCreateResource(geometryRenderer->id()); backendRenderer->setRenderer(&renderer); backendRenderer->setManager(nodeManagers->geometryRendererManager()); - simulateInitialization(geometryRenderer.data(), backendRenderer); + simulateInitializationSync(geometryRenderer.data(), backendRenderer); // WHEN visitor.apply(backendRenderer, Qt3DCore::QNodeId()); @@ -515,7 +515,7 @@ private Q_SLOTS: Buffer *backendBuffer = nodeManagers->bufferManager()->getOrCreateResource(dataBuffer->id()); backendBuffer->setRenderer(&renderer); backendBuffer->setManager(nodeManagers->bufferManager()); - simulateInitialization(dataBuffer.data(), backendBuffer); + simulateInitializationSync(dataBuffer.data(), backendBuffer); positionAttribute->setBuffer(dataBuffer.data()); positionAttribute->setName(Qt3DRender::QAttribute::defaultPositionAttributeName()); @@ -532,16 +532,16 @@ private Q_SLOTS: Attribute *backendAttribute = nodeManagers->attributeManager()->getOrCreateResource(positionAttribute->id()); backendAttribute->setRenderer(&renderer); - simulateInitialization(positionAttribute.data(), backendAttribute); + simulateInitializationSync(positionAttribute.data(), backendAttribute); Geometry *backendGeometry = nodeManagers->geometryManager()->getOrCreateResource(geometry->id()); backendGeometry->setRenderer(&renderer); - simulateInitialization(geometry, backendGeometry); + simulateInitializationSync(geometry, backendGeometry); GeometryRenderer *backendRenderer = nodeManagers->geometryRendererManager()->getOrCreateResource(geometryRenderer->id()); backendRenderer->setRenderer(&renderer); backendRenderer->setManager(nodeManagers->geometryRendererManager()); - simulateInitialization(geometryRenderer.data(), backendRenderer); + simulateInitializationSync(geometryRenderer.data(), backendRenderer); // WHEN visitor.apply(backendRenderer, Qt3DCore::QNodeId()); @@ -585,7 +585,7 @@ private Q_SLOTS: Buffer *backendBuffer = nodeManagers->bufferManager()->getOrCreateResource(dataBuffer->id()); backendBuffer->setRenderer(&renderer); backendBuffer->setManager(nodeManagers->bufferManager()); - simulateInitialization(dataBuffer.data(), backendBuffer); + simulateInitializationSync(dataBuffer.data(), backendBuffer); QByteArray indexData; indexData.resize(sizeof(uint) * 2 * 4); @@ -599,7 +599,7 @@ private Q_SLOTS: Buffer *backendIndexBuffer = nodeManagers->bufferManager()->getOrCreateResource(indexDataBuffer->id()); backendIndexBuffer->setRenderer(&renderer); backendIndexBuffer->setManager(nodeManagers->bufferManager()); - simulateInitialization(indexDataBuffer.data(), backendIndexBuffer); + simulateInitializationSync(indexDataBuffer.data(), backendIndexBuffer); positionAttribute->setBuffer(dataBuffer.data()); positionAttribute->setName(Qt3DRender::QAttribute::defaultPositionAttributeName()); @@ -623,20 +623,20 @@ private Q_SLOTS: Attribute *backendAttribute = nodeManagers->attributeManager()->getOrCreateResource(positionAttribute->id()); backendAttribute->setRenderer(&renderer); - simulateInitialization(positionAttribute.data(), backendAttribute); + simulateInitializationSync(positionAttribute.data(), backendAttribute); Attribute *backendIndexAttribute = nodeManagers->attributeManager()->getOrCreateResource(indexAttribute->id()); backendIndexAttribute->setRenderer(&renderer); - simulateInitialization(indexAttribute.data(), backendIndexAttribute); + simulateInitializationSync(indexAttribute.data(), backendIndexAttribute); Geometry *backendGeometry = nodeManagers->geometryManager()->getOrCreateResource(geometry->id()); backendGeometry->setRenderer(&renderer); - simulateInitialization(geometry, backendGeometry); + simulateInitializationSync(geometry, backendGeometry); GeometryRenderer *backendRenderer = nodeManagers->geometryRendererManager()->getOrCreateResource(geometryRenderer->id()); backendRenderer->setRenderer(&renderer); backendRenderer->setManager(nodeManagers->geometryRendererManager()); - simulateInitialization(geometryRenderer.data(), backendRenderer); + simulateInitializationSync(geometryRenderer.data(), backendRenderer); // WHEN visitor.apply(backendRenderer, Qt3DCore::QNodeId()); @@ -679,7 +679,7 @@ private Q_SLOTS: Buffer *backendBuffer = nodeManagers->bufferManager()->getOrCreateResource(dataBuffer->id()); backendBuffer->setRenderer(&renderer); backendBuffer->setManager(nodeManagers->bufferManager()); - simulateInitialization(dataBuffer.data(), backendBuffer); + simulateInitializationSync(dataBuffer.data(), backendBuffer); positionAttribute->setBuffer(dataBuffer.data()); positionAttribute->setName(Qt3DRender::QAttribute::defaultPositionAttributeName()); @@ -696,16 +696,16 @@ private Q_SLOTS: Attribute *backendAttribute = nodeManagers->attributeManager()->getOrCreateResource(positionAttribute->id()); backendAttribute->setRenderer(&renderer); - simulateInitialization(positionAttribute.data(), backendAttribute); + simulateInitializationSync(positionAttribute.data(), backendAttribute); Geometry *backendGeometry = nodeManagers->geometryManager()->getOrCreateResource(geometry->id()); backendGeometry->setRenderer(&renderer); - simulateInitialization(geometry, backendGeometry); + simulateInitializationSync(geometry, backendGeometry); GeometryRenderer *backendRenderer = nodeManagers->geometryRendererManager()->getOrCreateResource(geometryRenderer->id()); backendRenderer->setRenderer(&renderer); backendRenderer->setManager(nodeManagers->geometryRendererManager()); - simulateInitialization(geometryRenderer.data(), backendRenderer); + simulateInitializationSync(geometryRenderer.data(), backendRenderer); // WHEN visitor.apply(backendRenderer, Qt3DCore::QNodeId()); @@ -747,7 +747,7 @@ private Q_SLOTS: Buffer *backendBuffer = nodeManagers->bufferManager()->getOrCreateResource(dataBuffer->id()); backendBuffer->setRenderer(&renderer); backendBuffer->setManager(nodeManagers->bufferManager()); - simulateInitialization(dataBuffer.data(), backendBuffer); + simulateInitializationSync(dataBuffer.data(), backendBuffer); QByteArray indexData; indexData.resize(sizeof(uint) * 4); @@ -761,7 +761,7 @@ private Q_SLOTS: Buffer *backendIndexBuffer = nodeManagers->bufferManager()->getOrCreateResource(indexDataBuffer->id()); backendIndexBuffer->setRenderer(&renderer); backendIndexBuffer->setManager(nodeManagers->bufferManager()); - simulateInitialization(indexDataBuffer.data(), backendIndexBuffer); + simulateInitializationSync(indexDataBuffer.data(), backendIndexBuffer); positionAttribute->setBuffer(dataBuffer.data()); positionAttribute->setName(Qt3DRender::QAttribute::defaultPositionAttributeName()); @@ -785,20 +785,20 @@ private Q_SLOTS: Attribute *backendAttribute = nodeManagers->attributeManager()->getOrCreateResource(positionAttribute->id()); backendAttribute->setRenderer(&renderer); - simulateInitialization(positionAttribute.data(), backendAttribute); + simulateInitializationSync(positionAttribute.data(), backendAttribute); Attribute *backendIndexAttribute = nodeManagers->attributeManager()->getOrCreateResource(indexAttribute->id()); backendIndexAttribute->setRenderer(&renderer); - simulateInitialization(indexAttribute.data(), backendIndexAttribute); + simulateInitializationSync(indexAttribute.data(), backendIndexAttribute); Geometry *backendGeometry = nodeManagers->geometryManager()->getOrCreateResource(geometry->id()); backendGeometry->setRenderer(&renderer); - simulateInitialization(geometry, backendGeometry); + simulateInitializationSync(geometry, backendGeometry); GeometryRenderer *backendRenderer = nodeManagers->geometryRendererManager()->getOrCreateResource(geometryRenderer->id()); backendRenderer->setRenderer(&renderer); backendRenderer->setManager(nodeManagers->geometryRendererManager()); - simulateInitialization(geometryRenderer.data(), backendRenderer); + simulateInitializationSync(geometryRenderer.data(), backendRenderer); // WHEN visitor.apply(backendRenderer, Qt3DCore::QNodeId()); diff --git a/tests/auto/render/skeleton/tst_skeleton.cpp b/tests/auto/render/skeleton/tst_skeleton.cpp index 499bb7cc7..17996470c 100644 --- a/tests/auto/render/skeleton/tst_skeleton.cpp +++ b/tests/auto/render/skeleton/tst_skeleton.cpp @@ -86,7 +86,7 @@ private Q_SLOTS: skeleton.setSource(QUrl::fromLocalFile("funnybones.json")); // WHEN - simulateInitialization(&skeleton, &backendSkeleton); + simulateInitializationSync(&skeleton, &backendSkeleton); // THEN QCOMPARE(backendSkeleton.peerId(), skeleton.id()); @@ -104,7 +104,7 @@ private Q_SLOTS: skeleton2.setRootJoint(joint); // WHEN - simulateInitialization(&skeleton2, &backendSkeleton2); + simulateInitializationSync(&skeleton2, &backendSkeleton2); // THEN QCOMPARE(backendSkeleton2.peerId(), skeleton2.id()); @@ -135,7 +135,7 @@ private Q_SLOTS: skeleton.setSource(QUrl::fromLocalFile("skeleton1.json")); // WHEN - simulateInitialization(&skeleton, &backendSkeleton); + simulateInitializationSync(&skeleton, &backendSkeleton); backendSkeleton.cleanup(); // THEN @@ -145,7 +145,7 @@ private Q_SLOTS: QCOMPARE(backendSkeleton.rootJointId(), QNodeId()); } - void checkPropertyChanges() + void checkDirectPropertyChanges() { // GIVEN TestRenderer renderer; @@ -160,36 +160,22 @@ private Q_SLOTS: // Initialize to ensure skeleton manager is set QSkeletonLoader skeleton; skeleton.setSource(QUrl::fromLocalFile("skeleton1.json")); - simulateInitialization(&skeleton, &backendSkeleton); + simulateInitializationSync(&skeleton, &backendSkeleton); // WHEN - updateChange.reset(new Qt3DCore::QPropertyUpdatedChange(Qt3DCore::QNodeId())); - updateChange->setPropertyName("enabled"); - updateChange->setValue(true); - backendSkeleton.sceneChangeEvent(updateChange); + skeleton.setEnabled(false); + backendSkeleton.syncFromFrontEnd(&skeleton, false); // THEN - QCOMPARE(backendSkeleton.isEnabled(), true); + QCOMPARE(backendSkeleton.isEnabled(), false); // WHEN const QUrl newSource = QUrl::fromLocalFile("terminator.json"); - updateChange.reset(new Qt3DCore::QPropertyUpdatedChange(Qt3DCore::QNodeId())); - updateChange->setPropertyName("source"); - updateChange->setValue(newSource); - backendSkeleton.sceneChangeEvent(updateChange); + skeleton.setSource(newSource); + backendSkeleton.syncFromFrontEnd(&skeleton, false); // THEN QCOMPARE(backendSkeleton.source(), newSource); - - // WHEN - const QNodeId newRootJointId = QNodeId::createId(); - updateChange.reset(new Qt3DCore::QPropertyUpdatedChange(Qt3DCore::QNodeId())); - updateChange->setPropertyName("rootJoint"); - updateChange->setValue(QVariant::fromValue(newRootJointId)); - backendSkeleton.sceneChangeEvent(updateChange); - - // THEN - QCOMPARE(backendSkeleton.rootJointId(), newRootJointId); } void checkStatusPropertyBackendNotification() diff --git a/tests/auto/render/technique/tst_technique.cpp b/tests/auto/render/technique/tst_technique.cpp index 7d7a0f8ca..64a66f0c8 100644 --- a/tests/auto/render/technique/tst_technique.cpp +++ b/tests/auto/render/technique/tst_technique.cpp @@ -96,7 +96,7 @@ private Q_SLOTS: technique.addParameter(¶meter); technique.addFilterKey(&filterKey); - simulateInitialization(&technique, &backendTechnique); + simulateInitializationSync(&technique, &backendTechnique); } backendTechnique.cleanup(); @@ -129,7 +129,7 @@ private Q_SLOTS: backendTechnique.setRenderer(&renderer); backendTechnique.setNodeManager(&nodeManagers); - simulateInitialization(&technique, &backendTechnique); + simulateInitializationSync(&technique, &backendTechnique); // THEN QCOMPARE(backendTechnique.isEnabled(), true); @@ -157,7 +157,7 @@ private Q_SLOTS: backendTechnique.setNodeManager(&nodeManagers); backendTechnique.setRenderer(&renderer); technique.setEnabled(false); - simulateInitialization(&technique, &backendTechnique); + simulateInitializationSync(&technique, &backendTechnique); // THEN QCOMPARE(backendTechnique.peerId(), technique.id()); @@ -184,6 +184,7 @@ private Q_SLOTS: void checkSceneChangeEvents() { // GIVEN + Qt3DRender::QTechnique technique; Qt3DRender::Render::Technique backendTechnique; Qt3DRender::Render::NodeManagers nodeManagers; @@ -193,34 +194,31 @@ private Q_SLOTS: { // WHEN - const bool newValue = false; - const auto change = Qt3DCore::QPropertyUpdatedChangePtr::create(Qt3DCore::QNodeId()); - change->setPropertyName("enabled"); - change->setValue(newValue); - backendTechnique.sceneChangeEvent(change); + const bool newValue = true; + technique.setEnabled(newValue); + backendTechnique.syncFromFrontEnd(&technique, false); // THEN QCOMPARE(backendTechnique.isEnabled(), newValue); QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::TechniquesDirty); renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty); + QCOMPARE(nodeManagers.techniqueManager()->takeDirtyTechniques().size(), 1); } { // WHEN backendTechnique.setCompatibleWithRenderer(true); QCOMPARE(nodeManagers.techniqueManager()->takeDirtyTechniques().size(), 0); - Qt3DRender::GraphicsApiFilterData newValue; - newValue.m_major = 4; - newValue.m_minor = 5; - newValue.m_vendor = QStringLiteral("ATI"); + technique.graphicsApiFilter()->setMajorVersion(4); + technique.graphicsApiFilter()->setMinorVersion(5); + technique.graphicsApiFilter()->setVendor(QStringLiteral("ATI")); - const auto change = Qt3DCore::QPropertyUpdatedChangePtr::create(Qt3DCore::QNodeId()); - change->setPropertyName("graphicsApiFilterData"); - change->setValue(QVariant::fromValue(newValue)); - backendTechnique.sceneChangeEvent(change); + backendTechnique.syncFromFrontEnd(&technique, false); // THEN - QCOMPARE(*backendTechnique.graphicsApiFilter(), newValue); + QCOMPARE(backendTechnique.graphicsApiFilter()->m_major, technique.graphicsApiFilter()->majorVersion()); + QCOMPARE(backendTechnique.graphicsApiFilter()->m_minor, technique.graphicsApiFilter()->minorVersion()); + QCOMPARE(backendTechnique.graphicsApiFilter()->m_vendor, technique.graphicsApiFilter()->vendor()); QCOMPARE(backendTechnique.isCompatibleWithRenderer(), false); const QVector<Qt3DCore::QNodeId> dirtyTechniques = nodeManagers.techniqueManager()->takeDirtyTechniques(); @@ -235,9 +233,8 @@ private Q_SLOTS: { // WHEN - const auto change = Qt3DCore::QPropertyNodeAddedChangePtr::create(Qt3DCore::QNodeId(), ¶meter); - change->setPropertyName("parameter"); - backendTechnique.sceneChangeEvent(change); + technique.addParameter(¶meter); + backendTechnique.syncFromFrontEnd(&technique, false); // THEN QCOMPARE(backendTechnique.parameters().size(), 1); @@ -247,9 +244,8 @@ private Q_SLOTS: } { // WHEN - const auto change = Qt3DCore::QPropertyNodeRemovedChangePtr::create(Qt3DCore::QNodeId(), ¶meter); - change->setPropertyName("parameter"); - backendTechnique.sceneChangeEvent(change); + technique.removeParameter(¶meter); + backendTechnique.syncFromFrontEnd(&technique, false); // THEN QCOMPARE(backendTechnique.parameters().size(), 0); @@ -262,9 +258,8 @@ private Q_SLOTS: { // WHEN - const auto change = Qt3DCore::QPropertyNodeAddedChangePtr::create(Qt3DCore::QNodeId(), &filterKey); - change->setPropertyName("filterKeys"); - backendTechnique.sceneChangeEvent(change); + technique.addFilterKey(&filterKey); + backendTechnique.syncFromFrontEnd(&technique, false); // THEN QCOMPARE(backendTechnique.filterKeys().size(), 1); @@ -274,9 +269,8 @@ private Q_SLOTS: } { // WHEN - const auto change = Qt3DCore::QPropertyNodeRemovedChangePtr::create(Qt3DCore::QNodeId(), &filterKey); - change->setPropertyName("filterKeys"); - backendTechnique.sceneChangeEvent(change); + technique.removeFilterKey(&filterKey); + backendTechnique.syncFromFrontEnd(&technique, false); // THEN QCOMPARE(backendTechnique.filterKeys().size(), 0); @@ -289,9 +283,8 @@ private Q_SLOTS: { // WHEN - const auto change = Qt3DCore::QPropertyNodeAddedChangePtr::create(Qt3DCore::QNodeId(), &pass); - change->setPropertyName("pass"); - backendTechnique.sceneChangeEvent(change); + technique.addRenderPass(&pass); + backendTechnique.syncFromFrontEnd(&technique, false); // THEN QCOMPARE(backendTechnique.renderPasses().size(), 1); @@ -301,9 +294,8 @@ private Q_SLOTS: } { // WHEN - const auto change = Qt3DCore::QPropertyNodeRemovedChangePtr::create(Qt3DCore::QNodeId(), &pass); - change->setPropertyName("pass"); - backendTechnique.sceneChangeEvent(change); + technique.removeRenderPass(&pass); + backendTechnique.syncFromFrontEnd(&technique, false); // THEN QCOMPARE(backendTechnique.renderPasses().size(), 0); diff --git a/tests/auto/render/texture/tst_texture.cpp b/tests/auto/render/texture/tst_texture.cpp index 1d69c54be..a51f082a7 100644 --- a/tests/auto/render/texture/tst_texture.cpp +++ b/tests/auto/render/texture/tst_texture.cpp @@ -244,7 +244,7 @@ void tst_RenderTexture::checkPropertyMirroring() frontend.setSamples(32); // WHEN - simulateInitialization(&frontend, &backend); + simulateInitializationSync(&frontend, &backend); // THEN QCOMPARE(backend.peerId(), frontend.id()); @@ -275,15 +275,14 @@ void tst_RenderTexture::checkPropertyChanges() { // GIVEN TestRenderer renderer; + Qt3DRender::QSharedGLTexture frontend; Qt3DRender::Render::Texture backend; backend.setRenderer(&renderer); backend.unsetDirty(); // WHEN - Qt3DCore::QPropertyUpdatedChangePtr updateChange(new Qt3DCore::QPropertyUpdatedChange(Qt3DCore::QNodeId())); - updateChange->setValue(256); - updateChange->setPropertyName("width"); - backend.sceneChangeEvent(updateChange); + frontend.setWidth(256); + backend.syncFromFrontEnd(&frontend, false); // THEN QCOMPARE(backend.properties().width, 256); @@ -293,10 +292,8 @@ void tst_RenderTexture::checkPropertyChanges() backend.unsetDirty(); // WHEN - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - updateChange->setValue(128); - updateChange->setPropertyName("height"); - backend.sceneChangeEvent(updateChange); + frontend.setHeight(128); + backend.syncFromFrontEnd(&frontend, false); // THEN QCOMPARE(backend.properties().height, 128); @@ -306,10 +303,8 @@ void tst_RenderTexture::checkPropertyChanges() backend.unsetDirty(); // WHEN - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - updateChange->setValue(16); - updateChange->setPropertyName("depth"); - backend.sceneChangeEvent(updateChange); + frontend.setDepth(16); + backend.syncFromFrontEnd(&frontend, false); // THEN QCOMPARE(backend.properties().depth, 16); @@ -319,10 +314,8 @@ void tst_RenderTexture::checkPropertyChanges() backend.unsetDirty(); // WHEN - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - updateChange->setValue(QVariant::fromValue(Qt3DRender::QAbstractTexture::RGB16F)); - updateChange->setPropertyName("format"); - backend.sceneChangeEvent(updateChange); + frontend.setFormat(Qt3DRender::QAbstractTexture::RGB16F); + backend.syncFromFrontEnd(&frontend, false); // THEN QCOMPARE(backend.properties().format, Qt3DRender::QAbstractTexture::RGB16F); @@ -332,23 +325,8 @@ void tst_RenderTexture::checkPropertyChanges() backend.unsetDirty(); // WHEN - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - updateChange->setValue(QVariant::fromValue(Qt3DRender::QAbstractTexture::Target1DArray)); - updateChange->setPropertyName("target"); - backend.sceneChangeEvent(updateChange); - - // THEN - QCOMPARE(backend.properties().target, Qt3DRender::QAbstractTexture::Target1DArray); - QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::TexturesDirty); - QVERIFY(backend.dirtyFlags() == Qt3DRender::Render::Texture::DirtyProperties); - renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty); - backend.unsetDirty(); - - // WHEN - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - updateChange->setValue(true); - updateChange->setPropertyName("mipmaps"); - backend.sceneChangeEvent(updateChange); + frontend.setGenerateMipMaps(true); + backend.syncFromFrontEnd(&frontend, false); // THEN QCOMPARE(backend.properties().generateMipMaps, true); @@ -358,10 +336,8 @@ void tst_RenderTexture::checkPropertyChanges() backend.unsetDirty(); // WHEN - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - updateChange->setValue(QVariant::fromValue(Qt3DRender::QAbstractTexture::LinearMipMapLinear)); - updateChange->setPropertyName("minificationFilter"); - backend.sceneChangeEvent(updateChange); + frontend.setMinificationFilter(Qt3DRender::QAbstractTexture::LinearMipMapLinear); + backend.syncFromFrontEnd(&frontend, false); // THEN QCOMPARE(backend.parameters().minificationFilter, Qt3DRender::QAbstractTexture::LinearMipMapLinear); @@ -371,10 +347,8 @@ void tst_RenderTexture::checkPropertyChanges() backend.unsetDirty(); // WHEN - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - updateChange->setValue(QVariant::fromValue(Qt3DRender::QAbstractTexture::Linear)); - updateChange->setPropertyName("magnificationFilter"); - backend.sceneChangeEvent(updateChange); + frontend.setMagnificationFilter(Qt3DRender::QAbstractTexture::Linear); + backend.syncFromFrontEnd(&frontend, false); // THEN QCOMPARE(backend.parameters().magnificationFilter, Qt3DRender::QAbstractTexture::Linear); @@ -384,10 +358,8 @@ void tst_RenderTexture::checkPropertyChanges() backend.unsetDirty(); // WHEN - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - updateChange->setValue(QVariant::fromValue(Qt3DRender::QTextureWrapMode::Repeat)); - updateChange->setPropertyName("wrapModeX"); - backend.sceneChangeEvent(updateChange); + frontend.wrapMode()->setX(Qt3DRender::QTextureWrapMode::Repeat); + backend.syncFromFrontEnd(&frontend, false); // THEN QCOMPARE(backend.parameters().wrapModeX, Qt3DRender::QTextureWrapMode::Repeat); @@ -397,10 +369,8 @@ void tst_RenderTexture::checkPropertyChanges() backend.unsetDirty(); // WHEN - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - updateChange->setValue(QVariant::fromValue(Qt3DRender::QTextureWrapMode::Repeat)); - updateChange->setPropertyName("wrapModeY"); - backend.sceneChangeEvent(updateChange); + frontend.wrapMode()->setY(Qt3DRender::QTextureWrapMode::Repeat); + backend.syncFromFrontEnd(&frontend, false); // THEN QCOMPARE(backend.parameters().wrapModeY, Qt3DRender::QTextureWrapMode::Repeat); @@ -410,10 +380,8 @@ void tst_RenderTexture::checkPropertyChanges() backend.unsetDirty(); // WHEN - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - updateChange->setValue(QVariant::fromValue(Qt3DRender::QTextureWrapMode::Repeat)); - updateChange->setPropertyName("wrapModeZ"); - backend.sceneChangeEvent(updateChange); + frontend.wrapMode()->setZ(Qt3DRender::QTextureWrapMode::Repeat); + backend.syncFromFrontEnd(&frontend, false); // THEN QCOMPARE(backend.parameters().wrapModeZ, Qt3DRender::QTextureWrapMode::Repeat); @@ -423,10 +391,8 @@ void tst_RenderTexture::checkPropertyChanges() backend.unsetDirty(); // WHEN - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - updateChange->setValue(16.0f); - updateChange->setPropertyName("maximumAnisotropy"); - backend.sceneChangeEvent(updateChange); + frontend.setMaximumAnisotropy(16.f); + backend.syncFromFrontEnd(&frontend, false); // THEN QCOMPARE(backend.parameters().maximumAnisotropy, 16.0f); @@ -436,10 +402,8 @@ void tst_RenderTexture::checkPropertyChanges() backend.unsetDirty(); // WHEN - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - updateChange->setValue(QVariant::fromValue(Qt3DRender::QAbstractTexture::CompareEqual)); - updateChange->setPropertyName("comparisonFunction"); - backend.sceneChangeEvent(updateChange); + frontend.setComparisonFunction(Qt3DRender::QAbstractTexture::CompareEqual); + backend.syncFromFrontEnd(&frontend, false); // THEN QCOMPARE(backend.parameters().comparisonFunction, Qt3DRender::QAbstractTexture::CompareEqual); @@ -449,10 +413,8 @@ void tst_RenderTexture::checkPropertyChanges() backend.unsetDirty(); // WHEN - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - updateChange->setValue(QVariant::fromValue(Qt3DRender::QAbstractTexture::CompareRefToTexture)); - updateChange->setPropertyName("comparisonMode"); - backend.sceneChangeEvent(updateChange); + frontend.setComparisonMode(Qt3DRender::QAbstractTexture::CompareRefToTexture); + backend.syncFromFrontEnd(&frontend, false); // THEN QCOMPARE(backend.parameters().comparisonMode, Qt3DRender::QAbstractTexture::CompareRefToTexture); @@ -462,10 +424,8 @@ void tst_RenderTexture::checkPropertyChanges() backend.unsetDirty(); // WHEN - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - updateChange->setValue(32); - updateChange->setPropertyName("layers"); - backend.sceneChangeEvent(updateChange); + frontend.setLayers(32); + backend.syncFromFrontEnd(&frontend, false); // THEN QCOMPARE(backend.properties().layers, 32); @@ -475,10 +435,8 @@ void tst_RenderTexture::checkPropertyChanges() backend.unsetDirty(); // WHEN - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - updateChange->setValue(64); - updateChange->setPropertyName("samples"); - backend.sceneChangeEvent(updateChange); + frontend.setSamples(64); + backend.syncFromFrontEnd(&frontend, false); // THEN QCOMPARE(backend.properties().samples, 64); @@ -488,24 +446,8 @@ void tst_RenderTexture::checkPropertyChanges() backend.unsetDirty(); // WHEN - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - Qt3DRender::QTextureGeneratorPtr gen = QSharedPointer<FakeGenerator>::create(); - updateChange->setValue(QVariant::fromValue(gen)); - updateChange->setPropertyName("generator"); - backend.sceneChangeEvent(updateChange); - - // THEN - QCOMPARE(backend.dataGenerator(), gen); - QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::TexturesDirty); - QVERIFY(backend.dirtyFlags() == Qt3DRender::Render::Texture::DirtyDataGenerator); - renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty); - backend.unsetDirty(); - - // WHEN - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - updateChange->setValue(883); - updateChange->setPropertyName("textureId"); - backend.sceneChangeEvent(updateChange); + frontend.setTextureId(883); + backend.syncFromFrontEnd(&frontend, false); // THEN QCOMPARE(backend.sharedTextureId(), 883); @@ -533,10 +475,8 @@ void tst_RenderTexture::checkPropertyChanges() updateData.setX(100); updateData.setY(100); updateData.setZ(100); - updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId()); - updateChange->setPropertyName("updateData"); - updateChange->setValue(QVariant::fromValue(updateData)); - backend.sceneChangeEvent(updateChange); + frontend.updateData(updateData); + backend.syncFromFrontEnd(&frontend, false); // THEN const QVector<Qt3DRender::QTextureDataUpdate> pendingUpdates = backend.takePendingTextureDataUpdates(); @@ -589,7 +529,7 @@ void tst_RenderTexture::checkInitialUpdateData() // WHEN -> updateData with no backend/arbiter frontend.updateData(updateData); - simulateInitialization(&frontend, &backend); + simulateInitializationSync(&frontend, &backend); // THEN -> should have received the update as part of the initial data const QVector<Qt3DRender::QTextureDataUpdate> pendingUpdates = backend.takePendingTextureDataUpdates(); diff --git a/tests/auto/render/transform/tst_transform.cpp b/tests/auto/render/transform/tst_transform.cpp index 8e4ab8ef0..3238da2fe 100644 --- a/tests/auto/render/transform/tst_transform.cpp +++ b/tests/auto/render/transform/tst_transform.cpp @@ -59,6 +59,7 @@ private Q_SLOTS: // GIVEN TestRenderer renderer; Qt3DRender::Render::Transform backendTransform; + backendTransform.setRenderer(&renderer); // WHEN { @@ -67,7 +68,7 @@ private Q_SLOTS: transform.setTranslation(QVector3D(-1.0, 5.0f, -2.0f)); transform.setRotation(QQuaternion::fromAxisAndAngle(QVector3D(1.0f, 0.0f, 0.0), 30.0f)); backendTransform.setRenderer(&renderer); - simulateInitialization(&transform, &backendTransform); + simulateInitializationSync(&transform, &backendTransform); } backendTransform.setEnabled(true); @@ -94,7 +95,9 @@ private Q_SLOTS: // WHEN Qt3DRender::Render::Transform backendTransform; backendTransform.setRenderer(&renderer); - simulateInitialization(&transform, &backendTransform); + TestRenderer renderer; + backendTransform.setRenderer(&renderer); + simulateInitializationSync(&transform, &backendTransform); // THEN QCOMPARE(backendTransform.isEnabled(), true); @@ -109,9 +112,10 @@ private Q_SLOTS: { // WHEN Qt3DRender::Render::Transform backendTransform; + TestRenderer renderer; backendTransform.setRenderer(&renderer); transform.setEnabled(false); - simulateInitialization(&transform, &backendTransform); + simulateInitializationSync(&transform, &backendTransform); // THEN QCOMPARE(backendTransform.peerId(), transform.id()); @@ -123,17 +127,18 @@ private Q_SLOTS: void checkSceneChangeEvents() { // GIVEN + Qt3DCore::QTransform frontendTranform; Qt3DRender::Render::Transform backendTransform; TestRenderer renderer; backendTransform.setRenderer(&renderer); + backendTransform.syncFromFrontEnd(&frontendTranform, true); + renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty); { // WHEN const bool newValue = false; - const auto change = Qt3DCore::QPropertyUpdatedChangePtr::create(Qt3DCore::QNodeId()); - change->setPropertyName("enabled"); - change->setValue(newValue); - backendTransform.sceneChangeEvent(change); + frontendTranform.setEnabled(newValue); + backendTransform.syncFromFrontEnd(&frontendTranform, false); // THEN QCOMPARE(backendTransform.isEnabled(), newValue); @@ -143,10 +148,8 @@ private Q_SLOTS: { // WHEN const QQuaternion newValue = QQuaternion::fromAxisAndAngle(QVector3D(0.0f, 1.0f, 0.0f), 45.0f); - const auto change = Qt3DCore::QPropertyUpdatedChangePtr::create(Qt3DCore::QNodeId()); - change->setPropertyName("rotation"); - change->setValue(QVariant::fromValue(newValue)); - backendTransform.sceneChangeEvent(change); + frontendTranform.setRotation(newValue); + backendTransform.syncFromFrontEnd(&frontendTranform, false); // THEN QCOMPARE(backendTransform.rotation(), newValue); @@ -156,10 +159,8 @@ private Q_SLOTS: { // WHEN const QVector3D newValue(454.0f, 355.0f, 0.0f); - const auto change = Qt3DCore::QPropertyUpdatedChangePtr::create(Qt3DCore::QNodeId()); - change->setPropertyName("scale3D"); - change->setValue(QVariant::fromValue(newValue)); - backendTransform.sceneChangeEvent(change); + frontendTranform.setScale3D(newValue); + backendTransform.syncFromFrontEnd(&frontendTranform, false); // THEN QCOMPARE(backendTransform.scale(), newValue); @@ -169,10 +170,8 @@ private Q_SLOTS: { // WHEN const QVector3D newValue(383.0f, 0.0f, 427.0f); - const auto change = Qt3DCore::QPropertyUpdatedChangePtr::create(Qt3DCore::QNodeId()); - change->setPropertyName("translation"); - change->setValue(QVariant::fromValue(newValue)); - backendTransform.sceneChangeEvent(change); + frontendTranform.setTranslation(newValue); + backendTransform.syncFromFrontEnd(&frontendTranform, false); // THEN QCOMPARE(backendTransform.translation(), newValue); diff --git a/tests/auto/render/trianglevisitor/tst_trianglevisitor.cpp b/tests/auto/render/trianglevisitor/tst_trianglevisitor.cpp index 4205d598e..8dfda0eea 100644 --- a/tests/auto/render/trianglevisitor/tst_trianglevisitor.cpp +++ b/tests/auto/render/trianglevisitor/tst_trianglevisitor.cpp @@ -187,7 +187,7 @@ private Q_SLOTS: Buffer *backendBuffer = nodeManagers->bufferManager()->getOrCreateResource(dataBuffer->id()); backendBuffer->setRenderer(&renderer); backendBuffer->setManager(nodeManagers->bufferManager()); - simulateInitialization(dataBuffer.data(), backendBuffer); + simulateInitializationSync(dataBuffer.data(), backendBuffer); positionAttribute->setBuffer(dataBuffer.data()); positionAttribute->setName(Qt3DRender::QAttribute::defaultPositionAttributeName()); @@ -204,16 +204,16 @@ private Q_SLOTS: Attribute *backendAttribute = nodeManagers->attributeManager()->getOrCreateResource(positionAttribute->id()); backendAttribute->setRenderer(&renderer); - simulateInitialization(positionAttribute.data(), backendAttribute); + simulateInitializationSync(positionAttribute.data(), backendAttribute); Geometry *backendGeometry = nodeManagers->geometryManager()->getOrCreateResource(geometry->id()); backendGeometry->setRenderer(&renderer); - simulateInitialization(geometry, backendGeometry); + simulateInitializationSync(geometry, backendGeometry); GeometryRenderer *backendRenderer = nodeManagers->geometryRendererManager()->getOrCreateResource(geometryRenderer->id()); backendRenderer->setRenderer(&renderer); backendRenderer->setManager(nodeManagers->geometryRendererManager()); - simulateInitialization(geometryRenderer.data(), backendRenderer); + simulateInitializationSync(geometryRenderer.data(), backendRenderer); // WHEN visitor.apply(backendRenderer, Qt3DCore::QNodeId()); @@ -262,7 +262,7 @@ private Q_SLOTS: Buffer *backendBuffer = nodeManagers->bufferManager()->getOrCreateResource(dataBuffer->id()); backendBuffer->setRenderer(&renderer); backendBuffer->setManager(nodeManagers->bufferManager()); - simulateInitialization(dataBuffer.data(), backendBuffer); + simulateInitializationSync(dataBuffer.data(), backendBuffer); QByteArray indexData; indexData.resize(sizeof(uint) * 3 * 5); @@ -287,7 +287,7 @@ private Q_SLOTS: Buffer *backendIndexBuffer = nodeManagers->bufferManager()->getOrCreateResource(indexDataBuffer->id()); backendIndexBuffer->setRenderer(&renderer); backendIndexBuffer->setManager(nodeManagers->bufferManager()); - simulateInitialization(indexDataBuffer.data(), backendIndexBuffer); + simulateInitializationSync(indexDataBuffer.data(), backendIndexBuffer); positionAttribute->setBuffer(dataBuffer.data()); positionAttribute->setName(Qt3DRender::QAttribute::defaultPositionAttributeName()); @@ -311,20 +311,20 @@ private Q_SLOTS: Attribute *backendAttribute = nodeManagers->attributeManager()->getOrCreateResource(positionAttribute->id()); backendAttribute->setRenderer(&renderer); - simulateInitialization(positionAttribute.data(), backendAttribute); + simulateInitializationSync(positionAttribute.data(), backendAttribute); Attribute *backendIndexAttribute = nodeManagers->attributeManager()->getOrCreateResource(indexAttribute->id()); backendIndexAttribute->setRenderer(&renderer); - simulateInitialization(indexAttribute.data(), backendIndexAttribute); + simulateInitializationSync(indexAttribute.data(), backendIndexAttribute); Geometry *backendGeometry = nodeManagers->geometryManager()->getOrCreateResource(geometry->id()); backendGeometry->setRenderer(&renderer); - simulateInitialization(geometry, backendGeometry); + simulateInitializationSync(geometry, backendGeometry); GeometryRenderer *backendRenderer = nodeManagers->geometryRendererManager()->getOrCreateResource(geometryRenderer->id()); backendRenderer->setRenderer(&renderer); backendRenderer->setManager(nodeManagers->geometryRendererManager()); - simulateInitialization(geometryRenderer.data(), backendRenderer); + simulateInitializationSync(geometryRenderer.data(), backendRenderer); // WHEN visitor.apply(backendRenderer, Qt3DCore::QNodeId()); @@ -374,7 +374,7 @@ private Q_SLOTS: Buffer *backendBuffer = nodeManagers->bufferManager()->getOrCreateResource(dataBuffer->id()); backendBuffer->setRenderer(&renderer); backendBuffer->setManager(nodeManagers->bufferManager()); - simulateInitialization(dataBuffer.data(), backendBuffer); + simulateInitializationSync(dataBuffer.data(), backendBuffer); positionAttribute->setBuffer(dataBuffer.data()); positionAttribute->setName(Qt3DRender::QAttribute::defaultPositionAttributeName()); @@ -391,16 +391,16 @@ private Q_SLOTS: Attribute *backendAttribute = nodeManagers->attributeManager()->getOrCreateResource(positionAttribute->id()); backendAttribute->setRenderer(&renderer); - simulateInitialization(positionAttribute.data(), backendAttribute); + simulateInitializationSync(positionAttribute.data(), backendAttribute); Geometry *backendGeometry = nodeManagers->geometryManager()->getOrCreateResource(geometry->id()); backendGeometry->setRenderer(&renderer); - simulateInitialization(geometry, backendGeometry); + simulateInitializationSync(geometry, backendGeometry); GeometryRenderer *backendRenderer = nodeManagers->geometryRendererManager()->getOrCreateResource(geometryRenderer->id()); backendRenderer->setRenderer(&renderer); backendRenderer->setManager(nodeManagers->geometryRendererManager()); - simulateInitialization(geometryRenderer.data(), backendRenderer); + simulateInitializationSync(geometryRenderer.data(), backendRenderer); // WHEN visitor.apply(backendRenderer, Qt3DCore::QNodeId()); @@ -451,7 +451,7 @@ private Q_SLOTS: Buffer *backendBuffer = nodeManagers->bufferManager()->getOrCreateResource(dataBuffer->id()); backendBuffer->setRenderer(&renderer); backendBuffer->setManager(nodeManagers->bufferManager()); - simulateInitialization(dataBuffer.data(), backendBuffer); + simulateInitializationSync(dataBuffer.data(), backendBuffer); QByteArray indexData; indexData.resize(sizeof(uint) * 3 * 4); @@ -473,7 +473,7 @@ private Q_SLOTS: Buffer *backendIndexBuffer = nodeManagers->bufferManager()->getOrCreateResource(indexDataBuffer->id()); backendIndexBuffer->setRenderer(&renderer); backendIndexBuffer->setManager(nodeManagers->bufferManager()); - simulateInitialization(indexDataBuffer.data(), backendIndexBuffer); + simulateInitializationSync(indexDataBuffer.data(), backendIndexBuffer); positionAttribute->setBuffer(dataBuffer.data()); positionAttribute->setName(Qt3DRender::QAttribute::defaultPositionAttributeName()); @@ -497,20 +497,20 @@ private Q_SLOTS: Attribute *backendAttribute = nodeManagers->attributeManager()->getOrCreateResource(positionAttribute->id()); backendAttribute->setRenderer(&renderer); - simulateInitialization(positionAttribute.data(), backendAttribute); + simulateInitializationSync(positionAttribute.data(), backendAttribute); Attribute *backendIndexAttribute = nodeManagers->attributeManager()->getOrCreateResource(indexAttribute->id()); backendIndexAttribute->setRenderer(&renderer); - simulateInitialization(indexAttribute.data(), backendIndexAttribute); + simulateInitializationSync(indexAttribute.data(), backendIndexAttribute); Geometry *backendGeometry = nodeManagers->geometryManager()->getOrCreateResource(geometry->id()); backendGeometry->setRenderer(&renderer); - simulateInitialization(geometry, backendGeometry); + simulateInitializationSync(geometry, backendGeometry); GeometryRenderer *backendRenderer = nodeManagers->geometryRendererManager()->getOrCreateResource(geometryRenderer->id()); backendRenderer->setRenderer(&renderer); backendRenderer->setManager(nodeManagers->geometryRendererManager()); - simulateInitialization(geometryRenderer.data(), backendRenderer); + simulateInitializationSync(geometryRenderer.data(), backendRenderer); // WHEN visitor.apply(backendRenderer, Qt3DCore::QNodeId()); @@ -563,7 +563,7 @@ private Q_SLOTS: Buffer *backendBuffer = nodeManagers->bufferManager()->getOrCreateResource(dataBuffer->id()); backendBuffer->setRenderer(&renderer); backendBuffer->setManager(nodeManagers->bufferManager()); - simulateInitialization(dataBuffer.data(), backendBuffer); + simulateInitializationSync(dataBuffer.data(), backendBuffer); positionAttribute->setBuffer(dataBuffer.data()); positionAttribute->setName(Qt3DRender::QAttribute::defaultPositionAttributeName()); @@ -580,16 +580,16 @@ private Q_SLOTS: Attribute *backendAttribute = nodeManagers->attributeManager()->getOrCreateResource(positionAttribute->id()); backendAttribute->setRenderer(&renderer); - simulateInitialization(positionAttribute.data(), backendAttribute); + simulateInitializationSync(positionAttribute.data(), backendAttribute); Geometry *backendGeometry = nodeManagers->geometryManager()->getOrCreateResource(geometry->id()); backendGeometry->setRenderer(&renderer); - simulateInitialization(geometry, backendGeometry); + simulateInitializationSync(geometry, backendGeometry); GeometryRenderer *backendRenderer = nodeManagers->geometryRendererManager()->getOrCreateResource(geometryRenderer->id()); backendRenderer->setRenderer(&renderer); backendRenderer->setManager(nodeManagers->geometryRendererManager()); - simulateInitialization(geometryRenderer.data(), backendRenderer); + simulateInitializationSync(geometryRenderer.data(), backendRenderer); // WHEN visitor.apply(backendRenderer, Qt3DCore::QNodeId()); @@ -640,7 +640,7 @@ private Q_SLOTS: Buffer *backendBuffer = nodeManagers->bufferManager()->getOrCreateResource(dataBuffer->id()); backendBuffer->setRenderer(&renderer); backendBuffer->setManager(nodeManagers->bufferManager()); - simulateInitialization(dataBuffer.data(), backendBuffer); + simulateInitializationSync(dataBuffer.data(), backendBuffer); QByteArray indexData; indexData.resize(sizeof(uint) * 3 * 2); @@ -656,7 +656,7 @@ private Q_SLOTS: Buffer *backendIndexBuffer = nodeManagers->bufferManager()->getOrCreateResource(indexDataBuffer->id()); backendIndexBuffer->setRenderer(&renderer); backendIndexBuffer->setManager(nodeManagers->bufferManager()); - simulateInitialization(indexDataBuffer.data(), backendIndexBuffer); + simulateInitializationSync(indexDataBuffer.data(), backendIndexBuffer); positionAttribute->setBuffer(dataBuffer.data()); positionAttribute->setName(Qt3DRender::QAttribute::defaultPositionAttributeName()); @@ -680,20 +680,20 @@ private Q_SLOTS: Attribute *backendAttribute = nodeManagers->attributeManager()->getOrCreateResource(positionAttribute->id()); backendAttribute->setRenderer(&renderer); - simulateInitialization(positionAttribute.data(), backendAttribute); + simulateInitializationSync(positionAttribute.data(), backendAttribute); Attribute *backendIndexAttribute = nodeManagers->attributeManager()->getOrCreateResource(indexAttribute->id()); backendIndexAttribute->setRenderer(&renderer); - simulateInitialization(indexAttribute.data(), backendIndexAttribute); + simulateInitializationSync(indexAttribute.data(), backendIndexAttribute); Geometry *backendGeometry = nodeManagers->geometryManager()->getOrCreateResource(geometry->id()); backendGeometry->setRenderer(&renderer); - simulateInitialization(geometry, backendGeometry); + simulateInitializationSync(geometry, backendGeometry); GeometryRenderer *backendRenderer = nodeManagers->geometryRendererManager()->getOrCreateResource(geometryRenderer->id()); backendRenderer->setRenderer(&renderer); backendRenderer->setManager(nodeManagers->geometryRendererManager()); - simulateInitialization(geometryRenderer.data(), backendRenderer); + simulateInitializationSync(geometryRenderer.data(), backendRenderer); // WHEN visitor.apply(backendRenderer, Qt3DCore::QNodeId()); @@ -742,7 +742,7 @@ private Q_SLOTS: Buffer *backendBuffer = nodeManagers->bufferManager()->getOrCreateResource(dataBuffer->id()); backendBuffer->setRenderer(&renderer); backendBuffer->setManager(nodeManagers->bufferManager()); - simulateInitialization(dataBuffer.data(), backendBuffer); + simulateInitializationSync(dataBuffer.data(), backendBuffer); positionAttribute->setBuffer(dataBuffer.data()); positionAttribute->setName(Qt3DRender::QAttribute::defaultPositionAttributeName()); @@ -759,16 +759,16 @@ private Q_SLOTS: Attribute *backendAttribute = nodeManagers->attributeManager()->getOrCreateResource(positionAttribute->id()); backendAttribute->setRenderer(&renderer); - simulateInitialization(positionAttribute.data(), backendAttribute); + simulateInitializationSync(positionAttribute.data(), backendAttribute); Geometry *backendGeometry = nodeManagers->geometryManager()->getOrCreateResource(geometry->id()); backendGeometry->setRenderer(&renderer); - simulateInitialization(geometry, backendGeometry); + simulateInitializationSync(geometry, backendGeometry); GeometryRenderer *backendRenderer = nodeManagers->geometryRendererManager()->getOrCreateResource(geometryRenderer->id()); backendRenderer->setRenderer(&renderer); backendRenderer->setManager(nodeManagers->geometryRendererManager()); - simulateInitialization(geometryRenderer.data(), backendRenderer); + simulateInitializationSync(geometryRenderer.data(), backendRenderer); // WHEN visitor.apply(backendRenderer, Qt3DCore::QNodeId()); @@ -816,7 +816,7 @@ private Q_SLOTS: Buffer *backendBuffer = nodeManagers->bufferManager()->getOrCreateResource(dataBuffer->id()); backendBuffer->setRenderer(&renderer); backendBuffer->setManager(nodeManagers->bufferManager()); - simulateInitialization(dataBuffer.data(), backendBuffer); + simulateInitializationSync(dataBuffer.data(), backendBuffer); QByteArray indexData; indexData.resize(sizeof(uint) * 3 * 4); @@ -839,7 +839,7 @@ private Q_SLOTS: Buffer *backendIndexBuffer = nodeManagers->bufferManager()->getOrCreateResource(indexDataBuffer->id()); backendIndexBuffer->setRenderer(&renderer); backendIndexBuffer->setManager(nodeManagers->bufferManager()); - simulateInitialization(indexDataBuffer.data(), backendIndexBuffer); + simulateInitializationSync(indexDataBuffer.data(), backendIndexBuffer); positionAttribute->setBuffer(dataBuffer.data()); positionAttribute->setName(Qt3DRender::QAttribute::defaultPositionAttributeName()); @@ -863,20 +863,20 @@ private Q_SLOTS: Attribute *backendAttribute = nodeManagers->attributeManager()->getOrCreateResource(positionAttribute->id()); backendAttribute->setRenderer(&renderer); - simulateInitialization(positionAttribute.data(), backendAttribute); + simulateInitializationSync(positionAttribute.data(), backendAttribute); Attribute *backendIndexAttribute = nodeManagers->attributeManager()->getOrCreateResource(indexAttribute->id()); backendIndexAttribute->setRenderer(&renderer); - simulateInitialization(indexAttribute.data(), backendIndexAttribute); + simulateInitializationSync(indexAttribute.data(), backendIndexAttribute); Geometry *backendGeometry = nodeManagers->geometryManager()->getOrCreateResource(geometry->id()); backendGeometry->setRenderer(&renderer); - simulateInitialization(geometry, backendGeometry); + simulateInitializationSync(geometry, backendGeometry); GeometryRenderer *backendRenderer = nodeManagers->geometryRendererManager()->getOrCreateResource(geometryRenderer->id()); backendRenderer->setRenderer(&renderer); backendRenderer->setManager(nodeManagers->geometryRendererManager()); - simulateInitialization(geometryRenderer.data(), backendRenderer); + simulateInitializationSync(geometryRenderer.data(), backendRenderer); // WHEN visitor.apply(backendRenderer, Qt3DCore::QNodeId()); @@ -936,7 +936,7 @@ private Q_SLOTS: Buffer *backendBuffer = nodeManagers->bufferManager()->getOrCreateResource(dataBuffer->id()); backendBuffer->setRenderer(&renderer); backendBuffer->setManager(nodeManagers->bufferManager()); - simulateInitialization(dataBuffer.data(), backendBuffer); + simulateInitializationSync(dataBuffer.data(), backendBuffer); positionAttribute->setBuffer(dataBuffer.data()); positionAttribute->setName(Qt3DRender::QAttribute::defaultPositionAttributeName()); @@ -953,16 +953,16 @@ private Q_SLOTS: Attribute *backendAttribute = nodeManagers->attributeManager()->getOrCreateResource(positionAttribute->id()); backendAttribute->setRenderer(&renderer); - simulateInitialization(positionAttribute.data(), backendAttribute); + simulateInitializationSync(positionAttribute.data(), backendAttribute); Geometry *backendGeometry = nodeManagers->geometryManager()->getOrCreateResource(geometry->id()); backendGeometry->setRenderer(&renderer); - simulateInitialization(geometry, backendGeometry); + simulateInitializationSync(geometry, backendGeometry); GeometryRenderer *backendRenderer = nodeManagers->geometryRendererManager()->getOrCreateResource(geometryRenderer->id()); backendRenderer->setRenderer(&renderer); backendRenderer->setManager(nodeManagers->geometryRendererManager()); - simulateInitialization(geometryRenderer.data(), backendRenderer); + simulateInitializationSync(geometryRenderer.data(), backendRenderer); // WHEN visitor.apply(backendRenderer, Qt3DCore::QNodeId()); @@ -1012,7 +1012,7 @@ private Q_SLOTS: Buffer *backendBuffer = nodeManagers->bufferManager()->getOrCreateResource(dataBuffer->id()); backendBuffer->setRenderer(&renderer); backendBuffer->setManager(nodeManagers->bufferManager()); - simulateInitialization(dataBuffer.data(), backendBuffer); + simulateInitializationSync(dataBuffer.data(), backendBuffer); QByteArray indexData; indexData.resize(sizeof(uint) * 8); @@ -1030,7 +1030,7 @@ private Q_SLOTS: Buffer *backendIndexBuffer = nodeManagers->bufferManager()->getOrCreateResource(indexDataBuffer->id()); backendIndexBuffer->setRenderer(&renderer); backendIndexBuffer->setManager(nodeManagers->bufferManager()); - simulateInitialization(indexDataBuffer.data(), backendIndexBuffer); + simulateInitializationSync(indexDataBuffer.data(), backendIndexBuffer); positionAttribute->setBuffer(dataBuffer.data()); positionAttribute->setName(Qt3DRender::QAttribute::defaultPositionAttributeName()); @@ -1054,20 +1054,20 @@ private Q_SLOTS: Attribute *backendAttribute = nodeManagers->attributeManager()->getOrCreateResource(positionAttribute->id()); backendAttribute->setRenderer(&renderer); - simulateInitialization(positionAttribute.data(), backendAttribute); + simulateInitializationSync(positionAttribute.data(), backendAttribute); Attribute *backendIndexAttribute = nodeManagers->attributeManager()->getOrCreateResource(indexAttribute->id()); backendIndexAttribute->setRenderer(&renderer); - simulateInitialization(indexAttribute.data(), backendIndexAttribute); + simulateInitializationSync(indexAttribute.data(), backendIndexAttribute); Geometry *backendGeometry = nodeManagers->geometryManager()->getOrCreateResource(geometry->id()); backendGeometry->setRenderer(&renderer); - simulateInitialization(geometry, backendGeometry); + simulateInitializationSync(geometry, backendGeometry); GeometryRenderer *backendRenderer = nodeManagers->geometryRendererManager()->getOrCreateResource(geometryRenderer->id()); backendRenderer->setRenderer(&renderer); backendRenderer->setManager(nodeManagers->geometryRendererManager()); - simulateInitialization(geometryRenderer.data(), backendRenderer); + simulateInitializationSync(geometryRenderer.data(), backendRenderer); // WHEN visitor.apply(backendRenderer, Qt3DCore::QNodeId()); |