From 8a0ecf4e6f5957488f824fcc4266446f89285a70 Mon Sep 17 00:00:00 2001 From: druiz17 Date: Mon, 2 Oct 2017 16:46:43 -0700 Subject: [PATCH] propertly determine is laser intersects with HUD UI --- interface/resources/qml/desktop/Desktop.qml | 6 ++--- interface/resources/qml/windows/Frame.qml | 3 ++- libraries/ui/src/OffscreenUi.cpp | 1 - .../controllerModules/farActionGrabEntity.js | 24 +++++++++++++++++-- .../controllerModules/hudOverlayPointer.js | 2 +- 5 files changed, 28 insertions(+), 8 deletions(-) diff --git a/interface/resources/qml/desktop/Desktop.qml b/interface/resources/qml/desktop/Desktop.qml index 6bf832865f..4e8090ce98 100644 --- a/interface/resources/qml/desktop/Desktop.qml +++ b/interface/resources/qml/desktop/Desktop.qml @@ -304,10 +304,10 @@ FocusScope { if (child.visible) { if (child.hasOwnProperty("modality")) { var mappedPoint = child.mapFromGlobal(point.x, point.y); - console.log(mappedPoint); - if (child.contains(mappedPoint)) { + var outLine = child.frame.children[2]; + var framePoint = outLine.mapFromGlobal(point.x, point.y); + if (child.contains(mappedPoint) || outLine.contains(framePoint)) { return true; - console.log(child); } } } diff --git a/interface/resources/qml/windows/Frame.qml b/interface/resources/qml/windows/Frame.qml index 030af974f6..c3b8399e01 100644 --- a/interface/resources/qml/windows/Frame.qml +++ b/interface/resources/qml/windows/Frame.qml @@ -26,6 +26,7 @@ Item { readonly property int frameMarginRight: frame.decoration ? frame.decoration.frameMarginRight : 0 readonly property int frameMarginTop: frame.decoration ? frame.decoration.frameMarginTop : 0 readonly property int frameMarginBottom: frame.decoration ? frame.decoration.frameMarginBottom : 0 + readonly property int offsetCorrection: 20 // Frames always fill their parents, but their decorations may extend // beyond the window via negative margin sizes @@ -73,7 +74,7 @@ Item { Rectangle { id: sizeOutline x: -frameMarginLeft - y: -frameMarginTop + y: -frameMarginTop - offsetCorrection width: window ? window.width + frameMarginLeft + frameMarginRight + 2 : 0 height: window ? window.height + frameMarginTop + frameMarginBottom + 2 : 0 color: hifi.colors.baseGrayHighlight15 diff --git a/libraries/ui/src/OffscreenUi.cpp b/libraries/ui/src/OffscreenUi.cpp index 1cd30132ae..297ed9ca50 100644 --- a/libraries/ui/src/OffscreenUi.cpp +++ b/libraries/ui/src/OffscreenUi.cpp @@ -141,7 +141,6 @@ bool OffscreenUi::isPointOnDesktopWindow(QVariant point) { BLOCKING_INVOKE_METHOD(_desktop, "isPointOnWindow", Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, point)); - qDebug() << "------> invoke method isPointOnWindow <------"; return result.toBool(); } diff --git a/scripts/system/controllers/controllerModules/farActionGrabEntity.js b/scripts/system/controllers/controllerModules/farActionGrabEntity.js index c5b82f75f0..0ef0e67471 100644 --- a/scripts/system/controllers/controllerModules/farActionGrabEntity.js +++ b/scripts/system/controllers/controllerModules/farActionGrabEntity.js @@ -108,13 +108,17 @@ Script.include("/~/system/libraries/controllers.js"); "userData" ]; - + var MARGIN = 25; function FarActionGrabEntity(hand) { this.hand = hand; this.grabbedThingID = null; this.actionID = null; // action this script created... this.entityWithContextOverlay = false; this.contextOverlayTimer = false; + this.reticleMinX = MARGIN; + this.reticleMaxX; + this.reticleMinY = MARGIN; + this.reticleMaxY; var ACTION_TTL = 15; // seconds @@ -344,12 +348,28 @@ Script.include("/~/system/libraries/controllers.js"); this.grabbedThingID = null; }; + this.updateRecommendedArea = function() { + var dims = Controller.getViewportDimensions(); + this.reticleMaxX = dims.x - MARGIN; + this.reticleMaxY = dims.y - MARGIN; + }; + + this.calculateNewReticlePosition = function(intersection) { + this.updateRecommendedArea(); + var point2d = HMD.overlayFromWorldPoint(intersection); + point2d.x = Math.max(this.reticleMinX, Math.min(point2d.x, this.reticleMaxX)); + point2d.y = Math.max(this.reticleMinY, Math.min(point2d.y, this.reticleMaxY)); + return point2d; + }; + this.notPointingAtEntity = function(controllerData) { var intersection = controllerData.rayPicks[this.hand]; var entityProperty = Entities.getEntityProperties(intersection.objectID); var entityType = entityProperty.type; + var hudRayPick = controllerData.hudRayPicks[this.hand]; + var point2d = this.calculateNewReticlePosition(hudRayPick.intersection); if ((intersection.type === RayPick.INTERSECTED_ENTITY && entityType === "Web") || - intersection.type === RayPick.INTERSECTED_OVERLAY) { + intersection.type === RayPick.INTERSECTED_OVERLAY || Window.isPointOnDesktopWindow(point2d)) { return true; } return false; diff --git a/scripts/system/controllers/controllerModules/hudOverlayPointer.js b/scripts/system/controllers/controllerModules/hudOverlayPointer.js index d286f26108..add673df0c 100644 --- a/scripts/system/controllers/controllerModules/hudOverlayPointer.js +++ b/scripts/system/controllers/controllerModules/hudOverlayPointer.js @@ -178,7 +178,7 @@ } var hudRayPick = controllerData.hudRayPicks[this.hand]; var point2d = this.calculateNewReticlePosition(hudRayPick.intersection); - if (!Window.isPointOnDesktopWindow(point2d)) { + if (!Window.isPointOnDesktopWindow(point2d) && !controllerData.triggerClicks[this.hand]) { this.exitModule(); return false; }