From 406ea4134444a05dd89f215b3144181c0b0ce924 Mon Sep 17 00:00:00 2001 From: Paul Lemire Date: Thu, 29 Jul 2021 15:19:59 +0200 Subject: Picking: reuse LayerFilterJob to perform layer filtering This fixes picking for cases where multiple LayerFilters using different filter modes are present in the FrameGraph. This also reduces code duplication. Pick-to: 6.2 6.1 5.15 Change-Id: I19d0c2c5777930820ab950cbf2bfe08ef7d2484f Reviewed-by: Mike Krus --- .../render/pickboundingvolumejob/CMakeLists.txt | 1 + .../pickboundingvolumejob.qrc | 1 + .../testscene_nested_layerfilter.qml | 233 +++++++++++++++++ .../tst_pickboundingvolumejob.cpp | 288 +++++++++++++++++++++ .../render/raycastingjob/tst_raycastingjob.cpp | 5 + 5 files changed, 528 insertions(+) create mode 100644 tests/auto/render/pickboundingvolumejob/testscene_nested_layerfilter.qml (limited to 'tests') diff --git a/tests/auto/render/pickboundingvolumejob/CMakeLists.txt b/tests/auto/render/pickboundingvolumejob/CMakeLists.txt index 25491ba9f..4e3404870 100644 --- a/tests/auto/render/pickboundingvolumejob/CMakeLists.txt +++ b/tests/auto/render/pickboundingvolumejob/CMakeLists.txt @@ -40,6 +40,7 @@ set(pickboundingvolumejob_resource_files "testscene_priorityoverlapping.qml" "testscene_viewports.qml" "testscene_layerfilter.qml" + "testscene_nested_layerfilter.qml" ) qt_internal_add_resource(tst_pickboundingvolumejob "pickboundingvolumejob" diff --git a/tests/auto/render/pickboundingvolumejob/pickboundingvolumejob.qrc b/tests/auto/render/pickboundingvolumejob/pickboundingvolumejob.qrc index 76150da31..63bc4be80 100644 --- a/tests/auto/render/pickboundingvolumejob/pickboundingvolumejob.qrc +++ b/tests/auto/render/pickboundingvolumejob/pickboundingvolumejob.qrc @@ -12,5 +12,6 @@ testscene_cameraposition.qml testscene_priorityoverlapping.qml testscene_nopicking.qml + testscene_nested_layerfilter.qml 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 98bf268bb..df0eab407 100644 --- a/tests/auto/render/pickboundingvolumejob/tst_pickboundingvolumejob.cpp +++ b/tests/auto/render/pickboundingvolumejob/tst_pickboundingvolumejob.cpp @@ -60,6 +60,7 @@ #include #include #include +#include #include #include #include @@ -231,6 +232,10 @@ void runRequiredJobs(Qt3DRender::TestAspect *test) expandBVolume.setRoot(test->sceneRoot()); expandBVolume.setManagers(test->nodeManagers()); expandBVolume.run(); + + Qt3DRender::Render::UpdateEntityLayersJob updateEntityLayer; + updateEntityLayer.setManager(test->nodeManagers()); + updateEntityLayer.run(); } void initializePickBoundingVolumeJob(Qt3DRender::Render::PickBoundingVolumeJob *job, Qt3DRender::TestAspect *test) @@ -1660,6 +1665,289 @@ private Q_SLOTS: } } + void checkPickerAndNestedLayerFilters() + { + // GIVEN + QmlSceneReader sceneReader(QUrl("qrc:/testscene_nested_layerfilter.qml")); + QScopedPointer root(qobject_cast(sceneReader.root())); + QVERIFY(root); + + QScopedPointer 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 pickers = root->findChildren(); + 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 + { + auto event = QMouseEvent(QMouseEvent::MouseButtonPress, QPointF(200.0f, 300.0f), + Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); + pickBVJob.processMouseEvent(nullptr, &event); + 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); + + auto event2 = QMouseEvent(QMouseEvent::MouseButtonRelease, QPointF(200.0f, 300.0f), + Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); + pickBVJob.processMouseEvent(nullptr, &event2); + pickBVJob.runHelper(); + } + + // WHEN -> Pressed on object2 in VP2 + { + auto event = QMouseEvent(QMouseEvent::MouseButtonPress, QPointF(541.0f, 183.0f), + Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); + pickBVJob.processMouseEvent(nullptr, &event); + 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); + + auto event2 = QMouseEvent(QMouseEvent::MouseButtonRelease, QPointF(541.0f, 183.0f), + Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); + pickBVJob.processMouseEvent(nullptr, &event2); + pickBVJob.runHelper(); + } + + // WHEN -> Pressed on object3 in VP1 + { + auto event = QMouseEvent(QMouseEvent::MouseButtonPress, QPointF(80.0f, 150.0f), + Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); + pickBVJob.processMouseEvent(nullptr, &event); + 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 + { + auto event = QMouseEvent(QMouseEvent::MouseButtonPress, QPointF(504.0f, 263.0f), + Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); + pickBVJob.processMouseEvent(nullptr, &event); + 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 + { + auto event = QMouseEvent(QMouseEvent::MouseButtonPress, QPointF(160.0f, 431.0f), + Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); + pickBVJob.processMouseEvent(nullptr, &event); + 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); + + auto event2 = QMouseEvent(QMouseEvent::MouseButtonRelease, QPointF(160.0f, 431.0f), + Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); + pickBVJob.processMouseEvent(nullptr, &event2); + pickBVJob.runHelper(); + } + + // WHEN -> Pressed on object4 in VP2 + { + auto event = QMouseEvent(QMouseEvent::MouseButtonPress, QPointF(447.0f, 472.0f), + Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); + pickBVJob.processMouseEvent(nullptr, &event); + 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); + + auto event2 = QMouseEvent(QMouseEvent::MouseButtonRelease, QPointF(447.0f, 472.0f), + Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); + pickBVJob.processMouseEvent(nullptr, &event2); + pickBVJob.runHelper(); + } + + // WHEN -> Pressed on object5 in VP1 + { + auto event = QMouseEvent(QMouseEvent::MouseButtonPress, QPointF(153.0f, 195.0f), + Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); + pickBVJob.processMouseEvent(nullptr, &event); + 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); + + auto event2 = QMouseEvent(QMouseEvent::MouseButtonRelease, QPointF(153.0f, 195.0f), + Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); + pickBVJob.processMouseEvent(nullptr, &event2); + pickBVJob.runHelper(); + } + } + void checkMultipleRayDirections_data() { QTest::addColumn("cameraOrigin"); diff --git a/tests/auto/render/raycastingjob/tst_raycastingjob.cpp b/tests/auto/render/raycastingjob/tst_raycastingjob.cpp index 71b6427a1..72746b219 100644 --- a/tests/auto/render/raycastingjob/tst_raycastingjob.cpp +++ b/tests/auto/render/raycastingjob/tst_raycastingjob.cpp @@ -56,6 +56,7 @@ #include #include #include +#include #include #include @@ -229,6 +230,10 @@ void runRequiredJobs(Qt3DRender::TestAspect *test) expandBVolume.setRoot(test->sceneRoot()); expandBVolume.setManagers(test->nodeManagers()); expandBVolume.run(); + + Qt3DRender::Render::UpdateEntityLayersJob updateEntityLayer; + updateEntityLayer.setManager(test->nodeManagers()); + updateEntityLayer.run(); } void initializeJob(Qt3DRender::Render::RayCastingJob *job, Qt3DRender::TestAspect *test) -- cgit v1.2.3