summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2016-08-02 16:25:00 +0200
committerPaul Lemire <paul.lemire@kdab.com>2016-08-27 17:31:00 +0000
commit9cda22c9b612492d13ac547925c4da14dc193e8b (patch)
treee6f71fe998f4ae92766c41508795904eb9db3026 /src
parent21e3550a6ea575299e69a9065b0426dabbea5b51 (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.cpp34
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;