diff --git a/Readme.md b/Readme.md index 269b5fc..70bccb9 100644 --- a/Readme.md +++ b/Readme.md @@ -19,7 +19,7 @@ > * [SteamVR Page](#steamvr_page) > * [Chaperone Page](#chaperone_page) > * [Chaperone Proximity Warning Settings Page](#chaperone_proximity_page) - > * [Space Offset](#play_space_page) + > * [Space Offset](#space_offset_page) > * [Motion Page](#motion_page) > * [Space Fix Page](#space_fix_page) > * [Audio Page](#audio_page) @@ -215,7 +215,7 @@ These version are not stable and this should be considered for advanced users on ## Top Page: -![Root Page](docs/screenshots/RootPage.png) +Root Page - **Supersampling Profile**: Allows to apply supersampling profiles. Profiles can be created on the SteamVR page - **Chaperone Profile**: Allows to apply chaperone profiles. Profiles can be created on the Chaperone page @@ -225,7 +225,7 @@ These version are not stable and this should be considered for advanced users on ## - SteamVR Page: -![SteamVR Page](docs/screenshots/SteamVRPage.png) +SteamVR Page - **Profile**: Allows to apply/define/delete supersampling profiles that save supersampling and reprojection settings. - **Application Supersampling**: Supersampling setting for OpenVR applications/games. Application supersampling [now behaves linearly](https://steamcommunity.com/games/250820/announcements/detail/1256913672017664045) where 2.0 means twice the number of pixel. @@ -236,12 +236,12 @@ These version are not stable and this should be considered for advanced users on ## - Chaperone Page: -![Chaperone Page](docs/screenshots/ChaperonePage.png) +Chaperone Page - **Profile**: Allows to apply/define/delete chaperone profiles that save geometry info, style info or other chaperone settings (What exactly is saved in a chaperone profile can be selected when a profile is created). - **Visibility**: Allows to configure the visibility of the chaperone bounds. 50% to 100% opacity. - **Fade Distance**: Allows to configure the distance at which the chaperone bounds are shown. When set to 0 chaperone bounds are completely invisible. -- **Height**: Allows to configure the height of the chaperone bounds. +- **Height**: Allows to configure the height of the chaperone bounds. **(Temporarily disabled pending integration into new motion system.)** - **Center Marker**: Displays a marker that represents the center of the playspace. - **Play Space Maker**: Displays the outlines of the rectangle representing the playspace. - **Force Bounds**: Force chaperone bounds always on. @@ -253,7 +253,7 @@ These version are not stable and this should be considered for advanced users on ## - Chaperone Proximity Warning Settings Page: -![Chaperone Proximity Warning Settings Page](docs/screenshots/ChaperoneWarningPage.png) +Chaperone Proximity Warning Settings Page - **Switch to Beginner Mode**: Switches the chaperone bound's style to beginner mode when the user's distance to the chaperone falls below the configured activation distance. - **Trigger Haptic Feedback**: The left and right controller start vibrating when the user's distance to the chaperone falls below the configured activation distance. (HMD or controllers can trigger) @@ -266,16 +266,17 @@ These version are not stable and this should be considered for advanced users on ## - Space Offset Page: -![Play Space Page](docs/screenshots/OffsetPage.png) +Space Offsets Page Allows users to temporarily move and rotate the center of the playspace. This allows to reach interaction elements that are just outside our real-world walls or otherwise inaccessible (e.g. when your playspace is smaller than the recommended one). Can also be used to discover the terrors that lie outside of the intended playspace (ever wondered what's behind the door in The Lab?). - **Adjust Chaperone**: When enabled, the chaperone bounds stay accurate even when the playspace is moved or rotated (so noone gets hurt). Depending on chaperone mode this may or may not adjust with height. +- **Seated Recenter**: When clicked, applies the current location and angle of the headset to the offsets such that the user is brought to a centered position. Also applies the current headset height to the default seated height (not visible in offsets). This action will also be activated automatically when a seated application sends a reset center command. *Note: This button is only visible when running seated applications.* ## - Motion Page: -![Motion Page](docs/screenshots/MotionPage.png) +Motion Page - **Space Drag**: Allows shifting your playspace by dragging your controller, Binds must be set via SteamVR Input system. - **Enable Left/Right Hand**: Toggles functionality (must be active in addition to binding via input system to work.) @@ -297,17 +298,17 @@ Allows users to temporarily move and rotate the center of the playspace. This al ## - Space Fix Page: -![Playspace Fix Page](docs/screenshots/FloorFixPage.png) +Space Fix Page - **Fix Floor** Allows you to fix the height of your floor. Just place one controller on your floor and press the button. - **Recenter Playspace** Besides fixing the floor height, also recenters the place space around the controller on the floor. -- **Undo Fix** Removes last "fix" +- **Undo Fix** Removes last "fix" **(Temporarily disabled pending integration into new motion system.)** - **Apply Space Settings Offsets as Center** Takes current values from Offsets page and re-caliberates center/rotation. **Caution** The reset function will then refer to this location as the new zero location, overriding the old zero location. ## - Audio Page: -![Audio Page](docs/screenshots/AudioPage.png) +Audio Page - **Playback Device**: Allows to select the playback device. - **Mirror Device**: Allows to select the mirror device, set its volume and to mute/unmute it. @@ -321,7 +322,7 @@ Allows users to temporarily move and rotate the center of the playspace. This al ## - Video Page: -![Video Page](docs/screenshots/VideoPage.png) +Video Page - **Brightness**: Allows Dimming of your view. - **On/Off**: Toggles The Dimming on/off. @@ -331,7 +332,7 @@ Allows users to temporarily move and rotate the center of the playspace. This al ## - Utilities Page: -![Utilities Page](docs/screenshots/UtilitiesPage.png) +Utilities Page - **Keyboard Utilities:** Some applications (mostly 2D-monitor applications with tackled-on/modded-in VR support) do not support the VR keyboard but require an actual physical keyboard for text input. This utilities allow to send emulated key strokes from VR keyboard input to such application to overcome this limitation. Does not work in desktop mode. @@ -344,20 +345,20 @@ Allows users to temporarily move and rotate the center of the playspace. This al ## - Desktop Overlay Page -![Desktop Overlay Page](docs/screenshots/DesktopOverlayPage.png) +Desktop Overlay Page --**Overlay Width:** The width of the overlay in meters. Multi screen setups need larger values to see any difference. +- **Overlay Width:** The width of the overlay in meters. Multi screen setups need larger values to see any difference. --**Up/Down Translation:** Moves the overlay up and down. +- **Up/Down Translation:** Moves the overlay up and down. --**Forwards/Backwards Translation:** Moves the overlay forwards and backwards. +- **Forwards/Backwards Translation:** Moves the overlay forwards and backwards. --**Left/Right Translation:** Moves the overlay left or right. +- **Left/Right Translation:** Moves the overlay left or right. ## - Statistics Page: -![Statistics Page](docs/screenshots/StatisticsPage.png) +Statistics Page - **HMD Distance Moved**: Shows the distance the headset has moved on the xz-plane. - **HMD Rotations**: Shows the number of rotations around the y-axis (Useful for untangling the cord). @@ -372,10 +373,11 @@ Allows users to temporarily move and rotate the center of the playspace. This al ## - Settings Page: -![Settings Page](docs/screenshots/SettingsPage.png) +Settings Page - **Autostart:** Allows you to enable/disable auto start. - **Force Revive Page:** No Longer Supported Does Nothing. +- **Allow External App Chaperone Edits:** Incorporates changes to the chaperone and universe center made by other applications. These changes could come from anywhere, including apps with unpredictable interactions with Advanced Settings. Therefore, this option opens the potential for chaperone misalignment or corruption. However it also allows other chaperone tweaking tools to function in tandem with Advanced Settings. **This option should only be checked if required for compatibility with other apps.** *Note: Changes will only take effect when offsets and rotation are all zero.* # How to Compile diff --git a/docs/screenshots/AudioPage.png b/docs/screenshots/AudioPage.png index f972633..088a44a 100644 Binary files a/docs/screenshots/AudioPage.png and b/docs/screenshots/AudioPage.png differ diff --git a/docs/screenshots/ChaperonePage.png b/docs/screenshots/ChaperonePage.png index 51af248..ca52f83 100644 Binary files a/docs/screenshots/ChaperonePage.png and b/docs/screenshots/ChaperonePage.png differ diff --git a/docs/screenshots/ChaperoneWarningPage.png b/docs/screenshots/ChaperoneWarningPage.png index f8b8045..dfa11c0 100644 Binary files a/docs/screenshots/ChaperoneWarningPage.png and b/docs/screenshots/ChaperoneWarningPage.png differ diff --git a/docs/screenshots/DesktopOverlayPage.png b/docs/screenshots/DesktopOverlayPage.png index 326d4e4..80e8e22 100644 Binary files a/docs/screenshots/DesktopOverlayPage.png and b/docs/screenshots/DesktopOverlayPage.png differ diff --git a/docs/screenshots/FloorFixPage.png b/docs/screenshots/FloorFixPage.png index 0c1f87e..2d83c84 100644 Binary files a/docs/screenshots/FloorFixPage.png and b/docs/screenshots/FloorFixPage.png differ diff --git a/docs/screenshots/MotionPage.png b/docs/screenshots/MotionPage.png index 4911cb7..72889c0 100644 Binary files a/docs/screenshots/MotionPage.png and b/docs/screenshots/MotionPage.png differ diff --git a/docs/screenshots/OffsetPage.png b/docs/screenshots/OffsetPage.png index 12a9a03..bdc3fa3 100644 Binary files a/docs/screenshots/OffsetPage.png and b/docs/screenshots/OffsetPage.png differ diff --git a/docs/screenshots/RevivePage.png b/docs/screenshots/RevivePage.png index a9c190b..97fecaf 100644 Binary files a/docs/screenshots/RevivePage.png and b/docs/screenshots/RevivePage.png differ diff --git a/docs/screenshots/RootPage.png b/docs/screenshots/RootPage.png index 3dbf166..1b26dc6 100644 Binary files a/docs/screenshots/RootPage.png and b/docs/screenshots/RootPage.png differ diff --git a/docs/screenshots/SettingsPage.png b/docs/screenshots/SettingsPage.png index 88fb177..605f3ed 100644 Binary files a/docs/screenshots/SettingsPage.png and b/docs/screenshots/SettingsPage.png differ diff --git a/docs/screenshots/StatisticsPage.png b/docs/screenshots/StatisticsPage.png index fbd06ba..cf11517 100644 Binary files a/docs/screenshots/StatisticsPage.png and b/docs/screenshots/StatisticsPage.png differ diff --git a/docs/screenshots/SteamVRPage.png b/docs/screenshots/SteamVRPage.png index 76c51cf..1b7b5a6 100644 Binary files a/docs/screenshots/SteamVRPage.png and b/docs/screenshots/SteamVRPage.png differ diff --git a/docs/screenshots/UtilitiesPage.png b/docs/screenshots/UtilitiesPage.png index 40d1fab..8a1cc1d 100644 Binary files a/docs/screenshots/UtilitiesPage.png and b/docs/screenshots/UtilitiesPage.png differ diff --git a/docs/screenshots/VideoPage.png b/docs/screenshots/VideoPage.png index 44d3b41..1a38d23 100644 Binary files a/docs/screenshots/VideoPage.png and b/docs/screenshots/VideoPage.png differ diff --git a/src/res/qml/utilities_page/keyboard_utils/KeyboardGroupBox.qml b/src/res/qml/utilities_page/keyboard_utils/KeyboardGroupBox.qml index 58271db..4115ac1 100644 --- a/src/res/qml/utilities_page/keyboard_utils/KeyboardGroupBox.qml +++ b/src/res/qml/utilities_page/keyboard_utils/KeyboardGroupBox.qml @@ -93,6 +93,30 @@ GroupBox { } } } + RowLayout { + spacing: 18 + Layout.fillWidth: true + + MyPushButton { + text: "Ctrl-C" + Layout.preferredWidth: 150 + onClicked: { + UtilitiesTabController.sendKeyboardCtrlC() + } + } + + MyPushButton { + text: "Ctrl-V" + Layout.preferredWidth: 150 + onClicked: { + UtilitiesTabController.sendKeyboardCtrlV() + } + } + + Item { + Layout.fillWidth: true + } + } } Component.onCompleted: { keyboardGroupBox.visible = !OverlayController.desktopMode diff --git a/src/tabcontrollers/MoveCenterTabController.cpp b/src/tabcontrollers/MoveCenterTabController.cpp index 6535a2a..37b83e0 100644 --- a/src/tabcontrollers/MoveCenterTabController.cpp +++ b/src/tabcontrollers/MoveCenterTabController.cpp @@ -1760,6 +1760,7 @@ void MoveCenterTabController::saveUncommittedChaperone() vr::VRChaperoneSetup()->CommitWorkingCopy( vr::EChaperoneConfigFile_Live ); m_chaperoneCommitted = true; + parent->chaperoneUtils().loadChaperoneData( false ); } } diff --git a/src/tabcontrollers/UtilitiesTabController.cpp b/src/tabcontrollers/UtilitiesTabController.cpp index 6b70ea4..5efe422 100644 --- a/src/tabcontrollers/UtilitiesTabController.cpp +++ b/src/tabcontrollers/UtilitiesTabController.cpp @@ -49,6 +49,16 @@ void UtilitiesTabController::sendKeyboardAltTab() keyboardinput::sendKeyboardAltTab(); } +void UtilitiesTabController::sendKeyboardCtrlC() +{ + keyboardinput::sendKeyboardCtrlC(); +} + +void UtilitiesTabController::sendKeyboardCtrlV() +{ + keyboardinput::sendKeyboardCtrlV(); +} + void UtilitiesTabController::sendKeyboardBackspace( const int count ) { keyboardinput::sendKeyboardBackspace( count ); diff --git a/src/tabcontrollers/UtilitiesTabController.h b/src/tabcontrollers/UtilitiesTabController.h index e97cb60..0a34a00 100644 --- a/src/tabcontrollers/UtilitiesTabController.h +++ b/src/tabcontrollers/UtilitiesTabController.h @@ -58,6 +58,8 @@ public slots: void sendKeyboardEnter(); void sendKeyboardAltTab(); void sendKeyboardAltEnter(); + void sendKeyboardCtrlC(); + void sendKeyboardCtrlV(); void sendKeyboardBackspace( const int count ); void sendMediaNextSong(); void sendMediaPreviousSong(); diff --git a/src/tabcontrollers/keyboardinput/KeyboardInput.h b/src/tabcontrollers/keyboardinput/KeyboardInput.h index d1bff88..98974d8 100644 --- a/src/tabcontrollers/keyboardinput/KeyboardInput.h +++ b/src/tabcontrollers/keyboardinput/KeyboardInput.h @@ -10,6 +10,8 @@ void sendKeyboardEnter(); void sendKeyboardBackspace( const int count ); void sendKeyboardAltTab(); void sendKeyboardAltEnter(); +void sendKeyboardCtrlC(); +void sendKeyboardCtrlV(); void sendMediaNextSong(); void sendMediaPreviousSong(); void sendMediaPausePlay(); diff --git a/src/tabcontrollers/keyboardinput/KeyboardInputDummy.cpp b/src/tabcontrollers/keyboardinput/KeyboardInputDummy.cpp index 8bfa9bb..010a257 100644 --- a/src/tabcontrollers/keyboardinput/KeyboardInputDummy.cpp +++ b/src/tabcontrollers/keyboardinput/KeyboardInputDummy.cpp @@ -33,6 +33,16 @@ void sendKeyboardAltEnter() // noop } +void sendKeyboardCtrlC() +{ + // noop +} + +void sendKeyboardCtrlV() +{ + // noop +} + void sendMediaNextSong() { // noop diff --git a/src/tabcontrollers/keyboardinput/KeyboardInputWindows.cpp b/src/tabcontrollers/keyboardinput/KeyboardInputWindows.cpp index 586bef5..482fafe 100644 --- a/src/tabcontrollers/keyboardinput/KeyboardInputWindows.cpp +++ b/src/tabcontrollers/keyboardinput/KeyboardInputWindows.cpp @@ -274,6 +274,52 @@ void sendKeyboardAltEnter() sendKeyboardInputRaw( numberOfActions, actions ); } +/*! +Sends a Ctrl + C combination to Windows. + +Used for copy in copy-paste operations. +*/ +void sendKeyboardCtrlC() +{ + constexpr auto ctrlKey = VK_CONTROL; + constexpr auto cKey = 0x43; + + const auto pressCtrl = createInputStruct( ctrlKey, KeyStatus::Down ); + const auto pressC = createInputStruct( cKey, KeyStatus::Down ); + const auto releaseC = createInputStruct( cKey, KeyStatus::Up ); + const auto releaseCtrl = createInputStruct( ctrlKey, KeyStatus::Up ); + + constexpr auto numberOfActions = 4; + + INPUT actions[numberOfActions] + = { pressCtrl, pressC, releaseC, releaseCtrl }; + + sendKeyboardInputRaw( numberOfActions, actions ); +} + +/*! +Sends a Ctrl + V combination to Windows. + +Used for paste in copy-paste operations. +*/ +void sendKeyboardCtrlV() +{ + constexpr auto ctrlKey = VK_CONTROL; + constexpr auto vKey = 0x56; + + const auto pressCtrl = createInputStruct( ctrlKey, KeyStatus::Down ); + const auto pressV = createInputStruct( vKey, KeyStatus::Down ); + const auto releaseV = createInputStruct( vKey, KeyStatus::Up ); + const auto releaseCtrl = createInputStruct( ctrlKey, KeyStatus::Up ); + + constexpr auto numberOfActions = 4; + + INPUT actions[numberOfActions] + = { pressCtrl, pressV, releaseV, releaseCtrl }; + + sendKeyboardInputRaw( numberOfActions, actions ); +} + /*! Sends a media key Next Song button to Windows. */