From aa8979570c56b4bcafc393af4c3c52d32e90ff2d Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Fri, 2 Oct 2015 00:05:15 -0700 Subject: [PATCH] Working on 2D overlay mouse interaction --- examples/tests/dot.png | Bin 0 -> 8081 bytes examples/tests/overlayMouseTrackingTest.js | 46 ++++++++++++++++++ interface/src/Application.cpp | 31 ++++++++++-- interface/src/ui/overlays/Overlays.cpp | 17 +++++-- interface/src/ui/overlays/Overlays.h | 4 ++ .../render-utils/src/OffscreenQmlSurface.cpp | 14 ++++-- .../render-utils/src/OffscreenQmlSurface.h | 1 + 7 files changed, 100 insertions(+), 13 deletions(-) create mode 100644 examples/tests/dot.png create mode 100644 examples/tests/overlayMouseTrackingTest.js diff --git a/examples/tests/dot.png b/examples/tests/dot.png new file mode 100644 index 0000000000000000000000000000000000000000..4ccfdc80dfbe24bd89447f2dbc3f045f0d01395b GIT binary patch literal 8081 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 literal 0 HcmV?d00001 diff --git a/examples/tests/overlayMouseTrackingTest.js b/examples/tests/overlayMouseTrackingTest.js new file mode 100644 index 0000000000..d18fcfb599 --- /dev/null +++ b/examples/tests/overlayMouseTrackingTest.js @@ -0,0 +1,46 @@ +MouseTracker = function() { + this.WIDTH = 60; + this.HEIGHT = 60; + + this.overlay = Overlays.addOverlay("image", { + imageURL: Script.resolvePath("dot.png"), + width: this.HEIGHT, + height: this.WIDTH, + x: 100, + y: 100, + visible: true + }); + + var that = this; + Script.scriptEnding.connect(function() { + that.onCleanup(); + }); + + Controller.mousePressEvent.connect(function(event) { + that.onMousePress(event); + }); + + Controller.mouseMoveEvent.connect(function(event) { + that.onMouseMove(event); + }); +} + +MouseTracker.prototype.onCleanup = function() { + Overlays.deleteOverlay(this.overlay); +} + +MouseTracker.prototype.onMousePress = function(event) { +} + +MouseTracker.prototype.onMouseMove = function(event) { + var width = Overlays.width(); + var height = Overlays.height(); + var x = Math.max(event.x, 0); + x = Math.min(x, width); + var y = Math.max(event.y, 0); + y = Math.min(y, height); + Overlays.editOverlay(this.overlay, {x: x - this.WIDTH / 2.0, y: y - this.HEIGHT / 2.0}); +} + + +new MouseTracker(); \ No newline at end of file diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 2a8f7cf8b5..5f127988e9 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1849,8 +1849,16 @@ void Application::mouseMoveEvent(QMouseEvent* event, unsigned int deviceID) { _entities.mouseMoveEvent(event, deviceID); + { + auto offscreenUi = DependencyManager::get(); + QPointF transformedPos = offscreenUi->mapToVirtualScreen(event->localPos(), _glWidget); + QMouseEvent mappedEvent(event->type(), + transformedPos, + event->screenPos(), event->button(), + event->buttons(), event->modifiers()); + _controllerScriptingInterface.emitMouseMoveEvent(&mappedEvent, deviceID); // send events to any registered scripts + } - _controllerScriptingInterface.emitMouseMoveEvent(event, deviceID); // 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; @@ -1865,12 +1873,19 @@ void Application::mouseMoveEvent(QMouseEvent* event, unsigned int deviceID) { void Application::mousePressEvent(QMouseEvent* event, unsigned int deviceID) { // Inhibit the menu if the user is using alt-mouse dragging _altPressed = false; - if (!_aboutToQuit) { _entities.mousePressEvent(event, deviceID); } - _controllerScriptingInterface.emitMousePressEvent(event); // send events to any registered scripts + { + auto offscreenUi = DependencyManager::get(); + QPointF transformedPos = offscreenUi->mapToVirtualScreen(event->localPos(), _glWidget); + QMouseEvent mappedEvent(event->type(), + transformedPos, + event->screenPos(), event->button(), + event->buttons(), event->modifiers()); + _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()) { @@ -1921,7 +1936,15 @@ void Application::mouseReleaseEvent(QMouseEvent* event, unsigned int deviceID) { _entities.mouseReleaseEvent(event, deviceID); } - _controllerScriptingInterface.emitMouseReleaseEvent(event); // send events to any registered scripts + { + auto offscreenUi = DependencyManager::get(); + QPointF transformedPos = offscreenUi->mapToVirtualScreen(event->localPos(), _glWidget); + QMouseEvent mappedEvent(event->type(), + transformedPos, + event->screenPos(), event->button(), + event->buttons(), event->modifiers()); + _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()) { diff --git a/interface/src/ui/overlays/Overlays.cpp b/interface/src/ui/overlays/Overlays.cpp index bc786f3f4c..db3360cbbf 100644 --- a/interface/src/ui/overlays/Overlays.cpp +++ b/interface/src/ui/overlays/Overlays.cpp @@ -10,7 +10,7 @@ #include "Overlays.h" -#include +#include #include @@ -31,6 +31,7 @@ #include "TextOverlay.h" #include "Text3DOverlay.h" #include "Web3DOverlay.h" +#include Overlays::Overlays() : _nextOverlayID(1) { @@ -331,10 +332,6 @@ void Overlays::setParentPanel(unsigned int childId, unsigned int panelId) { unsigned int Overlays::getOverlayAtPoint(const glm::vec2& point) { glm::vec2 pointCopy = point; - if (qApp->isHMDMode()) { - pointCopy = qApp->getApplicationCompositor().screenToOverlay(point); - } - QReadLocker lock(&_lock); if (!_enabled) { return 0; @@ -607,3 +604,13 @@ void Overlays::deletePanel(unsigned int panelId) { bool Overlays::isAddedOverlay(unsigned int id) { return _overlaysHUD.contains(id) || _overlaysWorld.contains(id); } + +float Overlays::width() const { + auto offscreenUi = DependencyManager::get(); + return offscreenUi->getWindow()->size().width(); +} + +float Overlays::height() const { + auto offscreenUi = DependencyManager::get(); + return offscreenUi->getWindow()->size().height(); +} \ No newline at end of file diff --git a/interface/src/ui/overlays/Overlays.h b/interface/src/ui/overlays/Overlays.h index 5bd8098150..62f00b8989 100644 --- a/interface/src/ui/overlays/Overlays.h +++ b/interface/src/ui/overlays/Overlays.h @@ -113,6 +113,10 @@ public slots: /// overlay; in meters if it is a 3D text overlay QSizeF textSize(unsigned int id, const QString& text) const; + // Return the size of the virtual screen + float width() const; + float height() const; + /// adds a panel that has already been created unsigned int addPanel(OverlayPanel::Pointer panel); diff --git a/libraries/render-utils/src/OffscreenQmlSurface.cpp b/libraries/render-utils/src/OffscreenQmlSurface.cpp index 9923849aab..3f940d8569 100644 --- a/libraries/render-utils/src/OffscreenQmlSurface.cpp +++ b/libraries/render-utils/src/OffscreenQmlSurface.cpp @@ -496,6 +496,13 @@ QPointF OffscreenQmlSurface::mapWindowToUi(const QPointF& sourcePosition, QObjec return QPointF(offscreenPosition.x, offscreenPosition.y); } +QPointF OffscreenQmlSurface::mapToVirtualScreen(const QPointF& originalPoint, QObject* originalWidget) { + QPointF transformedPos = _mouseTranslator(originalPoint); + transformedPos = mapWindowToUi(transformedPos, originalWidget); + return transformedPos; +} + + /////////////////////////////////////////////////////// // // Event handling customization @@ -541,8 +548,9 @@ bool OffscreenQmlSurface::eventFilter(QObject* originalDestination, QEvent* even case QEvent::Wheel: { QWheelEvent* wheelEvent = static_cast(event); + QPointF transformedPos = mapToVirtualScreen(wheelEvent->pos(), originalDestination); QWheelEvent mappedEvent( - mapWindowToUi(wheelEvent->pos(), originalDestination), + transformedPos, wheelEvent->delta(), wheelEvent->buttons(), wheelEvent->modifiers(), wheelEvent->orientation()); mappedEvent.ignore(); @@ -558,9 +566,7 @@ bool OffscreenQmlSurface::eventFilter(QObject* originalDestination, QEvent* even case QEvent::MouseButtonRelease: case QEvent::MouseMove: { QMouseEvent* mouseEvent = static_cast(event); - QPointF originalPos = mouseEvent->localPos(); - QPointF transformedPos = _mouseTranslator(originalPos); - transformedPos = mapWindowToUi(transformedPos, originalDestination); + QPointF transformedPos = mapToVirtualScreen(mouseEvent->localPos(), originalDestination); QMouseEvent mappedEvent(mouseEvent->type(), transformedPos, mouseEvent->screenPos(), mouseEvent->button(), diff --git a/libraries/render-utils/src/OffscreenQmlSurface.h b/libraries/render-utils/src/OffscreenQmlSurface.h index 13e467bccd..01dd2b88f9 100644 --- a/libraries/render-utils/src/OffscreenQmlSurface.h +++ b/libraries/render-utils/src/OffscreenQmlSurface.h @@ -61,6 +61,7 @@ public: QQuickWindow* getWindow(); QObject* getEventHandler(); + QPointF mapToVirtualScreen(const QPointF& originalPoint, QObject* originalWidget); virtual bool eventFilter(QObject* originalDestination, QEvent* event); signals: