diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2016-08-02 16:25:00 +0200 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2016-08-27 17:31:00 +0000 |
commit | 9cda22c9b612492d13ac547925c4da14dc193e8b (patch) | |
tree | e6f71fe998f4ae92766c41508795904eb9db3026 /src | |
parent | 21e3550a6ea575299e69a9065b0426dabbea5b51 (diff) |
PickBoundingVolumeJob: only perform picking test when needed
Sometimes, dragEnabled may be disabled on an ObjectPicker. If
the only mouse events we get for a frame are of that type, then we can just
skip picking for the frame.
Change-Id: Ia24d1b165b0f6a8b2fc7e4d7a909dfe1c5c683aa
Reviewed-by: Kevin Ottens <kevin.ottens@kdab.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/render/jobs/pickboundingvolumejob.cpp | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/src/render/jobs/pickboundingvolumejob.cpp b/src/render/jobs/pickboundingvolumejob.cpp index 11faf5138..19f1d2b1c 100644 --- a/src/render/jobs/pickboundingvolumejob.cpp +++ b/src/render/jobs/pickboundingvolumejob.cpp @@ -425,9 +425,39 @@ void PickBoundingVolumeJob::run() ViewportCameraAreaGatherer vcaGatherer; const QVector<ViewportCameraAreaTriplet> vcaTriplets = vcaGatherer.gather(m_renderer->frameGraphRoot()); - EntityGatherer entitiesGatherer(m_node); if (!vcaTriplets.empty()) { + bool hasMoveEvent = false; + bool hasOtherEvent = false; + + for (const QMouseEvent &event : mouseEvents) { + const bool isMove = (event.type() == QEvent::MouseMove); + hasMoveEvent |= isMove; + hasOtherEvent |= !isMove; + } + + // We gather when we have a click/release event or a move + // event and a QObjectPicker enabled to receive it + ObjectPicker *lastCurrentPicker = m_manager->objectPickerManager()->data(m_currentPicker); + + // In the case we have a move event, find if we actually have + // an object picker that cares about these + if (!hasOtherEvent) { + // The only way to set lastCurrentPicker is to click + // so we can return since if we're there it means we + // have only move events + if (lastCurrentPicker == nullptr) + return; + + const bool caresAboutMove = (hasMoveEvent && lastCurrentPicker->isDragEnabled()); + // Early return if the current object picker doesn't care about move events + if (!caresAboutMove) + return; + } + + // Gather the entities for the frame + EntityGatherer entitiesGatherer(m_node); + for (const QMouseEvent &event : mouseEvents) { QPickEvent::Buttons eventButton = QPickEvent::NoButton; switch (event.button()) { @@ -459,7 +489,7 @@ void PickBoundingVolumeJob::run() eventModifiers |= QPickEvent::KeypadModifier; m_hoveredPickersToClear = m_hoveredPickers; - ObjectPicker *lastCurrentPicker = m_manager->objectPickerManager()->data(m_currentPicker); + lastCurrentPicker = m_manager->objectPickerManager()->data(m_currentPicker); for (const ViewportCameraAreaTriplet &vca : vcaTriplets) { typedef AbstractCollisionGathererFunctor::result_type HitList; |