diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 02291cc619..bff2a6bae0 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3097,17 +3097,23 @@ void Application::mouseMoveEvent(QMouseEvent* event) { if (compositor.getReticleVisible() || !isHMDMode() || !compositor.getReticleOverDesktop() || getOverlays().getOverlayAtPoint(glm::vec2(transformedPos.x(), transformedPos.y())) != UNKNOWN_OVERLAY_ID) { - getOverlays().mouseMoveEvent(&mappedEvent); - getEntities()->mouseMoveEvent(&mappedEvent); + if (_mouseToOverlays) { + getOverlays().mouseMoveEvent(&mappedEvent); + } else { + getEntities()->mouseMoveEvent(&mappedEvent); + } + } + + if (!_mouseToOverlays) { + _controllerScriptingInterface->emitMouseMoveEvent(&mappedEvent); // send events to any registered scripts } - _controllerScriptingInterface->emitMouseMoveEvent(&mappedEvent); // send events to any registered scripts // if one of our scripts have asked to capture this event, then stop processing it if (_controllerScriptingInterface->isMouseCaptured()) { return; } - if (_keyboardMouseDevice->isActive()) { + if (!_mouseToOverlays && _keyboardMouseDevice->isActive()) { _keyboardMouseDevice->mouseMoveEvent(event); } } @@ -3115,6 +3121,7 @@ void Application::mouseMoveEvent(QMouseEvent* event) { void Application::mousePressEvent(QMouseEvent* event) { // Inhibit the menu if the user is using alt-mouse dragging _altPressed = false; + _mouseToOverlays = false; auto offscreenUi = DependencyManager::get(); // If we get a mouse press event it means it wasn't consumed by the offscreen UI, @@ -3131,21 +3138,23 @@ void Application::mousePressEvent(QMouseEvent* event) { event->buttons(), event->modifiers()); if (!_aboutToQuit) { - getOverlays().mousePressEvent(&mappedEvent); - - if (!_controllerScriptingInterface->areEntityClicksCaptured()) { + if (getOverlays().mousePressEvent(&mappedEvent)) { + _mouseToOverlays = true; + } else if (!_controllerScriptingInterface->areEntityClicksCaptured()) { getEntities()->mousePressEvent(&mappedEvent); } } - _controllerScriptingInterface->emitMousePressEvent(&mappedEvent); // send events to any registered scripts + if (!_mouseToOverlays) { + _controllerScriptingInterface->emitMousePressEvent(&mappedEvent); // send events to any registered scripts + } // if one of our scripts have asked to capture this event, then stop processing it if (_controllerScriptingInterface->isMouseCaptured()) { return; } - if (hasFocus()) { + if (!_mouseToOverlays && hasFocus()) { if (_keyboardMouseDevice->isActive()) { _keyboardMouseDevice->mousePressEvent(event); } @@ -3179,18 +3188,23 @@ void Application::mouseReleaseEvent(QMouseEvent* event) { event->buttons(), event->modifiers()); if (!_aboutToQuit) { - getOverlays().mouseReleaseEvent(&mappedEvent); - getEntities()->mouseReleaseEvent(&mappedEvent); + if (_mouseToOverlays) { + getOverlays().mouseReleaseEvent(&mappedEvent); + } else { + getEntities()->mouseReleaseEvent(&mappedEvent); + } } - _controllerScriptingInterface->emitMouseReleaseEvent(&mappedEvent); // send events to any registered scripts + if (!_mouseToOverlays) { + _controllerScriptingInterface->emitMouseReleaseEvent(&mappedEvent); // send events to any registered scripts + } // if one of our scripts have asked to capture this event, then stop processing it if (_controllerScriptingInterface->isMouseCaptured()) { return; } - if (hasFocus()) { + if (!_mouseToOverlays && hasFocus()) { if (_keyboardMouseDevice->isActive()) { _keyboardMouseDevice->mouseReleaseEvent(event); } diff --git a/interface/src/Application.h b/interface/src/Application.h index 13c1458aee..fa98f6bd6e 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -676,6 +676,8 @@ private: void addAssetToWorldInfoDone(QString modelName); void addAssetToWorldError(QString modelName, QString errorText); + bool _mouseToOverlays { false }; + QQuickItem* _addAssetToWorldMessageBox{ nullptr }; QStringList _addAssetToWorldInfoKeys; // Model name QStringList _addAssetToWorldInfoMessages; // Info message diff --git a/interface/src/ui/overlays/Overlays.cpp b/interface/src/ui/overlays/Overlays.cpp index 9d2f52bc81..dc1380adb9 100644 --- a/interface/src/ui/overlays/Overlays.cpp +++ b/interface/src/ui/overlays/Overlays.cpp @@ -760,7 +760,7 @@ RayToOverlayIntersectionResult Overlays::findRayIntersectionForMouseEvent(PickRa return findRayIntersection(ray); } -void Overlays::mousePressEvent(QMouseEvent* event) { +bool Overlays::mousePressEvent(QMouseEvent* event) { PerformanceTimer perfTimer("Overlays::mousePressEvent"); PickRay ray = qApp->computePickRay(event->x(), event->y()); @@ -773,15 +773,14 @@ void Overlays::mousePressEvent(QMouseEvent* event) { if (thisOverlay) { auto pointerEvent = calculatePointerEvent(thisOverlay, ray, rayPickResult, event, PointerEvent::Press); emit mousePressOnOverlay(_currentClickingOnOverlayID, pointerEvent); - } else { - emit mousePressOffOverlay(); + return true; } - } else { - emit mousePressOffOverlay(); } + emit mousePressOffOverlay(); + return false; } -void Overlays::mouseReleaseEvent(QMouseEvent* event) { +bool Overlays::mouseReleaseEvent(QMouseEvent* event) { PerformanceTimer perfTimer("Overlays::mouseReleaseEvent"); PickRay ray = qApp->computePickRay(event->x(), event->y()); @@ -797,9 +796,10 @@ void Overlays::mouseReleaseEvent(QMouseEvent* event) { } _currentClickingOnOverlayID = UNKNOWN_OVERLAY_ID; + return false; } -void Overlays::mouseMoveEvent(QMouseEvent* event) { +bool Overlays::mouseMoveEvent(QMouseEvent* event) { PerformanceTimer perfTimer("Overlays::mouseMoveEvent"); PickRay ray = qApp->computePickRay(event->x(), event->y()); @@ -843,6 +843,7 @@ void Overlays::mouseMoveEvent(QMouseEvent* event) { _currentHoverOverOverlayID = UNKNOWN_OVERLAY_ID; } } + return false; } QVector Overlays::findOverlays(const glm::vec3& center, float radius) const { diff --git a/interface/src/ui/overlays/Overlays.h b/interface/src/ui/overlays/Overlays.h index 865df6309a..5c22e46880 100644 --- a/interface/src/ui/overlays/Overlays.h +++ b/interface/src/ui/overlays/Overlays.h @@ -100,9 +100,9 @@ public: OverlayID addOverlay(Overlay* overlay) { return addOverlay(Overlay::Pointer(overlay)); } OverlayID addOverlay(Overlay::Pointer overlay); - void mousePressEvent(QMouseEvent* event); - void mouseReleaseEvent(QMouseEvent* event); - void mouseMoveEvent(QMouseEvent* event); + bool mousePressEvent(QMouseEvent* event); + bool mouseReleaseEvent(QMouseEvent* event); + bool mouseMoveEvent(QMouseEvent* event); void cleanupAllOverlays(); diff --git a/scripts/system/controllers/grab.js b/scripts/system/controllers/grab.js index 74a3c3d25b..f0b6663bec 100644 --- a/scripts/system/controllers/grab.js +++ b/scripts/system/controllers/grab.js @@ -331,6 +331,12 @@ Grabber.prototype.pressEvent = function(event) { } var pickRay = Camera.computePickRay(event.x, event.y); + + var overlayResult = Overlays.findRayIntersection(pickRay, true, [HMD.tabletID, HMD.tabletScreenID, HMD.homeButtonID]); + if (overlayResult.intersects) { + return; + } + var pickResults = Entities.findRayIntersection(pickRay, true); // accurate picking if (!pickResults.intersects) { // didn't click on anything diff --git a/scripts/system/edit.js b/scripts/system/edit.js index da39edf8ba..ad3af3a659 100644 --- a/scripts/system/edit.js +++ b/scripts/system/edit.js @@ -564,6 +564,11 @@ function findClickedEntity(event) { var pickRay = Camera.computePickRay(event.x, event.y); + var overlayResult = Overlays.findRayIntersection(pickRay, true, [HMD.tabletID, HMD.tabletScreenID, HMD.homeButtonID]); + if (overlayResult.intersects) { + return null; + } + var entityResult = Entities.findRayIntersection(pickRay, true); // want precision picking var lightResult = lightOverlayManager.findRayIntersection(pickRay); lightResult.accurate = true; diff --git a/scripts/system/libraries/entitySelectionTool.js b/scripts/system/libraries/entitySelectionTool.js index b9bae72d14..9c1626caf4 100644 --- a/scripts/system/libraries/entitySelectionTool.js +++ b/scripts/system/libraries/entitySelectionTool.js @@ -3866,6 +3866,12 @@ SelectionDisplay = (function() { var somethingClicked = false; var pickRay = generalComputePickRay(event.x, event.y); + var result = Overlays.findRayIntersection(pickRay, true, [HMD.tabletID, HMD.tabletScreenID, HMD.homeButtonID]); + if (result.intersects) { + // mouse clicks on the tablet should override the edit affordances + return false; + } + // before we do a ray test for grabbers, disable the ray intersection for our selection box Overlays.editOverlay(selectionBox, { ignoreRayIntersection: true