diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 3c1806b00b..233c715421 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -230,6 +230,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(), @@ -1480,6 +1481,8 @@ void Application::setEnableVRMode(bool enableVRMode) { auto glCanvas = DependencyManager::get(); resizeGL(glCanvas->getDeviceWidth(), glCanvas->getDeviceHeight()); + + updateCursorVisibility(); } void Application::setLowVelocityFilter(bool lowVelocityFilter) { @@ -1947,35 +1950,22 @@ 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(); - } +void Application::updateCursorVisibility() { + if (!_cursorVisible || Menu::getInstance()->isOptionChecked(MenuOption::EnableVRMode)) { + DependencyManager::get()->setCursor(Qt::BlankCursor); } else { - if (overrideCursor() != NULL) { - changeOverrideCursor(Qt::BlankCursor); - } else { - setOverrideCursor(Qt::BlankCursor); - } + 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 113a09e874..277e90faad 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -186,8 +186,7 @@ public: EntityTreeRenderer* getEntityClipboardRenderer() { return &_entityClipboardRenderer; } bool isMousePressed() const { return _mousePressed; } - bool isMouseHidden() const { return DependencyManager::get()->cursor().shape() == Qt::BlankCursor; } - void setCursorVisible(bool visible); + bool isMouseHidden() const { return !_cursorVisible; } const glm::vec3& getMouseRayOrigin() const { return _mouseRayOrigin; } const glm::vec3& getMouseRayDirection() const { return _mouseRayDirection; } bool mouseOnScreen() const; @@ -398,11 +397,15 @@ private slots: void audioMuteToggled(); + void setCursorVisible(bool visible); + private: void resetCamerasOnResizeGL(Camera& camera, int width, int height); void updateProjectionMatrix(); void updateProjectionMatrix(Camera& camera, bool updateViewFrustum = true); + void updateCursorVisibility(); + void sendPingPackets(); void initDisplay(); @@ -514,6 +517,7 @@ private: Environment _environment; + bool _cursorVisible; int _mouseDragStartedX; int _mouseDragStartedY; quint64 _lastMouseMove; 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..66d0ab9306 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 WRITE setCursorVisible) 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 6e95327165..2ef75580d4 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();