summaryrefslogtreecommitdiffstats
path: root/tests/auto
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto')
-rw-r--r--tests/auto/core/common/qbackendnodetester.cpp2
-rw-r--r--tests/auto/core/matrix4x4_sse/tst_matrix4x4_sse.cpp4
-rw-r--r--tests/auto/core/qchangearbiter/qchangearbiter.pro2
-rw-r--r--tests/auto/core/qchangearbiter/tst_qchangearbiter.cpp810
-rw-r--r--tests/auto/core/threadpooler/tst_threadpooler.cpp2
-rw-r--r--tests/auto/core/vector3d_sse/tst_vector3d_sse.cpp4
-rw-r--r--tests/auto/core/vector4d_sse/tst_vector4d_sse.cpp5
-rw-r--r--tests/auto/extras/qtext2dentity/tst_qtext2dentity.cpp2
-rw-r--r--tests/auto/input/commons/commons.pri2
-rw-r--r--tests/auto/input/commons/testdevice.cpp31
-rw-r--r--tests/auto/quick3d/dynamicnodecreation/BLACKLIST4
-rw-r--r--tests/auto/quick3d/quick3dnodeinstantiator/data/createMultipleAsync.qml13
-rw-r--r--tests/auto/quick3d/quick3dnodeinstantiator/tst_quick3dnodeinstantiator.cpp46
-rw-r--r--tests/auto/render/aspect/tst_aspect.cpp4
-rw-r--r--tests/auto/render/computecommand/tst_computecommand.cpp16
-rw-r--r--tests/auto/render/geometry/tst_geometry.cpp10
-rw-r--r--tests/auto/render/geometryrenderer/tst_geometryrenderer.cpp2
-rw-r--r--tests/auto/render/meshfunctors/tst_meshfunctors.cpp6
-rw-r--r--tests/auto/render/objectpicker/tst_objectpicker.cpp15
-rw-r--r--tests/auto/render/opengl/graphicshelpergl4/BLACKLIST6
-rw-r--r--tests/auto/render/opengl/renderviews/tst_renderviews.cpp62
-rw-r--r--tests/auto/render/pickboundingvolumejob/pickboundingvolumejob.qrc2
-rw-r--r--tests/auto/render/pickboundingvolumejob/testscene_layerfilter.qml162
-rw-r--r--tests/auto/render/pickboundingvolumejob/testscene_nested_layerfilter.qml233
-rw-r--r--tests/auto/render/pickboundingvolumejob/tst_pickboundingvolumejob.cpp391
-rw-r--r--tests/auto/render/qgeometry/tst_qgeometry.cpp25
-rw-r--r--tests/auto/render/qgeometryrenderer/tst_qgeometryrenderer.cpp2
-rw-r--r--tests/auto/render/qmlscenereader/qmlscenereader.cpp2
-rw-r--r--tests/auto/render/qmlscenereader/qmlscenereader.h5
-rw-r--r--tests/auto/render/raycasting/BLACKLIST3
-rw-r--r--tests/auto/render/raycastingjob/tst_raycastingjob.cpp5
-rw-r--r--tests/auto/render/shadergraph/qshadernodes/tst_qshadernodes.cpp4
-rw-r--r--tests/auto/shared/util.cpp2
33 files changed, 1065 insertions, 819 deletions
diff --git a/tests/auto/core/common/qbackendnodetester.cpp b/tests/auto/core/common/qbackendnodetester.cpp
index 13f4683d9..0bec5e5dd 100644
--- a/tests/auto/core/common/qbackendnodetester.cpp
+++ b/tests/auto/core/common/qbackendnodetester.cpp
@@ -84,3 +84,5 @@ QNodeCreatedChangeBasePtr QBackendNodeTester::creationChange(QNode *frontend) co
} // namespace Qt3DCore
QT_END_NAMESPACE
+
+#include "moc_qbackendnodetester.cpp"
diff --git a/tests/auto/core/matrix4x4_sse/tst_matrix4x4_sse.cpp b/tests/auto/core/matrix4x4_sse/tst_matrix4x4_sse.cpp
index dccf90d10..9bd3afc83 100644
--- a/tests/auto/core/matrix4x4_sse/tst_matrix4x4_sse.cpp
+++ b/tests/auto/core/matrix4x4_sse/tst_matrix4x4_sse.cpp
@@ -29,7 +29,9 @@
#include <QtTest/QtTest>
#include <Qt3DCore/private/matrix4x4_sse_p.h>
+#ifdef QT_COMPILER_SUPPORTS_SSE2
using namespace Qt3DCore;
+#endif
class tst_Matrix4x4_SSE: public QObject
{
@@ -37,6 +39,7 @@ class tst_Matrix4x4_SSE: public QObject
private Q_SLOTS:
+#ifdef QT_COMPILER_SUPPORTS_SSE2
void defaultConstruction()
{
// GIVEN
@@ -520,6 +523,7 @@ private Q_SLOTS:
QCOMPARE(resultingVec.toQVector3D(), tmpMat.mapVector(tmpVec3));
}
}
+#endif // QT_COMPILER_SUPPORTS_SSE2
};
QTEST_MAIN(tst_Matrix4x4_SSE)
diff --git a/tests/auto/core/qchangearbiter/qchangearbiter.pro b/tests/auto/core/qchangearbiter/qchangearbiter.pro
index 64a7b36e7..4628bf6cd 100644
--- a/tests/auto/core/qchangearbiter/qchangearbiter.pro
+++ b/tests/auto/core/qchangearbiter/qchangearbiter.pro
@@ -6,3 +6,5 @@ QT += testlib core core-private 3dcore 3dcore-private
SOURCES += \
tst_qchangearbiter.cpp
+
+include(../common/common.pri)
diff --git a/tests/auto/core/qchangearbiter/tst_qchangearbiter.cpp b/tests/auto/core/qchangearbiter/tst_qchangearbiter.cpp
index 3e9b24408..9f79e4272 100644
--- a/tests/auto/core/qchangearbiter/tst_qchangearbiter.cpp
+++ b/tests/auto/core/qchangearbiter/tst_qchangearbiter.cpp
@@ -31,17 +31,7 @@
QT_WARNING_DISABLE_DEPRECATED
#include <QtTest/QTest>
-#include <Qt3DCore/private/qobserverinterface_p.h>
-#include <Qt3DCore/private/qobservableinterface_p.h>
#include <Qt3DCore/private/qchangearbiter_p.h>
-#include <Qt3DCore/private/qpostman_p.h>
-#include <Qt3DCore/qscenechange.h>
-#include <Qt3DCore/qcomponentaddedchange.h>
-#include <Qt3DCore/qcomponentremovedchange.h>
-#include <Qt3DCore/qpropertyupdatedchange.h>
-#include <Qt3DCore/qpropertynodeaddedchange.h>
-#include <Qt3DCore/qpropertynoderemovedchange.h>
-#include <Qt3DCore/qscenechange.h>
#include <Qt3DCore/private/qscene_p.h>
#include <Qt3DCore/qnode.h>
#include <Qt3DCore/qentity.h>
@@ -51,95 +41,14 @@ QT_WARNING_DISABLE_DEPRECATED
#include <Qt3DCore/private/qbackendnode_p.h>
#include <QThread>
#include <QWaitCondition>
+#include "testpostmanarbiter.h"
class tst_QChangeArbiter : public QObject
{
Q_OBJECT
private slots:
- void registerObservers();
- void registerSceneObserver();
- void unregisterObservers();
- void unregisterSceneObservers();
- void distributeFrontendChanges();
- void distributePropertyChanges();
- void distributeBackendChanges();
-};
-
-class AllChangesChange : public Qt3DCore::QSceneChange
-{
-public:
- AllChangesChange(Qt3DCore::QNodeId subjectId)
- : Qt3DCore::QSceneChange(Qt3DCore::AllChanges, subjectId)
- {
- }
-};
-
-class tst_Node : public Qt3DCore::QEntity
-{
-public:
- explicit tst_Node(Qt3DCore::QNode *parent = 0) : Qt3DCore::QEntity(parent)
- {}
-
- void sendNodeAddedNotification(QNode *node)
- {
- Qt3DCore::QPropertyNodeAddedChangePtr e(new Qt3DCore::QPropertyNodeAddedChange(id(), node));
- e->setPropertyName("PropertyValueAdded");
- Qt3DCore::QNodePrivate::get(this)->notifyObservers(e);
- }
-
- void sendNodeRemovedNotification(QNode *node)
- {
- Qt3DCore::QPropertyNodeRemovedChangePtr e(new Qt3DCore::QPropertyNodeRemovedChange(id(), node));
- e->setPropertyName("PropertyValueRemoved");
- Qt3DCore::QNodePrivate::get(this)->notifyObservers(e);
- }
-
- void sendNodeUpdatedNotification()
- {
- Qt3DCore::QPropertyUpdatedChangePtr e(new Qt3DCore::QPropertyUpdatedChange(id()));
- e->setPropertyName("PropertyUpdated");
- Qt3DCore::QNodePrivate::get(this)->notifyObservers(e);
- }
-
- void sendComponentAddedNotification(Qt3DCore::QComponent *component)
- {
- Qt3DCore::QComponentAddedChangePtr e(new Qt3DCore::QComponentAddedChange(this, component));
- Qt3DCore::QNodePrivate::get(this)->notifyObservers(e);
- }
-
- void sendComponentRemovedNotification(Qt3DCore::QComponent *component)
- {
- Qt3DCore::QComponentRemovedChangePtr e(new Qt3DCore::QComponentRemovedChange(this, component));
- Qt3DCore::QNodePrivate::get(this)->notifyObservers(e);
- }
-
- void sendAllChangesNotification()
- {
- Qt3DCore::QSceneChangePtr e(new AllChangesChange(id()));
- Qt3DCore::QNodePrivate::get(this)->notifyObservers(e);
- }
-
- void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &change) override
- {
- QVERIFY(!change.isNull());
- m_lastChanges << change;
- }
-
- Qt3DCore::QSceneChangePtr lastChange() const
- {
- if (m_lastChanges.isEmpty())
- return Qt3DCore::QSceneChangePtr();
- return m_lastChanges.last();
- }
-
- QList<Qt3DCore::QSceneChangePtr> lastChanges() const
- {
- return m_lastChanges;
- }
-
-private:
- QList<Qt3DCore::QSceneChangePtr> m_lastChanges;
+ void recordsDirtyNodes();
};
// used to test property change notifications
@@ -180,722 +89,51 @@ private:
float m_prop2 = 0.0f;
};
-class tst_SimpleObserver : public Qt3DCore::QObserverInterface
-{
-public:
-
- // QObserverInterface interface
- void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) override
- {
- QVERIFY(!e.isNull());
- m_lastChanges.append(e);
- }
-
- Qt3DCore::QSceneChangePtr lastChange() const
- {
- if (m_lastChanges.isEmpty())
- return Qt3DCore::QSceneChangePtr();
- return m_lastChanges.last();
- }
-
- QList<Qt3DCore::QSceneChangePtr> lastChanges() const
- {
- return m_lastChanges;
- }
-
- void clear()
- {
- m_lastChanges.clear();
- }
-
-private:
- QList<Qt3DCore::QSceneChangePtr> m_lastChanges;
-};
-
-class tst_BackendObserverObservable : public Qt3DCore::QBackendNode
-{
-public:
-
- tst_BackendObserverObservable()
- : Qt3DCore::QBackendNode(ReadWrite)
- {}
-
- // QObserverInterface interface
- void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) override
- {
- QVERIFY(!e.isNull());
- m_lastChanges << e;
- m_targetId = e->subjectId();
- }
-
- // should be called in thread
- void sendReply()
- {
- Qt3DCore::QPropertyUpdatedChangePtr reply;
- reply = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(m_targetId);
- reply->setDeliveryFlags(Qt3DCore::QSceneChange::DeliverToAll);
- reply->setPropertyName("Reply");
- notifyObservers(reply);
- qDebug() << Q_FUNC_INFO;
- }
-
- Qt3DCore::QSceneChangePtr lastChange() const
- {
- if (m_lastChanges.isEmpty())
- return Qt3DCore::QSceneChangePtr();
- return m_lastChanges.last();
- }
-
- QList<Qt3DCore::QSceneChangePtr> lastChanges() const
- {
- return m_lastChanges;
- }
-
- void clear()
- {
- m_lastChanges.clear();
- }
-
-private:
- QList<Qt3DCore::QSceneChangePtr> m_lastChanges;
- Qt3DCore::QNodeId m_targetId;
-
-};
-
-class ThreadedAnswer : public QThread
-{
- Q_OBJECT
-public:
- ThreadedAnswer(Qt3DCore::QChangeArbiter *arbiter, tst_BackendObserverObservable *backend)
- : QThread()
- , m_arbiter(arbiter)
- , m_backendObs(backend)
- {}
-
- ~ThreadedAnswer() { qDebug() << this; }
-
- void run() override
- {
- // create backend change queue on QChangeArbiter
- Qt3DCore::QChangeArbiter::createThreadLocalChangeQueue(m_arbiter);
- m_backendObs->sendReply();
- // gives time for other threads to start waiting
- QThread::currentThread()->sleep(1);
- // wake waiting condition
- m_waitingForReplyToBeSent.wakeOne();
- exec();
- Qt3DCore::QChangeArbiter::destroyThreadLocalChangeQueue(m_arbiter);
- }
-
- QWaitCondition *waitingCondition() { return &m_waitingForReplyToBeSent; }
-
-private:
- Qt3DCore::QChangeArbiter *m_arbiter;
- tst_BackendObserverObservable *m_backendObs;
- QWaitCondition m_waitingForReplyToBeSent;
-};
-
-class tst_PostManObserver : public Qt3DCore::QAbstractPostman
-{
-public:
-
- tst_PostManObserver()
- : m_sceneInterface(nullptr)
- , m_allowFrontendNotifications(false)
- {}
-
- void setScene(Qt3DCore::QScene *scene) final
- {
- m_sceneInterface = scene;
- }
-
- void setAllowFrontendNotifications(bool allow)
- {
- m_allowFrontendNotifications = allow;
- }
-
- // QObserverInterface interface
- void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e)
- {
- QVERIFY(!e.isNull());
- Qt3DCore::QPropertyUpdatedChangePtr change = qSharedPointerDynamicCast<Qt3DCore::QPropertyUpdatedChange>(e);
- QVERIFY(!change.isNull());
- Qt3DCore::QNode *targetNode = m_sceneInterface->lookupNode(change->subjectId());
- QVERIFY(targetNode != nullptr);
- m_lastChanges << e;
- }
-
- Qt3DCore::QSceneChangePtr lastChange() const
- {
- if (m_lastChanges.isEmpty())
- return Qt3DCore::QSceneChangePtr();
- return m_lastChanges.last();
- }
-
- QList<Qt3DCore::QSceneChangePtr> lastChanges() const
- {
- return m_lastChanges;
- }
-
- void notifyBackend(const Qt3DCore::QSceneChangePtr &e) final
- {
- m_sceneInterface->arbiter()->sceneChangeEventWithLock(e);
- }
-
- bool shouldNotifyFrontend(const Qt3DCore::QSceneChangePtr &)
- {
- return m_allowFrontendNotifications;
- }
-
-private:
- Qt3DCore::QScene *m_sceneInterface;
- QList<Qt3DCore::QSceneChangePtr> m_lastChanges;
- bool m_allowFrontendNotifications;
-};
-
-void tst_QChangeArbiter::registerObservers()
-{
- // GIVEN
- QScopedPointer<Qt3DCore::QChangeArbiter> arbiter(new Qt3DCore::QChangeArbiter());
- QScopedPointer<Qt3DCore::QScene> scene(new Qt3DCore::QScene());
- QScopedPointer<Qt3DCore::QAbstractPostman> postman(new tst_PostManObserver);
- arbiter->setPostman(postman.data());
- arbiter->setScene(scene.data());
- postman->setScene(scene.data());
- scene->setArbiter(arbiter.data());
- // Replaces initialize as we have no JobManager in this case
- Qt3DCore::QChangeArbiter::createThreadLocalChangeQueue(arbiter.data());
-
- // WHEN
- Qt3DCore::QNode *root = new tst_Node();
- Qt3DCore::QNode *child = new tst_Node();
- Qt3DCore::QNodePrivate::get(root)->setScene(scene.data());
- scene->addObservable(root);
-
- QList<tst_SimpleObserver *> observers;
- for (int i = 0; i < 5; i++) {
- tst_SimpleObserver *s = new tst_SimpleObserver();
- arbiter->registerObserver(s, root->id());
- observers << s;
- }
-
- arbiter->syncChanges();
-
- // THEN
- for (tst_SimpleObserver *o : qAsConst(observers))
- QVERIFY(o->lastChange().isNull());
-
- child->setParent(root);
- arbiter->syncChanges();
- for (tst_SimpleObserver *o : qAsConst(observers)) {
- QCOMPARE(o->lastChanges().size(), 1);
- QVERIFY(o->lastChanges().last()->type() == Qt3DCore::PropertyValueAdded);
- }
-
- Qt3DCore::QChangeArbiter::destroyThreadLocalChangeQueue(arbiter.data());
-}
-
-void tst_QChangeArbiter::registerSceneObserver()
-{
- // GIVEN
- Qt3DCore::QComponent dummyComponent;
- QScopedPointer<Qt3DCore::QChangeArbiter> arbiter(new Qt3DCore::QChangeArbiter());
- QScopedPointer<Qt3DCore::QScene> scene(new Qt3DCore::QScene());
- QScopedPointer<Qt3DCore::QAbstractPostman> postman(new tst_PostManObserver);
- arbiter->setPostman(postman.data());
- arbiter->setScene(scene.data());
- postman->setScene(scene.data());
- scene->setArbiter(arbiter.data());
- // Replaces initialize as we have no JobManager in this case
- Qt3DCore::QChangeArbiter::createThreadLocalChangeQueue(arbiter.data());
-
- // WHEN
- tst_Node *root = new tst_Node();
- Qt3DCore::QNode *child = new tst_Node();
- Qt3DCore::QNodePrivate::get(root)->setScene(scene.data());
- Qt3DCore::QNodePrivate::get(root)->m_hasBackendNode = true;
- scene->addObservable(root);
-
- QList<tst_SimpleObserver *> observers;
- for (int i = 0; i < 5; i++) {
- tst_SimpleObserver *s = new tst_SimpleObserver();
- arbiter->registerObserver(s, root->id());
- observers << s;
- }
-
- arbiter->syncChanges();
-
- // THEN
- for (tst_SimpleObserver *o : qAsConst(observers))
- QVERIFY(o->lastChange().isNull());
-
- // WHEN
- child->setParent(root);
- arbiter->syncChanges();
-
- // THEN
- for (tst_SimpleObserver *o : qAsConst(observers)) {
- QVERIFY(!o->lastChange().isNull());
- QVERIFY(o->lastChange()->type() == Qt3DCore::PropertyValueAdded);
- }
-
- // WHEN
- root->sendComponentAddedNotification(&dummyComponent);
- arbiter->syncChanges();
-
- // THEN
- for (tst_SimpleObserver *o : qAsConst(observers)) {
- QVERIFY(!o->lastChange().isNull());
- QVERIFY(o->lastChange()->type() == Qt3DCore::ComponentAdded);
- }
-
- Qt3DCore::QChangeArbiter::destroyThreadLocalChangeQueue(arbiter.data());
-}
-
-void tst_QChangeArbiter::unregisterObservers()
-{
- // GIVEN
- QScopedPointer<Qt3DCore::QChangeArbiter> arbiter(new Qt3DCore::QChangeArbiter());
- QScopedPointer<Qt3DCore::QScene> scene(new Qt3DCore::QScene());
- QScopedPointer<Qt3DCore::QAbstractPostman> postman(new tst_PostManObserver);
- arbiter->setPostman(postman.data());
- arbiter->setScene(scene.data());
- postman->setScene(scene.data());
- scene->setArbiter(arbiter.data());
- // Replaces initialize as we have no JobManager in this case
- Qt3DCore::QChangeArbiter::createThreadLocalChangeQueue(arbiter.data());
-
- // WHEN
- tst_Node *root = new tst_Node();
- Qt3DCore::QNode *child = new tst_Node();
- Qt3DCore::QNodePrivate::get(root)->setScene(scene.data());
- scene->addObservable(root);
-
- QList<tst_SimpleObserver *> observers;
- for (int i = 0; i < 5; i++) {
- tst_SimpleObserver *s = new tst_SimpleObserver();
- arbiter->registerObserver(s, root->id());
- observers << s;
- }
-
- arbiter->syncChanges();
-
- // THEN
- for (tst_SimpleObserver *o : qAsConst(observers))
- QVERIFY(o->lastChange().isNull());
-
- // WHEN
- child->setParent(root);
- arbiter->syncChanges();
-
- // THEN
- for (tst_SimpleObserver *o : qAsConst(observers)) {
- QVERIFY(!o->lastChange().isNull());
- QVERIFY(o->lastChange()->type() == Qt3DCore::PropertyValueAdded);
- }
-
- // WHEN
- for (tst_SimpleObserver *o : qAsConst(observers))
- arbiter->unregisterObserver(o, root->id());
-
- root->sendAllChangesNotification();
- arbiter->syncChanges();
-
- // THEN
- for (tst_SimpleObserver *o : qAsConst(observers)) {
- QVERIFY(!o->lastChange().isNull());
- QVERIFY(o->lastChange()->type() == Qt3DCore::PropertyValueAdded);
- }
-
- Qt3DCore::QChangeArbiter::destroyThreadLocalChangeQueue(arbiter.data());
-}
-
-void tst_QChangeArbiter::unregisterSceneObservers()
-{
- // GIVEN
- Qt3DCore::QComponent dummyComponent;
- QScopedPointer<Qt3DCore::QChangeArbiter> arbiter(new Qt3DCore::QChangeArbiter());
- QScopedPointer<Qt3DCore::QScene> scene(new Qt3DCore::QScene());
- QScopedPointer<Qt3DCore::QAbstractPostman> postman(new tst_PostManObserver);
- arbiter->setPostman(postman.data());
- arbiter->setScene(scene.data());
- postman->setScene(scene.data());
- scene->setArbiter(arbiter.data());
- // Replaces initialize as we have no JobManager in this case
- Qt3DCore::QChangeArbiter::createThreadLocalChangeQueue(arbiter.data());
-
- // WHEN
- tst_Node *root = new tst_Node();
- Qt3DCore::QNode *child = new tst_Node();
- Qt3DCore::QNodePrivate::get(root)->setScene(scene.data());
- Qt3DCore::QNodePrivate::get(root)->m_hasBackendNode = true;
- Qt3DCore::QNodePrivate::get(child)->m_hasBackendNode = true;
- scene->addObservable(root);
-
- QList<tst_SimpleObserver *> observers;
- for (int i = 0; i < 5; i++) {
- tst_SimpleObserver *s = new tst_SimpleObserver();
- arbiter->registerObserver(s, root->id());
- observers << s;
- }
-
- arbiter->syncChanges();
-
- // THEN
- for (tst_SimpleObserver *o : qAsConst(observers))
- QVERIFY(o->lastChange().isNull());
-
- // WHEN
- child->setParent(root);
- arbiter->syncChanges();
-
- // THEN
- for (tst_SimpleObserver *o : qAsConst(observers)) {
- QVERIFY(!o->lastChange().isNull());
- QVERIFY(o->lastChange()->type() == Qt3DCore::PropertyValueAdded);
- }
-
- // WHEN
- root->sendComponentAddedNotification(&dummyComponent);
- arbiter->syncChanges();
-
- // THEN
- for (tst_SimpleObserver *o : qAsConst(observers)) {
- QVERIFY(!o->lastChange().isNull());
- QVERIFY(o->lastChange()->type() == Qt3DCore::ComponentAdded);
- }
-
- // WHEN
- child->setParent(Q_NODE_NULLPTR);
- arbiter->syncChanges();
-
- // THEN
- for (tst_SimpleObserver *o : qAsConst(observers)) {
- QVERIFY(!o->lastChange().isNull());
- QVERIFY(o->lastChange()->type() == Qt3DCore::PropertyValueRemoved);
- }
-
- // WHEN
- child->setParent(root);
- arbiter->syncChanges();
-
- // THEN
- for (tst_SimpleObserver *o : qAsConst(observers)) {
- QVERIFY(!o->lastChange().isNull());
- QVERIFY(o->lastChange()->type() == Qt3DCore::PropertyValueAdded);
- }
-
- Qt3DCore::QChangeArbiter::destroyThreadLocalChangeQueue(arbiter.data());
-}
-
-void tst_QChangeArbiter::distributeFrontendChanges()
-{
- // GIVEN
- Qt3DCore::QComponent dummyComponent;
- Qt3DCore::QNode dummyNode;
- QScopedPointer<Qt3DCore::QChangeArbiter> arbiter(new Qt3DCore::QChangeArbiter());
- QScopedPointer<Qt3DCore::QScene> scene(new Qt3DCore::QScene());
- QScopedPointer<Qt3DCore::QAbstractPostman> postman(new tst_PostManObserver);
- arbiter->setPostman(postman.data());
- arbiter->setScene(scene.data());
- postman->setScene(scene.data());
- scene->setArbiter(arbiter.data());
- // Replaces initialize as we have no JobManager in this case
- Qt3DCore::QChangeArbiter::createThreadLocalChangeQueue(arbiter.data());
-
- // WHEN
- tst_Node *root = new tst_Node();
- Qt3DCore::QNodePrivate::get(root)->setScene(scene.data());
- scene->addObservable(root);
-
- tst_SimpleObserver *backendAllChangedObserver = new tst_SimpleObserver();
- tst_SimpleObserver *backendNodeAddedObserver = new tst_SimpleObserver();
- tst_SimpleObserver *backendNodeRemovedObserver = new tst_SimpleObserver();
- tst_SimpleObserver *backendNodeUpdatedObserver = new tst_SimpleObserver();
- tst_SimpleObserver *backendComponentAddedObserver = new tst_SimpleObserver();
- tst_SimpleObserver *backendComponentRemovedObserver = new tst_SimpleObserver();
-
- arbiter->registerObserver(backendAllChangedObserver, root->id());
- arbiter->registerObserver(backendNodeAddedObserver, root->id(), Qt3DCore::PropertyValueAdded);
- arbiter->registerObserver(backendNodeUpdatedObserver, root->id(), Qt3DCore::PropertyUpdated);
- arbiter->registerObserver(backendNodeRemovedObserver, root->id(), Qt3DCore::PropertyValueRemoved);
- arbiter->registerObserver(backendComponentAddedObserver, root->id(), Qt3DCore::ComponentAdded);
- arbiter->registerObserver(backendComponentRemovedObserver, root->id(), Qt3DCore::ComponentRemoved);
-
- arbiter->syncChanges();
-
- // THEN
- QVERIFY(backendAllChangedObserver->lastChange().isNull());
- QVERIFY(backendNodeAddedObserver->lastChange().isNull());
- QVERIFY(backendNodeUpdatedObserver->lastChange().isNull());
- QVERIFY(backendNodeRemovedObserver->lastChange().isNull());
- QVERIFY(backendComponentAddedObserver->lastChange().isNull());
- QVERIFY(backendComponentRemovedObserver->lastChange().isNull());
-
- // WHEN
- root->sendNodeAddedNotification(&dummyNode);
- arbiter->syncChanges();
-
- // THEN
- QCOMPARE(backendAllChangedObserver->lastChanges().count(), 1);
- QCOMPARE(backendNodeAddedObserver->lastChanges().count(), 1);
- QCOMPARE(backendNodeUpdatedObserver->lastChanges().count(), 0);
- QCOMPARE(backendNodeRemovedObserver->lastChanges().count(), 0);
- QCOMPARE(backendComponentAddedObserver->lastChanges().count(), 0);
- QCOMPARE(backendComponentRemovedObserver->lastChanges().count(), 0);
-
- // WHEN
- root->sendNodeUpdatedNotification();
- arbiter->syncChanges();
-
- // THEN
- QCOMPARE(backendAllChangedObserver->lastChanges().count(), 2);
- QCOMPARE(backendNodeAddedObserver->lastChanges().count(), 1);
- QCOMPARE(backendNodeUpdatedObserver->lastChanges().count(), 1);
- QCOMPARE(backendNodeRemovedObserver->lastChanges().count(), 0);
- QCOMPARE(backendComponentAddedObserver->lastChanges().count(), 0);
- QCOMPARE(backendComponentRemovedObserver->lastChanges().count(), 0);
-
- // WHEN
- root->sendNodeRemovedNotification(&dummyNode);
- arbiter->syncChanges();
-
- // THEN
- QCOMPARE(backendAllChangedObserver->lastChanges().count(), 3);
- QCOMPARE(backendNodeAddedObserver->lastChanges().count(), 1);
- QCOMPARE(backendNodeUpdatedObserver->lastChanges().count(), 1);
- QCOMPARE(backendNodeRemovedObserver->lastChanges().count(), 1);
- QCOMPARE(backendComponentAddedObserver->lastChanges().count(), 0);
- QCOMPARE(backendComponentRemovedObserver->lastChanges().count(), 0);
-
- // WHEN
- root->sendComponentAddedNotification(&dummyComponent);
- arbiter->syncChanges();
-
- // THEN
- QCOMPARE(backendAllChangedObserver->lastChanges().count(), 4);
- QCOMPARE(backendNodeAddedObserver->lastChanges().count(), 1);
- QCOMPARE(backendNodeUpdatedObserver->lastChanges().count(), 1);
- QCOMPARE(backendNodeRemovedObserver->lastChanges().count(), 1);
- QCOMPARE(backendComponentAddedObserver->lastChanges().count(), 1);
- QCOMPARE(backendComponentRemovedObserver->lastChanges().count(), 0);
-
- // WHEN
- root->sendComponentRemovedNotification(&dummyComponent);
- arbiter->syncChanges();
-
- // THEN
- QCOMPARE(backendAllChangedObserver->lastChanges().count(), 5);
- QCOMPARE(backendNodeAddedObserver->lastChanges().count(), 1);
- QCOMPARE(backendNodeUpdatedObserver->lastChanges().count(), 1);
- QCOMPARE(backendNodeRemovedObserver->lastChanges().count(), 1);
- QCOMPARE(backendComponentAddedObserver->lastChanges().count(), 1);
- QCOMPARE(backendComponentRemovedObserver->lastChanges().count(), 1);
-
- // WHEN
- root->sendAllChangesNotification();
- arbiter->syncChanges();
-
- // THEN
- QCOMPARE(backendAllChangedObserver->lastChanges().count(), 6);
- QCOMPARE(backendNodeAddedObserver->lastChanges().count(), 2);
- QCOMPARE(backendNodeUpdatedObserver->lastChanges().count(), 2);
- QCOMPARE(backendNodeRemovedObserver->lastChanges().count(), 2);
- QCOMPARE(backendComponentAddedObserver->lastChanges().count(), 2);
- QCOMPARE(backendComponentRemovedObserver->lastChanges().count(), 2);
-
- Qt3DCore::QChangeArbiter::destroyThreadLocalChangeQueue(arbiter.data());
-}
-
-void tst_QChangeArbiter::distributePropertyChanges()
+void tst_QChangeArbiter::recordsDirtyNodes()
{
// GIVEN
- QScopedPointer<Qt3DCore::QChangeArbiter> arbiter(new Qt3DCore::QChangeArbiter());
+ QScopedPointer<TestArbiter> arbiter(new TestArbiter());
QScopedPointer<Qt3DCore::QScene> scene(new Qt3DCore::QScene());
- QScopedPointer<Qt3DCore::QAbstractPostman> postman(new tst_PostManObserver);
- arbiter->setPostman(postman.data());
- arbiter->setScene(scene.data());
- postman->setScene(scene.data());
+// arbiter->setScene(scene.data());
scene->setArbiter(arbiter.data());
- // Replaces initialize as we have no JobManager in this case
- Qt3DCore::QChangeArbiter::createThreadLocalChangeQueue(arbiter.data());
-
- // Test change notifications made to the root node:
// WHEN
- PropertyTestNode *root = new PropertyTestNode();
- Qt3DCore::QNodePrivate::get(root)->setScene(scene.data());
- Qt3DCore::QNodePrivate::get(root)->m_hasBackendNode = true;
- scene->addObservable(root);
+ auto *root = new PropertyTestNode();
+ auto *child = new PropertyTestNode(root);
- tst_SimpleObserver *rootObserver = new tst_SimpleObserver();
- arbiter->registerObserver(rootObserver, root->id());
- arbiter->syncChanges();
+ root->setProp1(883);
+ child->setProp2(1584);
// THEN
- QVERIFY(rootObserver->lastChange().isNull());
+ QCOMPARE(arbiter->dirtyNodes.size(), 0);
// WHEN
- root->setProp1(root->prop1() + 1);
+ Qt3DCore::QNodePrivate::get(root)->setArbiter(arbiter.data());
+ root->setProp1(884);
+ child->setProp2(1585);
// THEN
- auto dirtyNodes = arbiter->takeDirtyFrontEndNodes();
- QCOMPARE(dirtyNodes.size(), 1);
- QCOMPARE(dirtyNodes.front(), root);
+ QCOMPARE(arbiter->dirtyNodes.size(), 1);
+ QCOMPARE(arbiter->dirtyNodes.front(), root);
- // WHEN
- root->setProp2(root->prop2() + 1.f);
-
- // THEN
- dirtyNodes = arbiter->takeDirtyFrontEndNodes();
- QCOMPARE(dirtyNodes.size(), 1);
- QCOMPARE(dirtyNodes.front(), root);
-
- // Test change notifications made to an entity that was added to the scene
- // via QNode::setParent()
+ arbiter->dirtyNodes.clear();
// WHEN
- PropertyTestNode *setParentChild = new PropertyTestNode();
- setParentChild->setParent(root);
- tst_SimpleObserver *setParentChildObserver = new tst_SimpleObserver();
- arbiter->registerObserver(setParentChildObserver, setParentChild->id());
- setParentChild->setProp2(setParentChild->prop2() + 1.f);
+ Qt3DCore::QNodePrivate::get(child)->setArbiter(arbiter.data());
+ child->setProp2(1586);
// THEN
- dirtyNodes = arbiter->takeDirtyFrontEndNodes();
- QCOMPARE(dirtyNodes.size(), 1);
- QCOMPARE(dirtyNodes.front(), setParentChild);
+ QCOMPARE(arbiter->dirtyNodes.size(), 1);
+ QCOMPARE(arbiter->dirtyNodes.front(), child);
- // Test change notifications made to an entity that was added to the scene
- // via the QNode() constructor parent parameter
+ arbiter->dirtyNodes.clear();
// WHEN
- PropertyTestNode *directChild = new PropertyTestNode(root);
- QCoreApplication::processEvents(); // make sure the post-ctor initialization is executed for the node
- tst_SimpleObserver *directChildObserver = new tst_SimpleObserver();
- arbiter->registerObserver(directChildObserver, directChild->id());
- directChild->setProp1(directChild->prop1() + 1);
-
- // THEN
- dirtyNodes = arbiter->takeDirtyFrontEndNodes();
- QCOMPARE(dirtyNodes.size(), 1);
- QCOMPARE(dirtyNodes.front(), directChild);
-
- Qt3DCore::QChangeArbiter::destroyThreadLocalChangeQueue(arbiter.data());
-}
-
-void tst_QChangeArbiter::distributeBackendChanges()
-{
-
- // GIVEN
- QScopedPointer<Qt3DCore::QChangeArbiter> arbiter(new Qt3DCore::QChangeArbiter());
- QScopedPointer<Qt3DCore::QScene> scene(new Qt3DCore::QScene());
- QScopedPointer<tst_PostManObserver> postman(new tst_PostManObserver);
- arbiter->setPostman(postman.data());
- arbiter->setScene(scene.data());
- postman->setScene(scene.data());
- scene->setArbiter(arbiter.data());
- // Replaces initialize as we have no JobManager in this case
- Qt3DCore::QChangeArbiter::createThreadLocalChangeQueue(arbiter.data());
-
- // In order for backend -> frontend changes to work properly,
- // the backend notification should only be sent
- // from a worker thread which has a dedicated ChangeQueue in the
- // ChangeArbiter different than the frontend ChangeQueue. In this
- // test we will only check that the backend has received the frontend notification
-
-
- // WHEN
- tst_Node *root = new tst_Node();
- Qt3DCore::QNodePrivate::get(root)->setScene(scene.data());
- Qt3DCore::QNodePrivate::get(root)->m_hasBackendNode = true;
- scene->addObservable(root);
-
- tst_BackendObserverObservable *backenObserverObservable = new tst_BackendObserverObservable();
- arbiter->registerObserver(Qt3DCore::QBackendNodePrivate::get(backenObserverObservable), root->id());
- arbiter->scene()->addObservable(Qt3DCore::QBackendNodePrivate::get(backenObserverObservable), root->id());
- Qt3DCore::QBackendNodePrivate::get(backenObserverObservable)->setArbiter(arbiter.data());
-
- arbiter->syncChanges();
+ root->setProp1(887);
+ child->setProp2(1587);
// THEN
- QVERIFY(root->lastChange().isNull());
- QVERIFY(backenObserverObservable->lastChange().isNull());
- QCOMPARE(backenObserverObservable->lastChanges().count(), 0);
-
- // WHEN
- root->sendAllChangesNotification();
- arbiter->syncChanges();
-
- // THEN
- // backend observer receives event from frontend node "root"
- QCOMPARE(root->lastChanges().count(), 0);
- QCOMPARE(postman->lastChanges().count(), 0);
- QCOMPARE(backenObserverObservable->lastChanges().count(), 1);
-
- backenObserverObservable->clear();
-
- {
- // WHEN
- // simulate a worker thread
- QScopedPointer<ThreadedAnswer> answer(new ThreadedAnswer(arbiter.data(), backenObserverObservable));
- postman->setAllowFrontendNotifications(false);
- QWaitCondition *waitingForBackendReplyCondition = answer->waitingCondition();
-
- QMutex mutex;
- // sends reply from another thread (simulates job thread)
- answer->start();
- mutex.lock();
- waitingForBackendReplyCondition->wait(&mutex);
- mutex.unlock();
-
- // To verify that backendObserver sent a reply
- arbiter->syncChanges();
-
- // THEN
- // the repliers should receive it's reply
- QCOMPARE(backenObserverObservable->lastChanges().count(), 1);
- // verify that postMan has received the change
- QCOMPARE(postman->lastChanges().count(), 0);
- answer->exit();
- answer->wait();
- backenObserverObservable->clear();
- }
-
- {
- // WHEN
- // simulate a worker thread
- QScopedPointer<ThreadedAnswer> answer(new ThreadedAnswer(arbiter.data(), backenObserverObservable));
- postman->setAllowFrontendNotifications(true);
- QWaitCondition *waitingForBackendReplyCondition = answer->waitingCondition();
- QMutex mutex;
- // sends reply from another thread (simulates job thread)
- answer->start();
- mutex.lock();
- waitingForBackendReplyCondition->wait(&mutex);
- mutex.unlock();
-
- // To verify that backendObserver sent a reply
- arbiter->syncChanges();
-
- // THEN
- // the repliers should receive it's reply
- QCOMPARE(backenObserverObservable->lastChanges().count(), 1);
- // verify that postMan has received the change
- QCOMPARE(postman->lastChanges().count(), 1);
-
- // verify correctness of the reply
- Qt3DCore::QPropertyUpdatedChangePtr c = qSharedPointerDynamicCast<Qt3DCore::QPropertyUpdatedChange>(postman->lastChange());
- QVERIFY(!c.isNull());
- QVERIFY(c->subjectId() == root->id());
- qDebug() << c->propertyName();
- QVERIFY(strcmp(c->propertyName(), "Reply") == 0);
- QVERIFY(c->type() == Qt3DCore::PropertyUpdated);
- answer->exit();
- answer->wait();
- }
-
- Qt3DCore::QChangeArbiter::destroyThreadLocalChangeQueue(arbiter.data());
+ QCOMPARE(arbiter->dirtyNodes.size(), 2);
}
QTEST_MAIN(tst_QChangeArbiter)
diff --git a/tests/auto/core/threadpooler/tst_threadpooler.cpp b/tests/auto/core/threadpooler/tst_threadpooler.cpp
index 289f0b103..8941d8489 100644
--- a/tests/auto/core/threadpooler/tst_threadpooler.cpp
+++ b/tests/auto/core/threadpooler/tst_threadpooler.cpp
@@ -194,7 +194,7 @@ void tst_ThreadPooler::defaultPerThread()
{
// GIVEN
QAtomicInt callCounter;
- int maxThreadCount = QThread::idealThreadCount();
+ int maxThreadCount = Qt3DCore::QAspectJobManager::idealThreadCount();
callCounter.storeRelaxed(0);
// WHEN
diff --git a/tests/auto/core/vector3d_sse/tst_vector3d_sse.cpp b/tests/auto/core/vector3d_sse/tst_vector3d_sse.cpp
index 7ea79a5f5..e99dd0e6f 100644
--- a/tests/auto/core/vector3d_sse/tst_vector3d_sse.cpp
+++ b/tests/auto/core/vector3d_sse/tst_vector3d_sse.cpp
@@ -29,12 +29,15 @@
#include <QtTest/QtTest>
#include <Qt3DCore/private/vector3d_sse_p.h>
+#ifdef QT_COMPILER_SUPPORTS_SSE2
using namespace Qt3DCore;
+#endif
class tst_Vector3D_SSE: public QObject
{
Q_OBJECT
private Q_SLOTS:
+#ifdef QT_COMPILER_SUPPORTS_SSE2
void defaultConstruction()
{
// GIVEN
@@ -812,6 +815,7 @@ private Q_SLOTS:
QVERIFY(!v0.isNull());
}
}
+#endif // QT_COMPILER_SUPPORTS_SSE2
};
QTEST_APPLESS_MAIN(tst_Vector3D_SSE)
diff --git a/tests/auto/core/vector4d_sse/tst_vector4d_sse.cpp b/tests/auto/core/vector4d_sse/tst_vector4d_sse.cpp
index ed9722ffb..2e539491f 100644
--- a/tests/auto/core/vector4d_sse/tst_vector4d_sse.cpp
+++ b/tests/auto/core/vector4d_sse/tst_vector4d_sse.cpp
@@ -30,12 +30,16 @@
#include <Qt3DCore/private/vector4d_sse_p.h>
#include <Qt3DCore/qt3dcore-config.h>
+#ifdef QT_COMPILER_SUPPORTS_SSE2
using namespace Qt3DCore;
+#endif
class tst_Vector4D_SSE: public QObject
{
Q_OBJECT
private Q_SLOTS:
+
+#ifdef QT_COMPILER_SUPPORTS_SSE2
void defaultConstruction()
{
// GIVEN
@@ -915,6 +919,7 @@ private Q_SLOTS:
QVERIFY(!v0.isNull());
}
}
+#endif // QT_COMPILER_SUPPORTS_SSE2
};
QTEST_APPLESS_MAIN(tst_Vector4D_SSE)
diff --git a/tests/auto/extras/qtext2dentity/tst_qtext2dentity.cpp b/tests/auto/extras/qtext2dentity/tst_qtext2dentity.cpp
index 6fcc2e637..35e241839 100644
--- a/tests/auto/extras/qtext2dentity/tst_qtext2dentity.cpp
+++ b/tests/auto/extras/qtext2dentity/tst_qtext2dentity.cpp
@@ -90,7 +90,7 @@ void tst_qtext2dentity::checkChangeArbiter()
auto atlases = lookupNodeByClassName(rootEntity.data(), "Qt3DExtras::QTextureAtlas");
QVERIFY(atlases.length() == 1);
auto atlas = atlases[0];
- QTRY_VERIFY(Qt3DCore::QNodePrivate::get(atlas)->m_changeArbiter);
+ QVERIFY(Qt3DCore::QNodePrivate::get(atlas)->m_changeArbiter);
#endif
}
diff --git a/tests/auto/input/commons/commons.pri b/tests/auto/input/commons/commons.pri
index 4913f5bbb..656f41980 100644
--- a/tests/auto/input/commons/commons.pri
+++ b/tests/auto/input/commons/commons.pri
@@ -1,6 +1,8 @@
HEADERS += $$PWD/testdevice.h \
$$PWD/testdeviceproxy.h
+SOURCES += $$PWD/testdevice.cpp
+
INCLUDEPATH += $$PWD
include(../../core/common/common.pri)
diff --git a/tests/auto/input/commons/testdevice.cpp b/tests/auto/input/commons/testdevice.cpp
new file mode 100644
index 000000000..91a2ad159
--- /dev/null
+++ b/tests/auto/input/commons/testdevice.cpp
@@ -0,0 +1,31 @@
+/****************************************************************************
+**
+** Copyright (C) 2022 Klaralvdalens Datakonsult AB (KDAB).
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt3D module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "moc_testdevice.cpp"
+#include "moc_testdeviceproxy.cpp"
+
diff --git a/tests/auto/quick3d/dynamicnodecreation/BLACKLIST b/tests/auto/quick3d/dynamicnodecreation/BLACKLIST
new file mode 100644
index 000000000..5a740af23
--- /dev/null
+++ b/tests/auto/quick3d/dynamicnodecreation/BLACKLIST
@@ -0,0 +1,4 @@
+# See qtbase/src/testlib/qtestblacklist.cpp for format
+[createEntityAndDynamicChild]
+ci ubuntu-20.04 # QTBUG-106519
+sles-15.4 # QTBUG-102315
diff --git a/tests/auto/quick3d/quick3dnodeinstantiator/data/createMultipleAsync.qml b/tests/auto/quick3d/quick3dnodeinstantiator/data/createMultipleAsync.qml
new file mode 100644
index 000000000..be6c46582
--- /dev/null
+++ b/tests/auto/quick3d/quick3dnodeinstantiator/data/createMultipleAsync.qml
@@ -0,0 +1,13 @@
+import QtQml 2.1
+import Qt3D.Core 2.0
+
+Entity {
+ NodeInstantiator {
+ model: 10
+ asynchronous: true
+ delegate: Entity {
+ property bool success: true
+ property int idx: index
+ }
+ }
+}
diff --git a/tests/auto/quick3d/quick3dnodeinstantiator/tst_quick3dnodeinstantiator.cpp b/tests/auto/quick3d/quick3dnodeinstantiator/tst_quick3dnodeinstantiator.cpp
index d4d0d56e2..1e7d6c593 100644
--- a/tests/auto/quick3d/quick3dnodeinstantiator/tst_quick3dnodeinstantiator.cpp
+++ b/tests/auto/quick3d/quick3dnodeinstantiator/tst_quick3dnodeinstantiator.cpp
@@ -39,6 +39,7 @@
#include <QtQml/qqmlengine.h>
#include <QtQml/qqmlcomponent.h>
#include <QtQml/qqmlcontext.h>
+#include <QtQml/qqmlincubator.h>
using namespace Qt3DCore::Quick;
@@ -55,6 +56,8 @@ private slots:
void activeProperty();
void intModelChange();
void createAndRemove();
+ void asynchronous_data();
+ void asynchronous();
};
void tst_quick3dnodeinstantiator::createNone()
@@ -251,6 +254,49 @@ void tst_quick3dnodeinstantiator::createAndRemove()
QCOMPARE(object->property("datum").toString(), names[i]);
}
}
+
+void tst_quick3dnodeinstantiator::asynchronous_data()
+{
+ QTest::addColumn<bool>("asyncIncubator");
+ QTest::addColumn<QString>("fileName");
+
+ QTest::newRow("Asynchronous Instantiator") << false << "createMultipleAsync.qml";
+ QTest::newRow("Nested-asynchronous Instantiator") << true << "createMultiple.qml";
+}
+
+void tst_quick3dnodeinstantiator::asynchronous()
+{
+ QFETCH(bool, asyncIncubator);
+ QFETCH(QString, fileName);
+
+ QQmlEngine engine;
+ QQmlIncubationController incubationController;
+ engine.setIncubationController(&incubationController);
+ QQmlComponent component(&engine, testFileUrl(fileName));
+ QQmlIncubator incubator(asyncIncubator ? QQmlIncubator::Asynchronous : QQmlIncubator::Synchronous);
+ component.create(incubator);
+ while (!incubator.isReady())
+ incubationController.incubateFor(10);
+ QObject *rootObject = incubator.object();
+ QVERIFY(rootObject != nullptr);
+ while (incubationController.incubatingObjectCount() > 0)
+ incubationController.incubateFor(10);
+ Quick3DNodeInstantiator *instantiator = rootObject->findChild<Quick3DNodeInstantiator *>();
+ QVERIFY(instantiator != nullptr);
+ QCOMPARE(instantiator->isActive(), true);
+ QCOMPARE(instantiator->count(), 10);
+
+ for (int i=0; i<10; i++) {
+ QObject *object = instantiator->objectAt(i);
+ QVERIFY(object);
+ QCOMPARE(object->parent(), rootObject);
+ QCOMPARE(object->property("success").toBool(), true);
+ QCOMPARE(object->property("idx").toInt(), i);
+ }
+}
+
+
QTEST_MAIN(tst_quick3dnodeinstantiator)
#include "tst_quick3dnodeinstantiator.moc"
+#include "moc_stringmodel.cpp"
diff --git a/tests/auto/render/aspect/tst_aspect.cpp b/tests/auto/render/aspect/tst_aspect.cpp
index 9bd5df698..5d0ead7ef 100644
--- a/tests/auto/render/aspect/tst_aspect.cpp
+++ b/tests/auto/render/aspect/tst_aspect.cpp
@@ -139,6 +139,10 @@ private Q_SLOTS:
// THEN -> enabled dirty
QCOMPARE(jobs.size(),
1 + // UpdateTreeEnabled
+ 1 + // UpdateTransform
+ 1 + // UpdateWorldBoundingVolume
+ 1 + // CalcBoundingVolume
+ 1 + // ExpandBoundingVolume
1 + // SyncLoadingJobs
1 + // UpdateSkinningPalette
1 + // UpdateLevelOfDetail
diff --git a/tests/auto/render/computecommand/tst_computecommand.cpp b/tests/auto/render/computecommand/tst_computecommand.cpp
index d6fa1d579..e583a9c61 100644
--- a/tests/auto/render/computecommand/tst_computecommand.cpp
+++ b/tests/auto/render/computecommand/tst_computecommand.cpp
@@ -141,6 +141,10 @@ private Q_SLOTS:
backendComputeCommand.setRenderer(&renderer);
simulateInitializationSync(&computeCommand, &backendComputeCommand);
+ // THEN
+ QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::ComputeDirty);
+ renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty);
+
{
// WHEN
const bool newValue = false;
@@ -149,6 +153,8 @@ private Q_SLOTS:
// THEN
QCOMPARE(backendComputeCommand.isEnabled(), newValue);
+ QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::ComputeDirty);
+ renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty);
}
{
// WHEN
@@ -158,6 +164,8 @@ private Q_SLOTS:
// THEN
QCOMPARE(backendComputeCommand.x(), newValue);
+ QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::ComputeDirty);
+ renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty);
}
{
// WHEN
@@ -167,6 +175,8 @@ private Q_SLOTS:
// THEN
QCOMPARE(backendComputeCommand.y(), newValue);
+ QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::ComputeDirty);
+ renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty);
}
{
// WHEN
@@ -176,6 +186,8 @@ private Q_SLOTS:
// THEN
QCOMPARE(backendComputeCommand.z(), newValue);
+ QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::ComputeDirty);
+ renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty);
}
{
// WHEN
@@ -185,6 +197,8 @@ private Q_SLOTS:
// THEN
QCOMPARE(backendComputeCommand.runType(), newValue);
+ QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::ComputeDirty);
+ renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty);
}
{
// WHEN
@@ -194,6 +208,8 @@ private Q_SLOTS:
// THEN
QCOMPARE(backendComputeCommand.frameCount(), newValue);
+ QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::ComputeDirty);
+ renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty);
}
}
diff --git a/tests/auto/render/geometry/tst_geometry.cpp b/tests/auto/render/geometry/tst_geometry.cpp
index a13f6fa40..4e7a94c42 100644
--- a/tests/auto/render/geometry/tst_geometry.cpp
+++ b/tests/auto/render/geometry/tst_geometry.cpp
@@ -204,16 +204,12 @@ private Q_SLOTS:
// WHEN
renderGeometry.updateExtent(QVector3D(-1.0f, -1.0f, -1.0f), QVector3D(1.0f, 1.0f, 1.0f));
- renderGeometry.notifyExtentChanged();
// THEN
- QCOMPARE(arbiter.events.count(), 1);
+ QCOMPARE(arbiter.dirtyNodes.count(), 0);
- Qt3DCore::QPropertyUpdatedChangePtr change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>();
- QCOMPARE(change->propertyName(), "extent");
- const QPair<QVector3D, QVector3D> v = change->value().value<QPair<QVector3D, QVector3D>>();
- QCOMPARE(v.first, QVector3D(-1.0f, -1.0f, -1.0f));
- QCOMPARE(v.second, QVector3D(1.0f, 1.0f, 1.0f));
+ QCOMPARE(renderGeometry.min(), QVector3D(-1.0f, -1.0f, -1.0f));
+ QCOMPARE(renderGeometry.max(), QVector3D(1.0f, 1.0f, 1.0f));
arbiter.events.clear();
}
diff --git a/tests/auto/render/geometryrenderer/tst_geometryrenderer.cpp b/tests/auto/render/geometryrenderer/tst_geometryrenderer.cpp
index 19df24680..6026a3ff2 100644
--- a/tests/auto/render/geometryrenderer/tst_geometryrenderer.cpp
+++ b/tests/auto/render/geometryrenderer/tst_geometryrenderer.cpp
@@ -50,7 +50,7 @@ public:
return nullptr;
}
- bool operator ==(const Qt3DRender::QGeometryFactory &other) const final
+ bool equals(const Qt3DRender::QGeometryFactory &other) const final
{
const TestFactory *otherFactory = Qt3DRender::functor_cast<TestFactory>(&other);
if (otherFactory != nullptr)
diff --git a/tests/auto/render/meshfunctors/tst_meshfunctors.cpp b/tests/auto/render/meshfunctors/tst_meshfunctors.cpp
index f8110085b..f845f39c8 100644
--- a/tests/auto/render/meshfunctors/tst_meshfunctors.cpp
+++ b/tests/auto/render/meshfunctors/tst_meshfunctors.cpp
@@ -52,7 +52,7 @@ public:
return nullptr;
}
- bool operator ==(const Qt3DRender::QGeometryFactory &other) const override
+ bool equals(const Qt3DRender::QGeometryFactory &other) const override
{
return Qt3DRender::functor_cast<MeshFunctorA>(&other);
}
@@ -74,7 +74,7 @@ public:
return nullptr;
}
- bool operator ==(const Qt3DRender::QGeometryFactory &other) const override
+ bool equals(const Qt3DRender::QGeometryFactory &other) const override
{
return Qt3DRender::functor_cast<MeshFunctorB>(&other);
}
@@ -91,7 +91,7 @@ public:
~MeshFunctorASub()
{}
- bool operator ==(const Qt3DRender::QGeometryFactory &other) const override
+ bool equals(const Qt3DRender::QGeometryFactory &other) const override
{
return Qt3DRender::functor_cast<MeshFunctorASub>(&other);
}
diff --git a/tests/auto/render/objectpicker/tst_objectpicker.cpp b/tests/auto/render/objectpicker/tst_objectpicker.cpp
index 24fa2159d..b1898e040 100644
--- a/tests/auto/render/objectpicker/tst_objectpicker.cpp
+++ b/tests/auto/render/objectpicker/tst_objectpicker.cpp
@@ -40,6 +40,21 @@ class tst_ObjectPicker : public Qt3DCore::QBackendNodeTester
Q_OBJECT
private Q_SLOTS:
+ void checkInitialSync()
+ {
+ // GIVEN
+ TestRenderer renderer;
+ Qt3DRender::Render::ObjectPicker objectPicker;
+ Qt3DRender::QObjectPicker picker;
+
+ // WHEN
+ objectPicker.setRenderer(&renderer);
+ simulateInitializationSync(&picker, &objectPicker);
+
+ // THEN
+ QVERIFY(renderer.dirtyBits() != 0);
+ }
+
void checkPeerPropertyMirroring()
{
// GIVEN
diff --git a/tests/auto/render/opengl/graphicshelpergl4/BLACKLIST b/tests/auto/render/opengl/graphicshelpergl4/BLACKLIST
new file mode 100644
index 000000000..08e743315
--- /dev/null
+++ b/tests/auto/render/opengl/graphicshelpergl4/BLACKLIST
@@ -0,0 +1,6 @@
+# See qtbase/src/testlib/qtestblacklist.cpp for format
+#QTBUG-101556
+[bindFrameBufferAttachment]
+ubuntu-20.04
+# QTBUG-111291
+sles-15.4
diff --git a/tests/auto/render/opengl/renderviews/tst_renderviews.cpp b/tests/auto/render/opengl/renderviews/tst_renderviews.cpp
index aec13071a..196ee85d4 100644
--- a/tests/auto/render/opengl/renderviews/tst_renderviews.cpp
+++ b/tests/auto/render/opengl/renderviews/tst_renderviews.cpp
@@ -307,6 +307,68 @@ private Q_SLOTS:
<< (QVector<ShaderParameterPack>() << pack1 << minifiedPack1 << minifiedPack1 << pack1 << minifiedPack1 << minifiedPack1);
}
+ void checkShaderParameterPackStoresSingleUBOPerBlockIndex()
+ {
+ // GIVEN
+ ShaderParameterPack pack;
+ auto nodeId1 = Qt3DCore::QNodeId::createId();
+ auto nodeId2 = Qt3DCore::QNodeId::createId();
+
+ BlockToUBO ubo1 { 1, nodeId1, false, {}};
+ BlockToUBO ubo2 { 1, nodeId2, false, {}};
+
+ // WHEN
+ pack.setUniformBuffer(ubo1);
+ pack.setUniformBuffer(ubo2);
+
+ // THEN
+ QCOMPARE(pack.uniformBuffers().size(), 1);
+ QCOMPARE(pack.uniformBuffers().front().m_blockIndex, 1);
+ QCOMPARE(pack.uniformBuffers().front().m_bufferID, nodeId2);
+
+ // WHEN
+ BlockToUBO ubo3 { 2, nodeId2, false, {}};
+ pack.setUniformBuffer(ubo3);
+
+ // THEN
+ QCOMPARE(pack.uniformBuffers().size(), 2);
+ QCOMPARE(pack.uniformBuffers().front().m_blockIndex, 1);
+ QCOMPARE(pack.uniformBuffers().front().m_bufferID, nodeId2);
+ QCOMPARE(pack.uniformBuffers().back().m_blockIndex, 2);
+ QCOMPARE(pack.uniformBuffers().back().m_bufferID, nodeId2);
+ }
+
+ void checkShaderParameterPackStoresSingleSSBOPerBlockIndex()
+ {
+ // GIVEN
+ ShaderParameterPack pack;
+ auto nodeId1 = Qt3DCore::QNodeId::createId();
+ auto nodeId2 = Qt3DCore::QNodeId::createId();
+
+ BlockToSSBO ssbo1 { 1, 0, nodeId1};
+ BlockToSSBO ssbo2 { 1, 0, nodeId2};
+
+ // WHEN
+ pack.setShaderStorageBuffer(ssbo1);
+ pack.setShaderStorageBuffer(ssbo2);
+
+ // THEN
+ QCOMPARE(pack.shaderStorageBuffers().size(), 1);
+ QCOMPARE(pack.shaderStorageBuffers().front().m_blockIndex, 1);
+ QCOMPARE(pack.shaderStorageBuffers().front().m_bufferID, nodeId2);
+
+ // WHEN
+ BlockToSSBO ssbo3 { 2, 1, nodeId2};
+ pack.setShaderStorageBuffer(ssbo3);
+
+ // THEN
+ QCOMPARE(pack.shaderStorageBuffers().size(), 2);
+ QCOMPARE(pack.shaderStorageBuffers().front().m_blockIndex, 1);
+ QCOMPARE(pack.shaderStorageBuffers().front().m_bufferID, nodeId2);
+ QCOMPARE(pack.shaderStorageBuffers().back().m_blockIndex, 2);
+ QCOMPARE(pack.shaderStorageBuffers().back().m_bufferID, nodeId2);
+ }
+
void checkRenderViewUniformMinification()
{
QFETCH(QVector<QShaderProgram*>, shaders);
diff --git a/tests/auto/render/pickboundingvolumejob/pickboundingvolumejob.qrc b/tests/auto/render/pickboundingvolumejob/pickboundingvolumejob.qrc
index 76150da31..df0198f76 100644
--- a/tests/auto/render/pickboundingvolumejob/pickboundingvolumejob.qrc
+++ b/tests/auto/render/pickboundingvolumejob/pickboundingvolumejob.qrc
@@ -12,5 +12,7 @@
<file>testscene_cameraposition.qml</file>
<file>testscene_priorityoverlapping.qml</file>
<file>testscene_nopicking.qml</file>
+ <file>testscene_layerfilter.qml</file>
+ <file>testscene_nested_layerfilter.qml</file>
</qresource>
</RCC>
diff --git a/tests/auto/render/pickboundingvolumejob/testscene_layerfilter.qml b/tests/auto/render/pickboundingvolumejob/testscene_layerfilter.qml
new file mode 100644
index 000000000..392623a6a
--- /dev/null
+++ b/tests/auto/render/pickboundingvolumejob/testscene_layerfilter.qml
@@ -0,0 +1,162 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 Klaralvdalens Datakonsult AB (KDAB).
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt3D module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import Qt3D.Core 2.0
+import Qt3D.Render 2.0
+import Qt3D.Extras 2.0
+import QtQuick.Window 2.0
+
+Entity {
+ id: sceneRoot
+
+ Window {
+ id: _view
+ width: 600
+ height: 600
+ visible: true
+ }
+
+ Camera {
+ id: camera
+ projectionType: CameraLens.PerspectiveProjection
+ fieldOfView: 45
+ aspectRatio: _view.width / 2 / _view.height
+ nearPlane : 0.1
+ farPlane : 1000.0
+ position: Qt.vector3d( 0.0, 0.0, -10.0 )
+ upVector: Qt.vector3d( 0.0, 1.0, 0.0 )
+ viewCenter: Qt.vector3d( 0.0, 0.0, 0.0 )
+ }
+
+ Camera {
+ id: camera2
+ projectionType: CameraLens.PerspectiveProjection
+ fieldOfView: 45
+ aspectRatio: _view.width / 2 / _view.height
+ nearPlane : 0.1
+ farPlane : 1000.0
+ position: Qt.vector3d( 0.0, 0.0, -10.0 )
+ upVector: Qt.vector3d( 0.0, 1.0, 0.0 )
+ viewCenter: Qt.vector3d( 0.0, 0.0, 0.0 )
+ }
+
+ FirstPersonCameraController {
+ camera: camera
+ }
+
+ DirectionalLight {
+ worldDirection: camera.viewVector.times(-1)
+ }
+
+ // Draw 2 viewports
+ components: [
+ RenderSettings {
+ RenderSurfaceSelector {
+ surface: _view
+
+ Viewport {
+ normalizedRect: Qt.rect(0.0, 0.0, 0.5, 1.0)
+ ClearBuffers {
+ buffers : ClearBuffers.ColorDepthBuffer
+ clearColor: "white"
+ CameraSelector {
+ camera: camera
+
+ LayerFilter {
+ layers: [ layer1 ]
+ }
+ }
+ }
+ }
+
+ Viewport {
+ normalizedRect: Qt.rect(0.5, 0.0, 0.5, 1.0)
+ CameraSelector {
+ camera: camera2
+
+ LayerFilter {
+ layers: [ layer2 ]
+ }
+ }
+ }
+ }
+ }
+ ]
+
+ CuboidMesh { id: cubeMesh }
+
+ Entity {
+ readonly property ObjectPicker objectPicker: ObjectPicker {
+ objectName: "Picker1"
+ onClicked: console.log("o1")
+ }
+ readonly property Transform transform: Transform {
+ scale: 4
+ }
+ readonly property PhongMaterial material: PhongMaterial { diffuse: "red" }
+ readonly property Layer layer: Layer { id: layer1 }
+
+ components: [cubeMesh, transform, material, objectPicker, layer ]
+ }
+
+ Entity {
+ readonly property ObjectPicker objectPicker: ObjectPicker {
+ objectName: "Picker2"
+ onClicked: console.log("o2")
+ }
+ readonly property Transform transform: Transform {
+ scale: 3
+ }
+ readonly property PhongMaterial material: PhongMaterial { diffuse: "green" }
+ readonly property Layer layer: Layer { id: layer2 }
+
+ components: [cubeMesh, transform, material, objectPicker, layer ]
+ }
+}
diff --git a/tests/auto/render/pickboundingvolumejob/testscene_nested_layerfilter.qml b/tests/auto/render/pickboundingvolumejob/testscene_nested_layerfilter.qml
new file mode 100644
index 000000000..b913b6f5f
--- /dev/null
+++ b/tests/auto/render/pickboundingvolumejob/testscene_nested_layerfilter.qml
@@ -0,0 +1,233 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 Klaralvdalens Datakonsult AB (KDAB).
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt3D module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import Qt3D.Core 2.0
+import Qt3D.Render 2.0
+import Qt3D.Extras 2.0
+import QtQuick.Window 2.0
+
+Entity {
+ id: sceneRoot
+
+ Window {
+ id: _view
+ width: 600
+ height: 600
+ visible: true
+ }
+
+ Camera {
+ id: camera
+ projectionType: CameraLens.PerspectiveProjection
+ fieldOfView: 45
+ aspectRatio: _view.width / 2 / _view.height
+ nearPlane : 0.1
+ farPlane : 1000.0
+ position: Qt.vector3d( 0.0, 0.0, -10.0 )
+ upVector: Qt.vector3d( 0.0, 1.0, 0.0 )
+ viewCenter: Qt.vector3d( 0.0, 0.0, 0.0 )
+ }
+
+ Camera {
+ id: camera2
+ projectionType: CameraLens.PerspectiveProjection
+ fieldOfView: 45
+ aspectRatio: _view.width / 2 / _view.height
+ nearPlane : 0.1
+ farPlane : 1000.0
+ position: Qt.vector3d( 0.0, 0.0, -10.0 )
+ upVector: Qt.vector3d( 0.0, 1.0, 0.0 )
+ viewCenter: Qt.vector3d( 0.0, 0.0, 0.0 )
+ }
+
+ FirstPersonCameraController {
+ camera: camera
+ }
+
+ DirectionalLight {
+ worldDirection: camera.viewVector.times(-1)
+ }
+
+ // Draw 2 viewports
+ components: [
+ RenderSettings {
+ RenderSurfaceSelector {
+ surface: _view
+
+ Viewport {
+ normalizedRect: Qt.rect(0.0, 0.0, 0.5, 1.0)
+ ClearBuffers {
+ buffers : ClearBuffers.ColorDepthBuffer
+ clearColor: "red"
+ CameraSelector {
+ camera: camera
+
+ LayerFilter {
+ // Any of
+ layers: [ layer1, layer3 ]
+
+ LayerFilter {
+ filterMode: LayerFilter.DiscardAnyMatchingLayers
+ layers: [layer2]
+ }
+ }
+ }
+ }
+ }
+
+ Viewport {
+ normalizedRect: Qt.rect(0.5, 0.0, 0.5, 1.0)
+ CameraSelector {
+ camera: camera2
+
+ LayerFilter {
+ layers: [ layerRecursive ]
+
+ LayerFilter {
+ filterMode: LayerFilter.DiscardAnyMatchingLayers
+ layers: [layer1]
+ }
+ }
+ }
+ }
+ }
+
+ pickingSettings {
+ pickMethod: PickingSettings.TrianglePicking
+ }
+ }
+ ]
+
+ CuboidMesh { id: cubeMesh }
+
+ Layer { id: layerRecursive; recursive: true }
+ Layer { id: layer1 }
+ Layer { id: layer2 }
+ Layer { id: layer3 }
+
+ Entity {
+ id: rootSceneEntity
+ components: [layerRecursive]
+
+ // Selected by Viewport 1
+ Entity {
+ readonly property ObjectPicker objectPicker: ObjectPicker {
+ objectName: "Picker1"
+ onClicked: console.log("o1 " + pick.position)
+ }
+ readonly property Transform transform: Transform {
+ scale: 2
+ translation: Qt.vector3d(-1, 0, 0)
+ }
+ readonly property PhongMaterial material: PhongMaterial { diffuse: "red" }
+
+ components: [cubeMesh, transform, material, objectPicker, layer1 ]
+ }
+
+ // Selected by Viewport 2
+ Entity {
+ readonly property ObjectPicker objectPicker: ObjectPicker {
+ objectName: "Picker2"
+ onClicked: console.log("o2" + pick.position)
+ }
+ readonly property Transform transform: Transform {
+ scale: 3
+ translation: Qt.vector3d(-2, 3, 5)
+ }
+ readonly property PhongMaterial material: PhongMaterial { diffuse: "green" }
+
+ components: [cubeMesh, transform, material, objectPicker, layer2 ]
+ }
+
+ // Not Selected by Any Viewport
+ Entity {
+ readonly property ObjectPicker objectPicker: ObjectPicker {
+ objectName: "Picker3"
+ onClicked: console.log("o3" + pick.position)
+ }
+ readonly property Transform transform: Transform {
+ scale: 4
+ }
+ readonly property PhongMaterial material: PhongMaterial { diffuse: "blue" }
+
+ components: [cubeMesh, transform, material, objectPicker, layer1, layer2 ]
+ }
+
+ // Both Viewport
+ Entity {
+ readonly property ObjectPicker objectPicker: ObjectPicker {
+ objectName: "Picker4"
+ onClicked: console.log("o4" + pick.position)
+ }
+ readonly property Transform transform: Transform {
+ scale: 1
+ translation: Qt.vector3d(0, -2, -1)
+ }
+ readonly property PhongMaterial material: PhongMaterial { diffuse: "orange" }
+
+ components: [cubeMesh, transform, material, objectPicker, layer3 ]
+ }
+
+ // Viewport 1
+ Entity {
+ readonly property ObjectPicker objectPicker: ObjectPicker {
+ objectName: "Picker5"
+ onClicked: console.log("o5" + pick.position)
+ }
+ readonly property Transform transform: Transform {
+ scale: 2
+ translation: Qt.vector3d(0, 1, 3)
+ }
+ readonly property PhongMaterial material: PhongMaterial { diffuse: "purple" }
+
+ components: [cubeMesh, transform, material, objectPicker, layer3, layer1 ]
+ }
+ }
+}
diff --git a/tests/auto/render/pickboundingvolumejob/tst_pickboundingvolumejob.cpp b/tests/auto/render/pickboundingvolumejob/tst_pickboundingvolumejob.cpp
index 0c1ee0183..41afb0ee9 100644
--- a/tests/auto/render/pickboundingvolumejob/tst_pickboundingvolumejob.cpp
+++ b/tests/auto/render/pickboundingvolumejob/tst_pickboundingvolumejob.cpp
@@ -60,6 +60,7 @@
#include <Qt3DRender/private/expandboundingvolumejob_p.h>
#include <Qt3DRender/private/calcboundingvolumejob_p.h>
#include <Qt3DRender/private/calcgeometrytrianglevolumes_p.h>
+#include <Qt3DRender/private/updateentitylayersjob_p.h>
#include <Qt3DRender/private/loadbufferjob_p.h>
#include <Qt3DRender/private/buffermanager_p.h>
#include <Qt3DRender/private/geometryrenderermanager_p.h>
@@ -215,6 +216,10 @@ void runRequiredJobs(Qt3DRender::TestAspect *test)
Qt3DRender::Render::CalcGeometryTriangleVolumes calcGeometryTriangles(geometryRendererId, test->nodeManagers());
calcGeometryTriangles.run();
}
+
+ Qt3DRender::Render::UpdateEntityLayersJob updateEntityLayer;
+ updateEntityLayer.setManager(test->nodeManagers());
+ updateEntityLayer.run();
}
void initializePickBoundingVolumeJob(Qt3DRender::Render::PickBoundingVolumeJob *job, Qt3DRender::TestAspect *test)
@@ -287,7 +292,6 @@ private:
}
private Q_SLOTS:
-
void viewportCameraAreaGather()
{
// GIVEN
@@ -1547,6 +1551,390 @@ private Q_SLOTS:
QCOMPARE(mouseExited.count(), 0);
}
+ void checkPickerAndLayerFilters()
+ {
+ // GIVEN
+ QmlSceneReader sceneReader(QUrl("qrc:/testscene_layerfilter.qml"));
+ QScopedPointer<Qt3DCore::QNode> root(qobject_cast<Qt3DCore::QNode *>(sceneReader.root()));
+ QVERIFY(root);
+
+ QScopedPointer<Qt3DRender::TestAspect> test(new Qt3DRender::TestAspect(root.data()));
+ TestArbiter arbiter;
+
+ // Runs Required jobs
+ runRequiredJobs(test.data());
+
+ // THEN
+ // object partially obscured by another viewport, make sure only visible portion is pickable
+ QList<Qt3DRender::QObjectPicker *> pickers = root->findChildren<Qt3DRender::QObjectPicker *>();
+ QCOMPARE(pickers.size(), 2);
+
+ Qt3DRender::QObjectPicker *picker1 = pickers.front();
+ QCOMPARE(picker1->objectName(), QLatin1String("Picker1"));
+
+ Qt3DRender::Render::ObjectPicker *backendPicker1 = test->nodeManagers()->objectPickerManager()->lookupResource(picker1->id());
+ QVERIFY(backendPicker1);
+
+ QSignalSpy mouseButtonPressedSpy1(picker1, &Qt3DRender::QObjectPicker::pressed);
+
+ QVERIFY(mouseButtonPressedSpy1.isValid());
+
+ Qt3DRender::QObjectPicker *picker2 = pickers.last();
+ QCOMPARE(picker2->objectName(), QLatin1String("Picker2"));
+
+ Qt3DRender::Render::ObjectPicker *backendPicker2 = test->nodeManagers()->objectPickerManager()->lookupResource(picker2->id());
+ QVERIFY(backendPicker2);
+
+ QSignalSpy mouseButtonPressedSpy2(picker2, &Qt3DRender::QObjectPicker::pressed);
+
+ QVERIFY(mouseButtonPressedSpy2.isValid());
+
+ // WHEN -> Pressed on object in vp1
+ Qt3DRender::Render::PickBoundingVolumeJob pickBVJob;
+ initializePickBoundingVolumeJob(&pickBVJob, test.data());
+
+ {
+ QList<QPair<QObject *, QMouseEvent>> events;
+ events.push_back({nullptr, QMouseEvent(QMouseEvent::MouseButtonPress, QPointF(150., 300.),
+ Qt::LeftButton, Qt::LeftButton, Qt::NoModifier) });
+ pickBVJob.setMouseEvents(events);
+ bool earlyReturn = !pickBVJob.runHelper();
+ Qt3DCore::QAspectJobPrivate::get(&pickBVJob)->postFrame(test->aspectManager());
+
+ // THEN -> Pressed
+ QVERIFY(!earlyReturn);
+ QVERIFY(backendPicker1->isPressed());
+ QVERIFY(picker1->isPressed());
+ QVERIFY(!backendPicker2->isPressed());
+ QVERIFY(!picker2->isPressed());
+ QCOMPARE(mouseButtonPressedSpy1.count(), 1);
+ QCOMPARE(mouseButtonPressedSpy2.count(), 0);
+
+ events.clear();
+
+ events.push_back({nullptr, QMouseEvent(QMouseEvent::MouseButtonRelease, QPointF(150., 300.),
+ Qt::LeftButton, Qt::LeftButton, Qt::NoModifier)});
+ pickBVJob.setMouseEvents(events);
+ pickBVJob.runHelper();
+ }
+
+ {
+ QList<QPair<QObject *, QMouseEvent>> events;
+ events.push_back({nullptr, QMouseEvent(QMouseEvent::MouseButtonPress, QPointF(450., 300.),
+ Qt::LeftButton, Qt::LeftButton, Qt::NoModifier)});
+ pickBVJob.setMouseEvents(events);
+ bool earlyReturn = !pickBVJob.runHelper();
+ Qt3DCore::QAspectJobPrivate::get(&pickBVJob)->postFrame(test->aspectManager());
+
+ // THEN -> Nothing happened
+ QVERIFY(!earlyReturn);
+ QVERIFY(backendPicker2->isPressed());
+ QVERIFY(picker2->isPressed());
+ QCOMPARE(mouseButtonPressedSpy1.count(), 1);
+ QCOMPARE(mouseButtonPressedSpy2.count(), 1);
+ }
+ }
+
+ void checkPickerAndNestedLayerFilters()
+ {
+ // GIVEN
+ QmlSceneReader sceneReader(QUrl("qrc:/testscene_nested_layerfilter.qml"));
+ QScopedPointer<Qt3DCore::QNode> root(qobject_cast<Qt3DCore::QNode *>(sceneReader.root()));
+ QVERIFY(root);
+
+ QScopedPointer<Qt3DRender::TestAspect> test(new Qt3DRender::TestAspect(root.data()));
+ TestArbiter arbiter;
+
+ // Runs Required jobs
+ runRequiredJobs(test.data());
+
+ // THEN
+ // object partially obscured by another viewport, make sure only visible portion is pickable
+ QList<Qt3DRender::QObjectPicker *> pickers = root->findChildren<Qt3DRender::QObjectPicker *>();
+ QCOMPARE(pickers.size(), 5);
+
+ Qt3DRender::QObjectPicker *picker1 = pickers[0];
+ QCOMPARE(picker1->objectName(), QLatin1String("Picker1"));
+ Qt3DRender::QObjectPicker *picker2 = pickers[1];
+ QCOMPARE(picker2->objectName(), QLatin1String("Picker2"));
+ Qt3DRender::QObjectPicker *picker3 = pickers[2];
+ QCOMPARE(picker3->objectName(), QLatin1String("Picker3"));
+ Qt3DRender::QObjectPicker *picker4 = pickers[3];
+ QCOMPARE(picker4->objectName(), QLatin1String("Picker4"));
+ Qt3DRender::QObjectPicker *picker5 = pickers[4];
+ QCOMPARE(picker5->objectName(), QLatin1String("Picker5"));
+
+ Qt3DRender::Render::ObjectPicker *backendPicker1 = test->nodeManagers()->objectPickerManager()->lookupResource(picker1->id());
+ QVERIFY(backendPicker1);
+
+ QSignalSpy mouseButtonPressedSpy1(picker1, &Qt3DRender::QObjectPicker::pressed);
+ QVERIFY(mouseButtonPressedSpy1.isValid());
+
+ Qt3DRender::Render::ObjectPicker *backendPicker2 = test->nodeManagers()->objectPickerManager()->lookupResource(picker2->id());
+ QVERIFY(backendPicker2);
+
+ QSignalSpy mouseButtonPressedSpy2(picker2, &Qt3DRender::QObjectPicker::pressed);
+ QVERIFY(mouseButtonPressedSpy2.isValid());
+
+ Qt3DRender::Render::ObjectPicker *backendPicker3 = test->nodeManagers()->objectPickerManager()->lookupResource(picker3->id());
+ QVERIFY(backendPicker3);
+
+ QSignalSpy mouseButtonPressedSpy3(picker3, &Qt3DRender::QObjectPicker::pressed);
+ QVERIFY(mouseButtonPressedSpy3.isValid());
+
+ Qt3DRender::Render::ObjectPicker *backendPicker4 = test->nodeManagers()->objectPickerManager()->lookupResource(picker4->id());
+ QVERIFY(backendPicker4);
+
+ QSignalSpy mouseButtonPressedSpy4(picker4, &Qt3DRender::QObjectPicker::pressed);
+ QVERIFY(mouseButtonPressedSpy4.isValid());
+
+ Qt3DRender::Render::ObjectPicker *backendPicker5 = test->nodeManagers()->objectPickerManager()->lookupResource(picker5->id());
+ QVERIFY(backendPicker5);
+
+ QSignalSpy mouseButtonPressedSpy5(picker5, &Qt3DRender::QObjectPicker::pressed);
+ QVERIFY(mouseButtonPressedSpy5.isValid());
+
+ Qt3DRender::Render::PickBoundingVolumeJob pickBVJob;
+ initializePickBoundingVolumeJob(&pickBVJob, test.data());
+
+ // Picker1 -> Viewport 1
+ // Picker2 -> Viewport 2
+ // Picker3 -> No Viewport
+ // Picker4 -> Viewport 1 and 2
+ // Picker5 -> Viewport 1
+
+ // WHEN -> Pressed on object1 in VP1
+ {
+ QList<QPair<QObject *, QMouseEvent>> events;
+ events.push_back({nullptr, QMouseEvent(QMouseEvent::MouseButtonPress, QPointF(200.0f, 300.0f),
+ Qt::LeftButton, Qt::LeftButton, Qt::NoModifier)});
+ pickBVJob.setMouseEvents(events);
+ bool earlyReturn = !pickBVJob.runHelper();
+ Qt3DCore::QAspectJobPrivate::get(&pickBVJob)->postFrame(test->aspectManager());
+
+ // THEN -> Pressed
+ QVERIFY(!earlyReturn);
+ QVERIFY(backendPicker1->isPressed());
+ QVERIFY(picker1->isPressed());
+ QVERIFY(!backendPicker2->isPressed());
+ QVERIFY(!picker2->isPressed());
+ QVERIFY(!backendPicker3->isPressed());
+ QVERIFY(!picker3->isPressed());
+ QVERIFY(!backendPicker4->isPressed());
+ QVERIFY(!picker4->isPressed());
+ QVERIFY(!backendPicker5->isPressed());
+ QVERIFY(!picker5->isPressed());
+ QCOMPARE(mouseButtonPressedSpy1.count(), 1);
+ QCOMPARE(mouseButtonPressedSpy2.count(), 0);
+ QCOMPARE(mouseButtonPressedSpy3.count(), 0);
+ QCOMPARE(mouseButtonPressedSpy4.count(), 0);
+ QCOMPARE(mouseButtonPressedSpy5.count(), 0);
+
+ events.clear();
+
+ events.push_back({nullptr, QMouseEvent(QMouseEvent::MouseButtonRelease, QPointF(200.0f, 300.0f),
+ Qt::LeftButton, Qt::LeftButton, Qt::NoModifier)});
+ pickBVJob.setMouseEvents(events);
+ pickBVJob.runHelper();
+ }
+
+ // WHEN -> Pressed on object2 in VP2
+ {
+ QList<QPair<QObject *, QMouseEvent>> events;
+ events.push_back({nullptr, QMouseEvent(QMouseEvent::MouseButtonPress, QPointF(541.0f, 183.0f),
+ Qt::LeftButton, Qt::LeftButton, Qt::NoModifier)});
+ pickBVJob.setMouseEvents(events);
+ bool earlyReturn = !pickBVJob.runHelper();
+ Qt3DCore::QAspectJobPrivate::get(&pickBVJob)->postFrame(test->aspectManager());
+
+ // THEN -> Pressed
+ QVERIFY(!earlyReturn);
+ QVERIFY(!backendPicker1->isPressed());
+ QVERIFY(!picker1->isPressed());
+ QVERIFY(backendPicker2->isPressed());
+ QVERIFY(picker2->isPressed());
+ QVERIFY(!backendPicker3->isPressed());
+ QVERIFY(!picker3->isPressed());
+ QVERIFY(!backendPicker4->isPressed());
+ QVERIFY(!picker4->isPressed());
+ QVERIFY(!backendPicker5->isPressed());
+ QVERIFY(!picker5->isPressed());
+ QCOMPARE(mouseButtonPressedSpy1.count(), 1);
+ QCOMPARE(mouseButtonPressedSpy2.count(), 1);
+ QCOMPARE(mouseButtonPressedSpy3.count(), 0);
+ QCOMPARE(mouseButtonPressedSpy4.count(), 0);
+ QCOMPARE(mouseButtonPressedSpy5.count(), 0);
+
+ events.clear();
+
+ events.push_back({nullptr, QMouseEvent(QMouseEvent::MouseButtonRelease, QPointF(541.0f, 183.0f),
+ Qt::LeftButton, Qt::LeftButton, Qt::NoModifier)});
+ pickBVJob.setMouseEvents(events);
+ pickBVJob.runHelper();
+ }
+
+ // WHEN -> Pressed on object3 in VP1
+ {
+ QList<QPair<QObject *, QMouseEvent>> events;
+ events.push_back({nullptr, QMouseEvent(QMouseEvent::MouseButtonPress, QPointF(80.0f, 150.0f),
+ Qt::LeftButton, Qt::LeftButton, Qt::NoModifier)});
+ pickBVJob.setMouseEvents(events);
+ bool earlyReturn = !pickBVJob.runHelper();
+ Qt3DCore::QAspectJobPrivate::get(&pickBVJob)->postFrame(test->aspectManager());
+
+ // THEN -> Nothing Pressed as not selected by Layer
+ QVERIFY(!earlyReturn);
+ QVERIFY(!backendPicker1->isPressed());
+ QVERIFY(!picker1->isPressed());
+ QVERIFY(!backendPicker2->isPressed());
+ QVERIFY(!picker2->isPressed());
+ QVERIFY(!backendPicker3->isPressed());
+ QVERIFY(!picker3->isPressed());
+ QVERIFY(!backendPicker4->isPressed());
+ QVERIFY(!picker4->isPressed());
+ QVERIFY(!backendPicker5->isPressed());
+ QVERIFY(!picker5->isPressed());
+ QCOMPARE(mouseButtonPressedSpy1.count(), 1);
+ QCOMPARE(mouseButtonPressedSpy2.count(), 1);
+ QCOMPARE(mouseButtonPressedSpy3.count(), 0);
+ QCOMPARE(mouseButtonPressedSpy4.count(), 0);
+ QCOMPARE(mouseButtonPressedSpy5.count(), 0);
+ }
+
+ // WHEN -> Pressed on object3 in VP2
+ {
+ QList<QPair<QObject *, QMouseEvent>> events;
+ events.push_back({nullptr, QMouseEvent(QMouseEvent::MouseButtonPress, QPointF(504.0f, 263.0f),
+ Qt::LeftButton, Qt::LeftButton, Qt::NoModifier)});
+ pickBVJob.setMouseEvents(events);
+ bool earlyReturn = !pickBVJob.runHelper();
+ Qt3DCore::QAspectJobPrivate::get(&pickBVJob)->postFrame(test->aspectManager());
+
+ // THEN -> Nothing Pressed as not selected by Layer
+ QVERIFY(!earlyReturn);
+ QVERIFY(!backendPicker1->isPressed());
+ QVERIFY(!picker1->isPressed());
+ QVERIFY(!backendPicker2->isPressed());
+ QVERIFY(!picker2->isPressed());
+ QVERIFY(!backendPicker3->isPressed());
+ QVERIFY(!picker3->isPressed());
+ QVERIFY(!backendPicker4->isPressed());
+ QVERIFY(!picker4->isPressed());
+ QVERIFY(!backendPicker5->isPressed());
+ QVERIFY(!picker5->isPressed());
+ QCOMPARE(mouseButtonPressedSpy1.count(), 1);
+ QCOMPARE(mouseButtonPressedSpy2.count(), 1);
+ QCOMPARE(mouseButtonPressedSpy3.count(), 0);
+ QCOMPARE(mouseButtonPressedSpy4.count(), 0);
+ QCOMPARE(mouseButtonPressedSpy5.count(), 0);
+ }
+
+ // WHEN -> Pressed on object4 in VP1
+ {
+ QList<QPair<QObject *, QMouseEvent>> events;
+ events.push_back({nullptr, QMouseEvent(QMouseEvent::MouseButtonPress, QPointF(160.0f, 431.0f),
+ Qt::LeftButton, Qt::LeftButton, Qt::NoModifier)});
+ pickBVJob.setMouseEvents(events);
+ bool earlyReturn = !pickBVJob.runHelper();
+ Qt3DCore::QAspectJobPrivate::get(&pickBVJob)->postFrame(test->aspectManager());
+
+ // THEN -> Pressed
+ QVERIFY(!earlyReturn);
+ QVERIFY(!backendPicker1->isPressed());
+ QVERIFY(!picker1->isPressed());
+ QVERIFY(!backendPicker2->isPressed());
+ QVERIFY(!picker2->isPressed());
+ QVERIFY(!backendPicker3->isPressed());
+ QVERIFY(!picker3->isPressed());
+ QVERIFY(backendPicker4->isPressed());
+ QVERIFY(picker4->isPressed());
+ QVERIFY(!backendPicker5->isPressed());
+ QVERIFY(!picker5->isPressed());
+ QCOMPARE(mouseButtonPressedSpy1.count(), 1);
+ QCOMPARE(mouseButtonPressedSpy2.count(), 1);
+ QCOMPARE(mouseButtonPressedSpy3.count(), 0);
+ QCOMPARE(mouseButtonPressedSpy4.count(), 1);
+ QCOMPARE(mouseButtonPressedSpy5.count(), 0);
+
+ events.clear();
+
+ events.push_back({nullptr, QMouseEvent(QMouseEvent::MouseButtonRelease, QPointF(160.0f, 431.0f),
+ Qt::LeftButton, Qt::LeftButton, Qt::NoModifier)});
+ pickBVJob.setMouseEvents(events);
+ pickBVJob.runHelper();
+ }
+
+ // WHEN -> Pressed on object4 in VP2
+ {
+ QList<QPair<QObject *, QMouseEvent>> events;
+ events.push_back({nullptr, QMouseEvent(QMouseEvent::MouseButtonPress, QPointF(447.0f, 472.0f),
+ Qt::LeftButton, Qt::LeftButton, Qt::NoModifier)});
+ pickBVJob.setMouseEvents(events);
+ bool earlyReturn = !pickBVJob.runHelper();
+ Qt3DCore::QAspectJobPrivate::get(&pickBVJob)->postFrame(test->aspectManager());
+
+ // THEN -> Pressed
+ QVERIFY(!earlyReturn);
+ QVERIFY(!backendPicker1->isPressed());
+ QVERIFY(!picker1->isPressed());
+ QVERIFY(!backendPicker2->isPressed());
+ QVERIFY(!picker2->isPressed());
+ QVERIFY(!backendPicker3->isPressed());
+ QVERIFY(!picker3->isPressed());
+ QVERIFY(backendPicker4->isPressed());
+ QVERIFY(picker4->isPressed());
+ QVERIFY(!backendPicker5->isPressed());
+ QVERIFY(!picker5->isPressed());
+ QCOMPARE(mouseButtonPressedSpy1.count(), 1);
+ QCOMPARE(mouseButtonPressedSpy2.count(), 1);
+ QCOMPARE(mouseButtonPressedSpy3.count(), 0);
+ QCOMPARE(mouseButtonPressedSpy4.count(), 2);
+ QCOMPARE(mouseButtonPressedSpy5.count(), 0);
+
+ events.clear();
+
+ events.push_back({nullptr, QMouseEvent(QMouseEvent::MouseButtonRelease, QPointF(447.0f, 472.0f),
+ Qt::LeftButton, Qt::LeftButton, Qt::NoModifier)});
+ pickBVJob.setMouseEvents(events);
+ pickBVJob.runHelper();
+ }
+
+ // WHEN -> Pressed on object5 in VP1
+ {
+ QList<QPair<QObject *, QMouseEvent>> events;
+ events.push_back({nullptr, QMouseEvent(QMouseEvent::MouseButtonPress, QPointF(153.0f, 195.0f),
+ Qt::LeftButton, Qt::LeftButton, Qt::NoModifier)});
+ pickBVJob.setMouseEvents(events);
+ bool earlyReturn = !pickBVJob.runHelper();
+ Qt3DCore::QAspectJobPrivate::get(&pickBVJob)->postFrame(test->aspectManager());
+
+ // THEN -> Pressed
+ QVERIFY(!earlyReturn);
+ QVERIFY(!backendPicker1->isPressed());
+ QVERIFY(!picker1->isPressed());
+ QVERIFY(!backendPicker2->isPressed());
+ QVERIFY(!picker2->isPressed());
+ QVERIFY(!backendPicker3->isPressed());
+ QVERIFY(!picker3->isPressed());
+ QVERIFY(!backendPicker4->isPressed());
+ QVERIFY(!picker4->isPressed());
+ QVERIFY(backendPicker5->isPressed());
+ QVERIFY(picker5->isPressed());
+ QCOMPARE(mouseButtonPressedSpy1.count(), 1);
+ QCOMPARE(mouseButtonPressedSpy2.count(), 1);
+ QCOMPARE(mouseButtonPressedSpy3.count(), 0);
+ QCOMPARE(mouseButtonPressedSpy4.count(), 2);
+ QCOMPARE(mouseButtonPressedSpy5.count(), 1);
+
+ events.clear();
+
+ events.push_back({nullptr, QMouseEvent(QMouseEvent::MouseButtonRelease, QPointF(153.0f, 195.0f),
+ Qt::LeftButton, Qt::LeftButton, Qt::NoModifier)});
+ pickBVJob.setMouseEvents(events);
+ pickBVJob.runHelper();
+ }
+ }
+
void checkMultipleRayDirections_data()
{
QTest::addColumn<QVector3D>("cameraOrigin");
@@ -1879,7 +2267,6 @@ private Q_SLOTS:
QCOMPARE(vca.cameraId, camera->id());
QCOMPARE(vca.viewport, QRectF(0., 0., 1., 1.));
}
-
};
QTEST_MAIN(tst_PickBoundingVolumeJob)
diff --git a/tests/auto/render/qgeometry/tst_qgeometry.cpp b/tests/auto/render/qgeometry/tst_qgeometry.cpp
index e790ba9cc..b2c66ae72 100644
--- a/tests/auto/render/qgeometry/tst_qgeometry.cpp
+++ b/tests/auto/render/qgeometry/tst_qgeometry.cpp
@@ -208,31 +208,26 @@ private Q_SLOTS:
QCOMPARE(geometry->maxExtent(), QVector3D());
// WHEN
- Qt3DCore::QPropertyUpdatedChangePtr valueChange(new Qt3DCore::QPropertyUpdatedChange(Qt3DCore::QNodeId()));
- valueChange->setPropertyName("extent");
- valueChange->setValue(QVariant::fromValue(QPair<QVector3D, QVector3D>(QVector3D(10.0f, 10.f, 10.0f),
- QVector3D())));
- geometry->sceneChangeEvent(valueChange);
+ auto dNode = static_cast<Qt3DRender::QGeometryPrivate *>(Qt3DCore::QNodePrivate::get(geometry.data()));
+ const QVector3D minExt(-1.0f, -1.0f, -1.0f);
+ const QVector3D maxExt(1.0f, 1.0f, 1.0f);
+ dNode->setExtent(minExt, maxExt);
// THEN
QCOMPARE(spyMinExtent.count(), 1);
- QCOMPARE(spyMaxExtent.count(), 0);
- QCOMPARE(geometry->minExtent(), QVector3D(10.0f, 10.0f, 10.0f));
+ QCOMPARE(spyMaxExtent.count(), 1);
+ QCOMPARE(geometry->minExtent(), minExt);
+ QCOMPARE(geometry->maxExtent(), maxExt);
+ spyMaxExtent.clear();
spyMinExtent.clear();
// WHEN
- valueChange->setPropertyName("extent");
- valueChange->setValue(QVariant::fromValue(QPair<QVector3D, QVector3D>(QVector3D(10.0f, 10.f, 10.0f),
- QVector3D(11.0f, 11.f, 11.0f))));
- geometry->sceneChangeEvent(valueChange);
+ dNode->setExtent(minExt, maxExt);
// THEN
QCOMPARE(spyMinExtent.count(), 0);
- QCOMPARE(spyMaxExtent.count(), 1);
- QCOMPARE(geometry->maxExtent(), QVector3D(11.0f, 11.0f, 11.0f));
-
- spyMaxExtent.clear();
+ QCOMPARE(spyMaxExtent.count(), 0);
}
};
diff --git a/tests/auto/render/qgeometryrenderer/tst_qgeometryrenderer.cpp b/tests/auto/render/qgeometryrenderer/tst_qgeometryrenderer.cpp
index 8cfbc0d23..8addfe9ad 100644
--- a/tests/auto/render/qgeometryrenderer/tst_qgeometryrenderer.cpp
+++ b/tests/auto/render/qgeometryrenderer/tst_qgeometryrenderer.cpp
@@ -56,7 +56,7 @@ public:
return nullptr;
}
- bool operator ==(const Qt3DRender::QGeometryFactory &other) const final
+ bool equals(const Qt3DRender::QGeometryFactory &other) const final
{
const TestFactory *otherFactory = Qt3DRender::functor_cast<TestFactory>(&other);
if (otherFactory != nullptr)
diff --git a/tests/auto/render/qmlscenereader/qmlscenereader.cpp b/tests/auto/render/qmlscenereader/qmlscenereader.cpp
index 182782edb..417a75880 100644
--- a/tests/auto/render/qmlscenereader/qmlscenereader.cpp
+++ b/tests/auto/render/qmlscenereader/qmlscenereader.cpp
@@ -82,3 +82,5 @@ void QmlSceneReader::loadComplete()
}
QT_END_NAMESPACE
+
+#include "moc_qmlscenereader.cpp"
diff --git a/tests/auto/render/qmlscenereader/qmlscenereader.h b/tests/auto/render/qmlscenereader/qmlscenereader.h
index 9d4643d93..75a74d03a 100644
--- a/tests/auto/render/qmlscenereader/qmlscenereader.h
+++ b/tests/auto/render/qmlscenereader/qmlscenereader.h
@@ -37,6 +37,9 @@
**
****************************************************************************/
+#ifndef QMLSCENEREADER_H
+#define QMLSCENEREADER_H
+
#include <QObject>
QT_BEGIN_NAMESPACE
@@ -61,3 +64,5 @@ private:
};
QT_END_NAMESPACE
+
+#endif
diff --git a/tests/auto/render/raycasting/BLACKLIST b/tests/auto/render/raycasting/BLACKLIST
new file mode 100644
index 000000000..8d957b4ca
--- /dev/null
+++ b/tests/auto/render/raycasting/BLACKLIST
@@ -0,0 +1,3 @@
+# See qtbase/src/testlib/qtestblacklist.cpp for format
+[shouldReturnAllResults]
+ci ubuntu-20.04 # QTBUG-108918
diff --git a/tests/auto/render/raycastingjob/tst_raycastingjob.cpp b/tests/auto/render/raycastingjob/tst_raycastingjob.cpp
index 9eb73cbd6..6638d88d9 100644
--- a/tests/auto/render/raycastingjob/tst_raycastingjob.cpp
+++ b/tests/auto/render/raycastingjob/tst_raycastingjob.cpp
@@ -58,6 +58,7 @@
#include <Qt3DRender/private/calcboundingvolumejob_p.h>
#include <Qt3DRender/private/calcgeometrytrianglevolumes_p.h>
#include <Qt3DRender/private/loadbufferjob_p.h>
+#include <Qt3DRender/private/updateentitylayersjob_p.h>
#include <Qt3DRender/private/buffermanager_p.h>
#include <Qt3DRender/private/geometryrenderermanager_p.h>
@@ -212,6 +213,10 @@ void runRequiredJobs(Qt3DRender::TestAspect *test)
Qt3DRender::Render::CalcGeometryTriangleVolumes calcGeometryTriangles(geometryRendererId, test->nodeManagers());
calcGeometryTriangles.run();
}
+
+ Qt3DRender::Render::UpdateEntityLayersJob updateEntityLayer;
+ updateEntityLayer.setManager(test->nodeManagers());
+ updateEntityLayer.run();
}
void initializeJob(Qt3DRender::Render::RayCastingJob *job, Qt3DRender::TestAspect *test)
diff --git a/tests/auto/render/shadergraph/qshadernodes/tst_qshadernodes.cpp b/tests/auto/render/shadergraph/qshadernodes/tst_qshadernodes.cpp
index 2cd2ff90d..2c53de349 100644
--- a/tests/auto/render/shadergraph/qshadernodes/tst_qshadernodes.cpp
+++ b/tests/auto/render/shadergraph/qshadernodes/tst_qshadernodes.cpp
@@ -540,8 +540,8 @@ void tst_QShaderNodes::shouldHandleNodeRulesSupportAndOrder()
QCOMPARE(node.availableFormats().at(2), openGL3);
QCOMPARE(node.rule(openGLES2), es2Rule);
QCOMPARE(node.rule(openGL3), gl3bisRule);
- QCOMPARE(node.rule(openGL32), gl3bisRule);
- QCOMPARE(node.rule(openGL4), gl3bisRule);
+ QCOMPARE(node.rule(openGL32), gl32Rule);
+ QCOMPARE(node.rule(openGL4), gl32Rule);
}
QTEST_MAIN(tst_QShaderNodes)
diff --git a/tests/auto/shared/util.cpp b/tests/auto/shared/util.cpp
index 55041eeb4..d4a19164a 100644
--- a/tests/auto/shared/util.cpp
+++ b/tests/auto/shared/util.cpp
@@ -123,3 +123,5 @@ QQmlTestMessageHandler::~QQmlTestMessageHandler()
qInstallMessageHandler(m_oldHandler);
QQmlTestMessageHandler::m_instance = 0;
}
+
+#include "moc_util.cpp"