diff options
author | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2018-12-04 03:04:11 +0100 |
---|---|---|
committer | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2018-12-04 03:04:11 +0100 |
commit | bcd0640360cbacb0880ee067423aac6727b42e8d (patch) | |
tree | 47dbd4f71bd1a4b6b722c55d0db81d81edf61f20 | |
parent | 21a1469fb6df237ac1475d1b8c973bb601548f68 (diff) | |
parent | 9745006dadf5685f4ff82c6234938e19b9402801 (diff) |
Merge remote-tracking branch 'origin/5.11' into 5.12
Change-Id: I9f4dd807f0179d7bd95a5263e57c37198e7432f4
4 files changed, 100 insertions, 6 deletions
diff --git a/src/render/geometry/qgeometryrenderer.cpp b/src/render/geometry/qgeometryrenderer.cpp index b8572cded..6bff3462f 100644 --- a/src/render/geometry/qgeometryrenderer.cpp +++ b/src/render/geometry/qgeometryrenderer.cpp @@ -136,13 +136,13 @@ QGeometryRendererPrivate::~QGeometryRendererPrivate() /*! \qmlproperty int GeometryRenderer::firstInstance - Holds the first vertex. + Holds the base instance. */ /*! \qmlproperty int GeometryRenderer::firstVertex - Holds the base instance. + Holds the first vertex. */ /*! diff --git a/src/render/jobs/pickboundingvolumejob.cpp b/src/render/jobs/pickboundingvolumejob.cpp index 2f1eb4cd8..2050b8772 100644 --- a/src/render/jobs/pickboundingvolumejob.cpp +++ b/src/render/jobs/pickboundingvolumejob.cpp @@ -232,8 +232,14 @@ bool PickBoundingVolumeJob::runHelper() for (const PickingUtils::ViewportCameraAreaDetails &vca : vcaDetails) { PickingUtils::HitList sphereHits; QRay3D ray = rayForViewportAndCamera(vca, event.first, event.second.pos()); - if (!ray.isValid()) + if (!ray.isValid()) { + // An invalid rays is when we've lost our surface or the mouse + // has moved out of the viewport In case of a button released + // outside of the viewport, we still want to notify the + // lastCurrent entity about this. + dispatchPickEvents(event.second, PickingUtils::HitList(), eventButton, eventButtons, eventModifiers, allHitsRequested); continue; + } PickingUtils::HierarchicalEntityPicker entityPicker(ray); if (entityPicker.collectHits(m_manager, m_node)) { diff --git a/src/render/renderers/opengl/renderer/renderer.cpp b/src/render/renderers/opengl/renderer/renderer.cpp index 743c9a6a8..a1781d1b0 100644 --- a/src/render/renderers/opengl/renderer/renderer.cpp +++ b/src/render/renderers/opengl/renderer/renderer.cpp @@ -1875,14 +1875,14 @@ void Renderer::performDraw(RenderCommand *command) reinterpret_cast<void*>(quintptr(command->m_indexAttributeByteOffset)), command->m_instanceCount, command->m_indexOffset, - command->m_firstVertex); + command->m_firstInstance); } else { Profiling::GLTimeRecorder recorder(Profiling::DrawArray); m_submissionContext->drawArraysInstancedBaseInstance(command->m_primitiveType, - command->m_firstInstance, + command->m_firstVertex, command->m_primitiveCount, command->m_instanceCount, - command->m_firstVertex); + command->m_firstInstance); } } diff --git a/tests/auto/render/pickboundingvolumejob/tst_pickboundingvolumejob.cpp b/tests/auto/render/pickboundingvolumejob/tst_pickboundingvolumejob.cpp index b86df05a4..60b60eb6e 100644 --- a/tests/auto/render/pickboundingvolumejob/tst_pickboundingvolumejob.cpp +++ b/tests/auto/render/pickboundingvolumejob/tst_pickboundingvolumejob.cpp @@ -861,6 +861,94 @@ private Q_SLOTS: arbiter.events.clear(); } + void checkDispatchReleaseEventOnLastPickerWhenMovingOutOfViewport() + { + // GIVEN + QmlSceneReader sceneReader(QUrl("qrc:/testscene_dragenabled.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::TrianglePicking); + settings->setPickResultMode(Qt3DRender::QPickingSettings::NearestPick); + settings->setFaceOrientationPickingMode(Qt3DRender::QPickingSettings::FrontAndBackFace); + + QScopedPointer<Qt3DRender::TestAspect> test(new Qt3DRender::TestAspect(root.data())); + TestArbiter arbiter; + + // Runs Required jobs + runRequiredJobs(test.data()); + + // THEN + QList<Qt3DRender::QObjectPicker *> pickers = root->findChildren<Qt3DRender::QObjectPicker *>(); + QCOMPARE(pickers.size(), 2); + + Qt3DRender::QObjectPicker *picker1 = nullptr; + if (pickers.first()->objectName() == QLatin1String("Picker1")) + picker1 = pickers.first(); + else + picker1 = pickers.last(); + + Qt3DRender::Render::ObjectPicker *backendPicker1 = test->nodeManagers()->objectPickerManager()->lookupResource(picker1->id()); + QVERIFY(backendPicker1); + Qt3DCore::QBackendNodePrivate::get(backendPicker1)->setArbiter(&arbiter); + + // WHEN -> Pressed on object + Qt3DRender::Render::PickBoundingVolumeJob pickBVJob; + initializePickBoundingVolumeJob(&pickBVJob, test.data()); + + QList<QPair<QObject *, QMouseEvent>> events; + events.push_back({nullptr, QMouseEvent(QMouseEvent::MouseButtonPress, QPointF(207.0f, 303.0f), + Qt::LeftButton, Qt::LeftButton, Qt::NoModifier)}); + pickBVJob.setMouseEvents(events); + bool earlyReturn = !pickBVJob.runHelper(); + + // THEN -> Pressed + QVERIFY(!earlyReturn); + QVERIFY(backendPicker1->isPressed()); + QCOMPARE(arbiter.events.count(), 1); + Qt3DCore::QPropertyUpdatedChangePtr change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>(); + QCOMPARE(change->propertyName(), "pressed"); + Qt3DRender::QPickEventPtr pickEvent = change->value().value<Qt3DRender::QPickEventPtr>(); + QVERIFY(pickEvent); + QVERIFY(!Qt3DRender::QPickEventPrivate::get(pickEvent.data())->m_entity.isNull()); + QVERIFY(pickEvent.dynamicCast<Qt3DRender::QPickTriangleEvent>()); + + arbiter.events.clear(); + + // WHEN -> Releasing out of the viewport + events.clear(); + events.push_back({nullptr, QMouseEvent(QMouseEvent::MouseButtonRelease, QPointF(10000.0f, 10000.0f), + Qt::LeftButton, Qt::LeftButton, Qt::NoModifier)}); + pickBVJob.setMouseEvents(events); + earlyReturn = !pickBVJob.runHelper(); + + // THEN -> Should have received released event + QVERIFY(!earlyReturn); + QVERIFY(!backendPicker1->isPressed()); + QCOMPARE(arbiter.events.count(), 1); + change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>(); + QCOMPARE(change->propertyName(), "released"); + pickEvent = change->value().value<Qt3DRender::QPickEventPtr>(); + QVERIFY(pickEvent); + QVERIFY(Qt3DRender::QPickEventPrivate::get(pickEvent.data())->m_entity.isNull()); + + arbiter.events.clear(); + + // WHEN -> Releasing out of the viewport + events.clear(); + events.push_back({nullptr, QMouseEvent(QMouseEvent::MouseButtonRelease, QPointF(10000.0f, 10000.0f), + Qt::LeftButton, Qt::LeftButton, Qt::NoModifier)}); + pickBVJob.setMouseEvents(events); + earlyReturn = !pickBVJob.runHelper(); + + // THEN -> Should have received nothing + QCOMPARE(arbiter.events.count(), 0); + } + void checkDispatchHoverEvent_data() { generateAllPickingSettingsCombinations(); |