summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2018-12-04 03:04:11 +0100
committerQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2018-12-04 03:04:11 +0100
commitbcd0640360cbacb0880ee067423aac6727b42e8d (patch)
tree47dbd4f71bd1a4b6b722c55d0db81d81edf61f20
parent21a1469fb6df237ac1475d1b8c973bb601548f68 (diff)
parent9745006dadf5685f4ff82c6234938e19b9402801 (diff)
Merge remote-tracking branch 'origin/5.11' into 5.12
-rw-r--r--src/render/geometry/qgeometryrenderer.cpp4
-rw-r--r--src/render/jobs/pickboundingvolumejob.cpp8
-rw-r--r--src/render/renderers/opengl/renderer/renderer.cpp6
-rw-r--r--tests/auto/render/pickboundingvolumejob/tst_pickboundingvolumejob.cpp88
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();