From 9dbcefed2a6a709a4490df47fa9dbde6214f622e Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Wed, 4 Feb 2015 23:23:27 +0100 Subject: [PATCH 1/3] Fix for making cursor invisible over the glwidget and js-interface to cursorVisible boolean --- interface/src/Application.cpp | 22 ++----------------- interface/src/Application.h | 3 ++- .../scripting/WindowScriptingInterface.cpp | 7 +++++- .../src/scripting/WindowScriptingInterface.h | 2 ++ interface/src/ui/ApplicationOverlay.cpp | 7 +++--- 5 files changed, 16 insertions(+), 25 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index f1ead1ac4f..9b98d97089 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1940,32 +1940,14 @@ void Application::updateCursor(float deltaTime) { static QPoint lastMousePos = QPoint(); _lastMouseMove = (lastMousePos == QCursor::pos()) ? _lastMouseMove : usecTimestampNow(); - bool hideMouse = false; - bool underMouse = QGuiApplication::topLevelAt(QCursor::pos()) == - Application::getInstance()->getWindow()->windowHandle(); - - static const int HIDE_CURSOR_TIMEOUT = 3 * USECS_PER_SECOND; // 3 second - int elapsed = usecTimestampNow() - _lastMouseMove; - if ((elapsed > HIDE_CURSOR_TIMEOUT) || - (OculusManager::isConnected() && Menu::getInstance()->isOptionChecked(MenuOption::EnableVRMode))) { - hideMouse = underMouse; - } - - setCursorVisible(!hideMouse); lastMousePos = QCursor::pos(); } void Application::setCursorVisible(bool visible) { if (visible) { - if (overrideCursor() != NULL) { - restoreOverrideCursor(); - } + DependencyManager::get()->unsetCursor(); } else { - if (overrideCursor() != NULL) { - changeOverrideCursor(Qt::BlankCursor); - } else { - setOverrideCursor(Qt::BlankCursor); - } + DependencyManager::get()->setCursor(Qt::BlankCursor); } } diff --git a/interface/src/Application.h b/interface/src/Application.h index 113a09e874..46afb802fa 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -187,7 +187,6 @@ public: bool isMousePressed() const { return _mousePressed; } bool isMouseHidden() const { return DependencyManager::get()->cursor().shape() == Qt::BlankCursor; } - void setCursorVisible(bool visible); const glm::vec3& getMouseRayOrigin() const { return _mouseRayOrigin; } const glm::vec3& getMouseRayDirection() const { return _mouseRayDirection; } bool mouseOnScreen() const; @@ -398,6 +397,8 @@ private slots: void audioMuteToggled(); + void setCursorVisible(bool visible); + private: void resetCamerasOnResizeGL(Camera& camera, int width, int height); void updateProjectionMatrix(); diff --git a/interface/src/scripting/WindowScriptingInterface.cpp b/interface/src/scripting/WindowScriptingInterface.cpp index 90ddade472..c4b288347d 100644 --- a/interface/src/scripting/WindowScriptingInterface.cpp +++ b/interface/src/scripting/WindowScriptingInterface.cpp @@ -50,7 +50,12 @@ void WindowScriptingInterface::setFocus() { } void WindowScriptingInterface::setCursorVisible(bool visible) { - Application::getInstance()->setCursorVisible(visible); + QMetaObject::invokeMethod(Application::getInstance(), "setCursorVisible", Qt::BlockingQueuedConnection, + Q_ARG(bool, visible)); +} + +bool WindowScriptingInterface::isCursorVisible() const { + return !Application::getInstance()->isMouseHidden(); } void WindowScriptingInterface::setCursorPosition(int x, int y) { diff --git a/interface/src/scripting/WindowScriptingInterface.h b/interface/src/scripting/WindowScriptingInterface.h index 79a23960c9..0c58523fcc 100644 --- a/interface/src/scripting/WindowScriptingInterface.h +++ b/interface/src/scripting/WindowScriptingInterface.h @@ -27,12 +27,14 @@ class WindowScriptingInterface : public QObject { Q_PROPERTY(int innerHeight READ getInnerHeight) Q_PROPERTY(int x READ getX) Q_PROPERTY(int y READ getY) + Q_PROPERTY(bool cursorVisible READ isCursorVisible) public: static WindowScriptingInterface* getInstance(); int getInnerWidth(); int getInnerHeight(); int getX(); int getY(); + bool isCursorVisible() const; public slots: QScriptValue getCursorPositionX(); diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index 0eeac9a90e..f243401669 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -330,8 +330,9 @@ void ApplicationOverlay::displayOverlayTextureOculus(Camera& whichCamera) { _overlays.buildVBO(_textureFov, _textureAspectRatio, 80, 80); } _overlays.render(); - renderPointersOculus(myAvatar->getDefaultEyePosition()); - + if (!Application::getInstance()->isMouseHidden()) { + renderPointersOculus(myAvatar->getDefaultEyePosition()); + } glDepthMask(GL_TRUE); _overlays.releaseTexture(); glDisable(GL_TEXTURE_2D); @@ -542,7 +543,7 @@ void ApplicationOverlay::renderPointers() { glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, _crosshairTexture); - if (OculusManager::isConnected() && !application->getLastMouseMoveWasSimulated()) { + if (OculusManager::isConnected() && !application->getLastMouseMoveWasSimulated() && !application->isMouseHidden()) { //If we are in oculus, render reticle later if (_lastMouseMove == 0) { _lastMouseMove = usecTimestampNow(); From de3afa06374afca3c0fdfa5551a3fdf46459e810 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Thu, 5 Feb 2015 00:19:45 +0100 Subject: [PATCH 2/3] keep a boolean for cursorHidden state, so we know when to hide the VR-mode-cursor while the normal cursor is hidden --- interface/src/Application.cpp | 16 ++++++++++++---- interface/src/Application.h | 5 ++++- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 9b98d97089..5f0e63bc29 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -228,6 +228,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : _touchAvgX(0.0f), _touchAvgY(0.0f), _isTouchPressed(false), + _cursorVisible(true), _mousePressed(false), _enableProcessOctreeThread(true), _octreeProcessor(), @@ -1473,6 +1474,8 @@ void Application::setEnableVRMode(bool enableVRMode) { auto glCanvas = DependencyManager::get(); resizeGL(glCanvas->getDeviceWidth(), glCanvas->getDeviceHeight()); + + updateCursorVisibility(); } void Application::setLowVelocityFilter(bool lowVelocityFilter) { @@ -1943,14 +1946,19 @@ void Application::updateCursor(float deltaTime) { lastMousePos = QCursor::pos(); } -void Application::setCursorVisible(bool visible) { - if (visible) { - DependencyManager::get()->unsetCursor(); - } else { +void Application::updateCursorVisibility() { + if (!_cursorVisible || Menu::getInstance()->isOptionChecked(MenuOption::EnableVRMode)) { DependencyManager::get()->setCursor(Qt::BlankCursor); + } else { + DependencyManager::get()->unsetCursor(); } } +void Application::setCursorVisible(bool visible) { + _cursorVisible = visible; + updateCursorVisibility(); +} + void Application::update(float deltaTime) { bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings); PerformanceWarning warn(showWarnings, "Application::update()"); diff --git a/interface/src/Application.h b/interface/src/Application.h index 46afb802fa..277e90faad 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -186,7 +186,7 @@ public: EntityTreeRenderer* getEntityClipboardRenderer() { return &_entityClipboardRenderer; } bool isMousePressed() const { return _mousePressed; } - bool isMouseHidden() const { return DependencyManager::get()->cursor().shape() == Qt::BlankCursor; } + bool isMouseHidden() const { return !_cursorVisible; } const glm::vec3& getMouseRayOrigin() const { return _mouseRayOrigin; } const glm::vec3& getMouseRayDirection() const { return _mouseRayDirection; } bool mouseOnScreen() const; @@ -404,6 +404,8 @@ private: void updateProjectionMatrix(); void updateProjectionMatrix(Camera& camera, bool updateViewFrustum = true); + void updateCursorVisibility(); + void sendPingPackets(); void initDisplay(); @@ -515,6 +517,7 @@ private: Environment _environment; + bool _cursorVisible; int _mouseDragStartedX; int _mouseDragStartedY; quint64 _lastMouseMove; From 27147fde2a391414cc34dc048f376a47998d3637 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Fri, 6 Feb 2015 14:45:22 +0100 Subject: [PATCH 3/3] add Write function to the Window.cursurVisible property --- interface/src/scripting/WindowScriptingInterface.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/scripting/WindowScriptingInterface.h b/interface/src/scripting/WindowScriptingInterface.h index 0c58523fcc..66d0ab9306 100644 --- a/interface/src/scripting/WindowScriptingInterface.h +++ b/interface/src/scripting/WindowScriptingInterface.h @@ -27,7 +27,7 @@ class WindowScriptingInterface : public QObject { Q_PROPERTY(int innerHeight READ getInnerHeight) Q_PROPERTY(int x READ getX) Q_PROPERTY(int y READ getY) - Q_PROPERTY(bool cursorVisible READ isCursorVisible) + Q_PROPERTY(bool cursorVisible READ isCursorVisible WRITE setCursorVisible) public: static WindowScriptingInterface* getInstance(); int getInnerWidth();