diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 4449acd6ad..af1e3a5b44 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -159,6 +159,7 @@ const bool DEFAULT_DESKTOP_TABLET_BECOMES_TOOLBAR = true; const bool DEFAULT_HMD_TABLET_BECOMES_TOOLBAR = false; const bool DEFAULT_PREFER_STYLUS_OVER_LASER = false; const bool DEFAULT_PREFER_AVATAR_FINGER_OVER_STYLUS = false; +const bool DEFAULT_MOUSE_CAPTURE_VR = false; const bool DEFAULT_SHOW_GRAPHICS_ICON = true; const bool DEFAULT_MINI_TABLET_ENABLED = false; const bool DEFAULT_AWAY_STATE_WHEN_FOCUS_LOST_IN_VR_ENABLED = true; @@ -225,6 +226,7 @@ Application::Application( _hmdTabletBecomesToolbarSetting("hmdTabletBecomesToolbar", DEFAULT_HMD_TABLET_BECOMES_TOOLBAR), _preferStylusOverLaserSetting("preferStylusOverLaser", DEFAULT_PREFER_STYLUS_OVER_LASER), _preferAvatarFingerOverStylusSetting("preferAvatarFingerOverStylus", DEFAULT_PREFER_AVATAR_FINGER_OVER_STYLUS), + _defaultMouseCaptureVR("defaultMouseCaptureVR", DEFAULT_MOUSE_CAPTURE_VR), _showGraphicsIconSetting("showGraphicsIcon", DEFAULT_SHOW_GRAPHICS_ICON), _constrainToolbarPosition("toolbar/constrainToolbarToCenterX", true), _awayStateWhenFocusLostInVREnabled("awayStateWhenFocusLostInVREnabled", DEFAULT_AWAY_STATE_WHEN_FOCUS_LOST_IN_VR_ENABLED), diff --git a/interface/src/Application.h b/interface/src/Application.h index 613ad3f1b8..5b911b4b9f 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -188,6 +188,9 @@ public: void setPreferStylusOverLaser(bool value) { _preferStylusOverLaserSetting.set(value); } bool getPreferAvatarFingerOverStylus() { return _preferAvatarFingerOverStylusSetting.get(); } void setPreferAvatarFingerOverStylus(bool value) { _preferAvatarFingerOverStylusSetting.set(value); } + + void setMouseCaptureVR(bool value); + bool getMouseCaptureVR(); bool getShowGraphicsIcon() { return _showGraphicsIconSetting.get(); } void setShowGraphicsIcon(bool value); @@ -791,6 +794,7 @@ private: Setting::Handle _hmdTabletBecomesToolbarSetting; Setting::Handle _preferStylusOverLaserSetting; Setting::Handle _preferAvatarFingerOverStylusSetting; + Setting::Handle _defaultMouseCaptureVR; Setting::Handle _showGraphicsIconSetting; Setting::Handle _constrainToolbarPosition; Setting::Handle _awayStateWhenFocusLostInVREnabled; diff --git a/interface/src/Application_UI.cpp b/interface/src/Application_UI.cpp index 6d4dbcbef3..ee40319e28 100644 --- a/interface/src/Application_UI.cpp +++ b/interface/src/Application_UI.cpp @@ -269,6 +269,14 @@ void Application::setHmdTabletBecomesToolbarSetting(bool value) { updateSystemTabletMode(); } +void Application::setMouseCaptureVR(bool value) { + _defaultMouseCaptureVR.set(value); + getApplicationCompositor().setEnableMouseCaptureVR(value); +} +bool Application::getMouseCaptureVR() { + return _defaultMouseCaptureVR.get(); +} + void Application::setShowGraphicsIcon(bool value) { _showGraphicsIconSetting.set(value); DependencyManager::get()->sendLocalMessage("Overte-ShowGraphicsIconChanged", ""); diff --git a/interface/src/ui/PreferencesDialog.cpp b/interface/src/ui/PreferencesDialog.cpp index 623aede2fa..cf7d02a8b4 100644 --- a/interface/src/ui/PreferencesDialog.cpp +++ b/interface/src/ui/PreferencesDialog.cpp @@ -32,6 +32,8 @@ void setupPreferences() { auto preferences = DependencyManager::get(); auto myAvatar = DependencyManager::get()->getMyAvatar(); + + static const QString AVATAR_BASICS { "Avatar Basics" }; { auto getter = [myAvatar]()->QString { return myAvatar->getDisplayName(); }; @@ -165,6 +167,13 @@ void setupPreferences() { preference->setMax(500); preferences->addPreference(preference); } + + { + auto getter = []() -> bool { return qApp->getMouseCaptureVR(); }; + auto setter = [](bool value) { qApp->setMouseCaptureVR(value); }; + auto preference = new CheckPreference(UI_CATEGORY, "3D mouse cursor in VR", getter, setter); + preferences->addPreference(preference); + } { static const QString RETICLE_ICON_NAME = { Cursor::Manager::getIconName(Cursor::Icon::RETICLE) }; diff --git a/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp b/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp index c645c39eb4..ed16b5875c 100644 --- a/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp +++ b/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp @@ -195,6 +195,10 @@ bool CompositorHelper::shouldCaptureMouse() const { if (!isHMD()) { return false; } + + if (!_enableMouseCaptureVR) { + return false; + } if (!isWindowActive()) { @@ -216,6 +220,10 @@ void CompositorHelper::setAllowMouseCapture(bool capture) { } } +void CompositorHelper::setEnableMouseCaptureVR(bool capture) { + _enableMouseCaptureVR = capture; +} + void CompositorHelper::handleLeaveEvent() { if (shouldCaptureMouse()) { diff --git a/libraries/display-plugins/src/display-plugins/CompositorHelper.h b/libraries/display-plugins/src/display-plugins/CompositorHelper.h index 389d49929e..a952b80238 100644 --- a/libraries/display-plugins/src/display-plugins/CompositorHelper.h +++ b/libraries/display-plugins/src/display-plugins/CompositorHelper.h @@ -106,6 +106,7 @@ public: bool getAllowMouseCapture() const { return _allowMouseCapture; } void setAllowMouseCapture(bool capture); + void setEnableMouseCaptureVR(bool capture); /// if the reticle is pointing to a system overlay (a dialog box for example) then the function returns true otherwise false bool getReticleOverDesktop() const; @@ -168,7 +169,8 @@ private: bool _reticleOverQml { false }; - std::atomic _allowMouseCapture { true }; + std::atomic _allowMouseCapture{ true }; + std::atomic _enableMouseCaptureVR{ false }; bool _fakeMouseEvent { false };