diff options
author | Mike Krus <mike.krus@kdab.com> | 2017-09-11 17:48:12 +0100 |
---|---|---|
committer | Mike Krus <mike.krus@kdab.com> | 2017-09-12 08:22:57 +0000 |
commit | d88f9796150b8bc3b1506d2bca450c0840bf3807 (patch) | |
tree | ce58d771e1624be72aa2540f841ba1ff6eb74575 /tests/auto/render/pickboundingvolumejob/tst_pickboundingvolumejob.cpp | |
parent | cd467d5ffc6eaaa7da089ab4acc5284cd11d1109 (diff) |
Fix bounding sphere picking
In some cases, the list of pickable objects may contain entities that don’t have an object picker (or not parent has).
Now filter the pick results to only keep entities which either have an object picker or are children of an entity that does.
Added unit test which now passes
Change-Id: I930c3d60cf2d19e845fe6c0de904c53b93ebe8be
Reviewed-by: Kevin Ottens <kevin.ottens@kdab.com>
Diffstat (limited to 'tests/auto/render/pickboundingvolumejob/tst_pickboundingvolumejob.cpp')
-rw-r--r-- | tests/auto/render/pickboundingvolumejob/tst_pickboundingvolumejob.cpp | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/tests/auto/render/pickboundingvolumejob/tst_pickboundingvolumejob.cpp b/tests/auto/render/pickboundingvolumejob/tst_pickboundingvolumejob.cpp index 1d391101e..c60ddda27 100644 --- a/tests/auto/render/pickboundingvolumejob/tst_pickboundingvolumejob.cpp +++ b/tests/auto/render/pickboundingvolumejob/tst_pickboundingvolumejob.cpp @@ -1155,6 +1155,56 @@ private Q_SLOTS: arbiter1.events.clear(); arbiter2.events.clear(); } + + void checkParentNoPickerChildPicker() + { + // GIVEN + QmlSceneReader sceneReader(QUrl("qrc:/testscene_parententity.qml")); + QScopedPointer<Qt3DCore::QNode> root(qobject_cast<Qt3DCore::QNode *>(sceneReader.root())); + QVERIFY(root); + + QList<Qt3DRender::QRenderSettings *> renderSettings = root->findChildren<Qt3DRender::QRenderSettings *>(); + QCOMPARE(renderSettings.size(), 1); + Qt3DRender::QPickingSettings *settings = renderSettings.first()->pickingSettings(); + + settings->setPickMethod(Qt3DRender::QPickingSettings::BoundingVolumePicking); + settings->setPickResultMode(Qt3DRender::QPickingSettings::NearestPick); + settings->setFaceOrientationPickingMode(Qt3DRender::QPickingSettings::FrontFace); + + QScopedPointer<Qt3DRender::TestAspect> test(new Qt3DRender::TestAspect(root.data())); + TestArbiter arbiter; + + // Runs Required jobs + runRequiredJobs(test.data()); + + // THEN + // large no pickable object encapsing child and camera should not interfere with smaller picking object + QList<Qt3DRender::QObjectPicker *> pickers = root->findChildren<Qt3DRender::QObjectPicker *>(); + QCOMPARE(pickers.size(), 1); + + Qt3DRender::QObjectPicker *picker = pickers.first(); + QCOMPARE(pickers.first()->objectName(), QLatin1String("Picker")); + + Qt3DRender::Render::ObjectPicker *backendPicker = test->nodeManagers()->objectPickerManager()->lookupResource(picker->id()); + QVERIFY(backendPicker); + Qt3DCore::QBackendNodePrivate::get(backendPicker)->setArbiter(&arbiter); + + // WHEN -> Pressed on object + Qt3DRender::Render::PickBoundingVolumeJob pickBVJob; + initializePickBoundingVolumeJob(&pickBVJob, test.data()); + + QList<QMouseEvent> events; + events.push_back(QMouseEvent(QMouseEvent::MouseButtonPress, QPointF(400.0f, 300.0f), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier)); + pickBVJob.setMouseEvents(events); + bool earlyReturn = !pickBVJob.runHelper(); + + // THEN -> Pressed + QVERIFY(!earlyReturn); + QVERIFY(backendPicker->isPressed()); + QCOMPARE(arbiter.events.count(), 1); + Qt3DCore::QPropertyUpdatedChangePtr change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>(); + QCOMPARE(change->propertyName(), "pressed"); + } }; QTEST_MAIN(tst_PickBoundingVolumeJob) |