If you would like to support the continual development of Virtual Handheld, please help by spreading the word about it to friends and via social media! Bluesky: @vhvr.bsky.social‬ https://bsky.app/profile/did:plc:kg5oonpm7enn6ruags4e5ra4 YouTube: https://www.youtube.com/channel/UC3J_Wd_Po71ldLkHLV_MmeA Discord: https://discord.gg/NuPk9m9XeC VRChat: VHAND.5270 https://vrchat.com/home/group/grp_640cd786-fcd3-4296-be23-17f3aeed33d4 Please report any glitches, bugs and/or issues to the Steam Community Hub or to the Discord server! vh0.8.4 - Input Blocking Patch (2025-12-28) Summary: This patch fixes two bugs related to VR input blocking. Fixes: *Fixed VR input blocking not being deactivated when handheld is toggled off from the desktop settings UI *Fixed VR input blocking being activated when the handheld is toggled on via the SteamVR input action while VR input blocking is turned off vh0.8.3 - Pixel Perfect Patch (2025-12-07) Summary: This patch changes the default resolution of the handheld overlay to allow for cleaner pixel scaling. Handheld graphics should now look much sharper than they did before! (Note that overlay resolution scaling is still a work-in-progress!) Changes: *Changed the default (base) resolution of the handheld overlay from 1600x900 to 2080x1080. This new resolution matches better with the size of the actual handheld graphics, allowing for sharper and cleaner pixel scaling and less wasted space on the overlay texture. *Scaled overlay resolution is now rounded to the nearest whole number rather than truncated *Overlay Resolution Scale presets have been updated to account for the new base resolution *Adjusted the position offsets and the angle of the top screen overlay to prevent overlap due to the handheld graphics filling up more of the overlay texture *Adjusted the position and scale of the OSC and input blocking indicators on the handheld overlay to accommodate the new pixel scaling *Changed the OSC and hand icon sprites to have a 1-pixel margin of transparency vh0.8.2 - Security Patch (2025-10-03) Summary: Because of a security vulnerability that affects Unity versions 2017.1 and later, VH has been updated to Unity version 6000.0.58f2. Updates & Changes: ^Updated Unity engine version to 6000.0.58f2 vh0.8.1 - Issue Resolver Updates (2025-09-25) Update Summary: This update adds several start-up checks that help deal with issues such as VR not being initialized, having an instance of VH already running, and a new warning message to disable the "Gamepad Support" add-on. Also includes changes to the UI layout to hopefully make things less overwhelming and confusing. New Startup Checks: +Added a check for whether OpenVR initialized correctly at startup. If OpenVR failed to initialize, a message box will be shown before quitting the application. +Added a check for whether an instance of the Virtual Handheld Settings overlay already exists. If found, a message box will be shown before quitting the application. Issue Resolver Updates: +Added checks for the "Gamepad Support" add-on. If a controller of type "gamepad" is detected in SteamVR, it will add a warning to the issue resolver directing the user to disable the add-on. ^Upgraded the issue resolver on the Welcome screen to allow for more than two issues at once! *Fixed bug where the text above the handheld screen would remain yellow after clearing all input issues if the issues were fixed while the dashboard was closed General Settings: +Added "More Tap Options" toggle to show more controller tap settings. This is off by default to not overwhelm the user with too many settings off the bat. ^Updated layout of UI elements *Fixed a layout problem that made the scale value appear as 100 when it should be 1000. You would think someone would have caught this issue by now, considering it's been in the app since *flips pages* version 0.4, which came out in 2023. Performance Settings: +Added "Advanced Performance Settings" section to separate the settings that are work-in-progress or may have compatibility issues from the regular performance settings ^Updated warning message for VR resolution scaling ^Updates to scale and formatting of UI elements Screens Settings: *Fixed the width of the panel behind the screen sources so that the elements fit inside *Halved the size of the capture sources list icons so that low resolution icons don't appear as blurry +Added [VH] prefix to debug messages sent by the capture sources list Other Updates & Changes: *Fixed an issue that caused the UI to break if a UI element was destroyed while it was being clicked on the VR Dashboard Settings overlay *Version numbers will now attempt to adhere to Semantic Versioning (SemVer) 2.0.0 guidelines *Code clean-up and optimization ^Updated ReadMePls.pdf vh0.8.0 - Desktop Settings Update (2025-08-28) Update Summary: Here it is, the big Desktop Settings Update! This update increases the accessibility of the application by allowing you to edit VH settings on your desktop instead of having it do it in VR. This update also introduces auto-minimize functionality to keep your desktop clear of too many windows! Also, bug fixes!!! Desktop Window: +Added ability to change VH settings from your desktop +Added boarderless, draggable window with transparency +Added auto-minimize feature that will minimize the Virtual Handheld window 5 seconds after startup if the window is not clicked before then (This can be disabled in the General settings menu) +Added system tray icon! When the icon is double-clicked, it restores the window if it is minimized. When right-clicked, it gives the option to Quit. Settings UI: +Added custom title bar with control buttons: ++(?) Help button: Opens a help menu with links to support resources ++(_) Minimize button: Minimizes the window to the taskbar ++(x) Close button: Closes the window. Minimizes to the tray if the option is enabled ++Restore Button: Restores the window from minimized. Appears on the dashboard overlay if the window is minimized. +Added Help Menu with buttons that link to the Discord server and Steam community discussions, and options to copy the support email to the clipboard or open it in the user's mail client *Changed background from a highly saturated blue color to a nicer, less saturated gradient *Opening the SteamVR Bindings UI from the desktop window will open it on the desktop instead of the dashboard *Optimized settings UI to not render while the desktop window is minimized and the VR dashboard overlay is hidden -Removed fuzzy blue outlines from menu tabs General Settings: +Added setting for adjusting the desktop window scale +Added a toggle to turn the auto-minimize feature on or off +Added option to minimize to tray when the [x] close button is pressed. This also changes the auto-minimize behavior to minimize to the system tray at startup. Bug Fixes: *Fixed the issue that caused the tracking space to be forcefully changed to standing every frame, while another app forcefully changes the tracking space to seated every frame, causing VH and Bigscreen Beta to fight over the origin of the universe *Fixed issue with some full-screen games that output an alpha value that caused the overlay to appear transparent in areas that should be opaque *Fixed the scrollbar in the Screens settings menu moving very jittery Other Changes: +Added Kirurobo to Credits and Attributions for making UniWindowController *Updated internal company name *Code cleanup and optimization vh0.7.1 - Unity 6 Update! (2025-07-28) Update Summary: With the update to Unity 6, the "Made with Unity" splash screen is now disabled, meaning that VH will start up even faster than before! There are also various small changes and backend optimizations included with this update. Fixes & Changes: *Updated Unity version to 6000.0.53f1 (LTS) *Updated SteamVR Unity Plugin to v2.8.0 (sdk 2.0.10) *Various backend optimizations -Removed splash screen -Removed "NEW!" text from OSC menu button -Removed stickers from About page -Removed old company name from Legal.txt vh0.7.0.1 - Small Maintenance Update (2025-06-29) Update Summary: "must be kitten! software" has been consolidated with me, the developer, ZanyCat. i got kind of annoyed using different names to represent myself and my company, so now i am using the name "ZanyCat" to represent both myself and my company. hi! i hope you are having a good day~ Changes: *Replaced "App Loaded" sound effect (MEOW!) with a nicer, less harsh, less noisy cat chirp sound effect *Replaced username-based social links with their respective profile/channel ID versions. (This is because of the company rebranding, and to futureproof in case of future rebranding.) *Updated company logo -Removed "must be kitten! software" from copyright text and credits vh0.7.0 - VH OSC Starter Pack! (2025-05-13) Update Summary: This update adds the long-awaited OSC chatbox and avatar parameter integrations! Proudly display to your friends in VR what game you are playing, or add a prop to your avatar that toggles with the handheld overlay! This update also introduces bug fixes, as well as an updated settings UI. NEW OSC Chatbox: +Display to your friends in VR that you are Playing on Virtual Handheld +Share the title of the game you are currently playing on VH, with options on where to get the window title from and when it gets updated +Preview the message that will be sent through the chatbox before applying, or have it be automatically updated on loop NEW OSC Avatar Parameters: +Includes various parameters that you can add to your virtual avatar for controlling animation, toggling props, swapping materials, etc. +View the parameters' names, types, and values in the "Avatar" tab in the OSC Menu +For advanced users, you can change the names of parameters on the right-hand side of the "osc_config" text file, which can be accessed via the "Show Advanced..." toggle in the "OSC" tab and pressing the "Open VH OSC Config Directory" button. You can also disable parameters by setting their name to empty ("") or null (without quotations). VH Settings: +Added "pulled out" action to menu tabs, making it more obvious which tabs are selected +Added newly stylized transparent background to make the sidebar menu tabs appear to hang off the edge +Added panels in various places for better text readability Bindings Menu: +Added footnote to Oculus Layout for Thumbrests: "This input is not available on Quest 1/Rift S" *Updated explanations for VR controller sets and how to edit bindings About Page: +Added new artwork by Projekt Neoverse of VH mascot DJ Frog, inspired by the music video from Rollthered +Added scrolling animation to credits *Reworked the text and layout for clarity and readability Fixes, Optimization & Misc.: +Added Legal.txt file with disclaimer(s) plus free and open source license attribution (This is the same text as the EULA you now have to agree to before using VH) *"In-focus (on top) window" had been replaced with Foreground Window, which is the window receiving input rather than being on top of the z-order. This fixes an issue where window/desktop overlay apps (such as the Discord overlay) would appear as being played instead of the actual game. *Fixed bug where pressing the "Go Back" button below the "SteamVR Bindings UI" message would always take you back to the Bindings Menu. Now if you press the "Configure..." button next to "Enable Input Actions" in the General Menu, it will take you back to the correct menu. *Fixed VR controller type in Bindings Menu still being updated when "Automatically update VR controller type on connect" is disabled *Changed VR Resolution Scale notice to inform the user to make sure to toggle off the handheld before exiting VH to ensure that user settings are properly restored *Atlased some of the sprites/UI graphics for better optimization vh0.6.5.1 - a pretty important patch (2025-01-01) Membership notice: The Buy Me a Coffee member benefits have been discontinued Known Issues: *Console display doesn't start showing messages until after the main handheld settings have been initialized. However, you can still see all the messages in "\Documents\My Games\Virtual Handheld\console.log" Changelog Changes: +Added social links to changelog header +Now using plus signs to indicate features added, asterisks to indicate changes, and minus signs to indicate removed features (just like old changelogs from a game you might have heard of) +Add an h to the v in the version number to make it vh because I can lol *Switched to using descending date format for new changelogs -Removed donation link from changelog header Fixes & Changes: *Fixed Handheld Settings failing to initialize when "Tap Controllers Together To Toggle Handheld" is turned off at startup, completely breaking the program *Fixed plus and minus buttons allowing the slider values to go one extra interval outside of the intended range *Fixed the unnecessary console log spam when "Change VR Resolution Scale When Handheld Is Toggled" is toggled when the handheld is disabled, as the user's SteamVR resolution settings are obtained only to be set again to the same values *Fixed Bindings settings failing to initialize if "Enable Input Simulator" is turned off at startup *Reverted "Enter Sphere Size" setting name on the backend for compatibility with older settings files *Renamed "Enter Sphere Size" slider to "Enter Tap Sphere Size" and "Exit Sphere Size" slider to "Exit Tap Sphere Size" for better clarity on what the sliders are actually for *Fixed inputs appearing on Input Visualizer when Input Simulator is disabled *The controller tap sound has been moved to a separate audio source that is spatialized to the average position of the tap spheres when they enter each other, meaning that the sound of the controllers tapping will actually come from where the controllers tapped *Controller tap spheres are now kinematic, which should hopefully mean less floating point weirdness and better performance *Fixed sliders storing the wrong default value at startup *Replaced "Enable Handheld" toggle with "Toggle Handheld On/Off" button *Changed Nestorboy credit from "Logo Redesign, Programming Help" to "Art & Programming Help" *Fixed capitalization of "ViGEmBus" (was incorrectly capitalized "ViGemBus") -Removed donate and membership buttons v0.6.5 Taps & SFX Update (12/24/2024) Update Summary: This update adds quality-of-life features and improvements such as sound effects to give the user feedback for certain actions, as well as improvements to the controller tap system to mitigate accidental handheld toggling. Desktop Player: -Updated app icon with "new" logo design (may require system restart to appear properly) Handheld Toggle Settings: -Changed the way controllers taps are registered. Controllers now have an "Enter Sphere" and an "Exit Sphere". The start of a tap is registered when in the "Enter Sphere" of each controller intersect. The tap finishes when the sphere of one controller exits the "Exit Sphere" of the other controller. This was done to mitigate accidental handheld toggling. -Added "Toggle Handheld on Tap Exit" option, which toggles the handheld when the controllers exit each other's tap spheres, rather than when entering. Enabling this may reduce accidental handheld toggles. -"Multi Tap Timer" has been replaced with "Tap Timeout" which is measured in real seconds rather than fixed updates -"Tap Collider Size" is now "Enter Sphere Size" and is now measured in centimeters rather than meters -"Exit Sphere Size" added, and is the percent of the "Enter Sphere Size" that is added to make the "Exit Sphere" -Cleaned up the format of the UI elements, making the sliders bigger and adding "-" and "+" buttons for easier adjustments Sound Effects: -Added sound effects for loading the application, tapping the controllers, controller tap timeout, enabling and disabling the handheld -Added Sound settings tab to the General settings, with options to toggle sound effects, control master volume and adjust the volume of individual sound effects About Page: -Added credit to FilmCow for Sound Effects -Added special thanks to Alexios for helping with marketing materials -Moved pixel art ZanyCat upwards due to the expanded list of names. It’s getting crowded in here! v0.6.4 Resolution Scale Update (12/11/2024) Welcome Screen: -Added link to Bluesky page -Fixed link to YouTube page -Color coded social link texts -Added label to inform the user that the social links "will open in a browser on your desktop" -Updated social buttons' size to span the width of the Welcome page and accommodate the new label Issue Resolver: -Startup routine now checks if the Dashboard setting "Present Non-VR Applications on Theater Screen Upon Launch" is turned on. Since this setting seems to be a stumbling block for new users, just like with Global Inputs, the welcome screen will now prompt the user with a button to "Auto Fix" the issue. General Settings: -Separated General Settings Menu into tabs by category: General, Input/Output, Performance -"Enable Handheld" toggle is now visible in the General Tab. (The toggle was always there, you just couldn't see it until now.) This can be used as a sort of auxiliary handheld toggle. Performance Settings: -Added VR Resolution Scaling, which automatically lowers the render resolution in SteamVR when the handheld is enabled. This can be very good for increasing the performance of games by prioritizing resources towards the game being played on the handheld over rendering the background environment. Its kinda like foveated rendering, but its more of at faux-veated rendering. This setting is off by default as it does temporarily change SteamVR settings. -Added Overlay Resolution Scaling, which changes the resolution of the handheld overlay itself. Currently, the handheld screen resolution is calculated to be 75% of the overlay's resolution. This feature is a work-in-progress and will be improved later on to be more efficient. v0.6.3 One-Hand Accessibility Update (11/26/2024) NOTE: SteamVR Bindings have been updated! If you are using a custom SteamVR Binding for whatever reason, you may need to update it to use the new features! SteamVR Bindings: -Added the "actions" page to the SteamVR Bindings. This page is for actions that can be performed even when the handheld is disabled. -Added "toggle_handheld" input to the "actions" page. This action allows you to toggle the handheld without needing to tap both controllers together, allowing for one-hand accessibility! This action is bound by default as Joystick Button Double Click on Oculus, Index, and WinMR(G2) layouts, and is bound by default as Menu Button Double Click on Vive and WinMR(G1) layouts. -Added "handheld_settings" input to the "actions" page. This action allows you to open the handheld settings menu without needing to first open the dashboard and navigate to the "Virtual Handheld Settings". This may enhance accessibility, as the right Oculus controller system button is not accessible to SteamVR. This action is bound by default as Joystick Button Long Click on Oculus, Index, and WinMR(G2) layouts, and is bound by default as Menu Button Long Click on Vive and WinMR(G1) layouts. (To close the dashboard settings, simply press the trigger while the controller is pointed away from the dashboard!) Welcome Screen: -The intro text now updates with the "Number of Taps" you have selected! (Single, Double, Tripple) -Intro text will prompt the user to use the handheld toggle input action if only one controller is connected, or if the controller tap toggle is turned off -If both the controller tap toggle and the input actions are disabled, then the intro text will prompt the user to re-enable handheld toggling General Settings: -Added input actions toggle, which can be used to enable or disable the "handheld_toggle" binding and the "handheld_settings" binding -Added a "Configure..." button to direct the user the the "actions" page of the SteamVR bindings -Renamed "Display top window title" toggle to "Display in-focus (on top) window title" for better clarity Input Simulator: -Added AltSet "Swap" Mode, which allows you to switch between Main and Alt binding sets without having to hold the input. This should hopefully make alternate bindings more accessible, by not having to hold down multiple buttons to access alternate inputs! Controller Bindings: -Controller layout text now shows both controller types for mismatched controller layouts. For example, if you have an Index controller in the left hand, and a Vive controller in the right hand, it should say "Index+Vive Layout". -Removed the word "Controller" from VR controller layout text for simplicity -Controller layout text now says the controller's handedness when only a single VR controller is connected. For example, if only the left Oculus controller is connected, it should say "Oculus Left Layout". -Fixed controller auto-detect when a single or mismatched controller is connected -"AltSet (Hold)" now appears simply as "AltSet" on the inputs list for better readability -On the inputs list, "LShoulder" and "RShoulder" now render as "LB" and "RB" for the Xbox 360 controller layout -On the inputs list, "LTAxis" and "RTAxis" now render as "LT" and "RT" for the Xbox 360 Controller layout and as "L2" and "R2" for the DualShock 4 Controller layout -On the inputs list, analog inputs with a modifier of (1.00) will no longer show their modifier -Shortened the names of analog inputs so that they can be more easily read in the UI -Added asterisks after the names of analog inputs in the inputs list -Added "*Indicates analog input" text below the VR controller inputs box -Added a line break between "Touch" and "pad" in the inputs list for the DS4 touchpad input -DS4 touchpad will now show as "Unused (Tpad)" on the inputs list for the Xbox 360 controller layout -Adjusted line spacing to make input names with multiple lines easier to read -Fixed "Pad Touch Mode" not initiating Auto-Save when toggled -Updated "Button Rebinded!" text to "Input Rebound!" to be inclusive of non-button inputs and also because "rebinded" is not a word! -Added unbind input confirmation text -Now if the user tries to bind a non-VR input before selecting a VR controller input, the user will be prompted to "Please Select VR Input First!" -Fixed bug where rebind confirmation text would show after auto-load before the user changed anything -Added confirmation when loading presets -Fixed confirmation when a new "Bindings" folder is created -Added button to open Bindings save directory (the folder icon next to "Save" and "Load") Tracking: -Upgraded "Both Hands" tracker mode to be "Auto-Detected", which will automagically track the handheld to both hands if both controllers are connected, or to only one hand if only one controller is connected, or to the HMD if no controllers are connected (although there is currently no way to toggle the handheld without controllers) -"Left Hand Only"/"Right Hand Only" tracker modes have been upgraded to look more like you're holding the handheld rather than having the handheld appear at the controller's point of origin, and so that the handheld doesn't clip as much into the controller model in the SteamVR dashboard/grid. The tracking position will also be automatically updated according to the handheld's scale and aspect ratio. -Stabilization is now applied to the tracker offset rather than the base position/rotation -Updated applicable UI toggles to appear as radio buttons Save Files and Presets: -Added presets for one-hand controller layouts -(Hopefully) fixed a bug where saving was impossible until a persistent "loading" flag was cleared -Updated bindings preset file extensions from ".json" to ".uwu" Devices: -Added a new device manager script that can more reliably detect the controller's index, type, handedness and enabled status v0.6.2 Advanced Capture Settings (10/03/2024) Screens Settings: -Added refresh button to sources list -Add advanced capture settings, which can be found at the top-right corner of the Screens settings -You can now filter windows by whether the window appears on the "Alt-Tab" list, if the window has a title, or if the window is a background process -Added auto-recapture feature that, when the captured window is closed, it searches for another window with the same name. This can be disabled in the advanced settings. -If the saved capture source is not found when auto-loading, it will now continue searching until a source with the same name is found or the search is canceled by selecting a different capture source Input Visualizer Settings: -The title of the window that is "on top" is now displayed on the handheld overlay. This was added as a common user error was switching to a different program and not switching back to the game so inputs wouldn't be sent to the right program. This can be disabled via the "Display top window title" toggle in the General settings. -Added "Input Visualizer Settings" section to General settings, and moved Input Visualizer toggle to that section Fixes: -Fixed settings not auto-saving after deselecting a capture source -Removed unused variables in SettingsData file v0.6.1c patch (09/19/2024) Changes: -Added error message to welcome screen that displays if handheld settings failed to load correctly -Removed Auto capture mode as it used Windows Graphics Capture if available, which has been found to be unstable and cause freezing/crashes -Made Print Window the default window capture mode as it seems to be the most stable and compatible capture method -Fixed desktop capture showing a semi-transparent white screen if monitor resolution changed while desktop capture was disabled -Slight optimization where desktop duplication no longer runs in the background when alt capture mode is enabled Known Issues: -Desktop capture on the top screen sometimes becomes completely transparent for a bit until it gets updated v0.6.1b patch (09/5/2024) Bug Fixes: -Fixed error where Handheld Settings would fail to load before reaching the tracking settings. This would cause the handheld to still track to the hands even if a different tracking option was selected the previous session, creating an absurdly large handheld if a "'TV' Mode" or "Big Screen" preset was selected. -Fixed "Alt Desktop Capture" toggle not appearing checked due to error in loading settings -Fixed bug where the top screen is set to enabled by default on a new settings file -Fixed bug where the cursor would show when "Screen Enabled" is toggled on even when "Show Cursor" is disabled due to a bug with uWindowCapture. This was fixed by showing the cursor for a second before disabling it. It's not a perfect solution, but it works. Other Changes: -Added "Made with Unity" and "Powered by OpenVR" to the About page -Removed VH logo from splash screen that replaced Unity logo, as I am not entirely sure if this is allowed according to Unity's terms of use v0.6.1a patch (9/1/2024) -Fixed bug where everything breaks if save directory doesn't exist at startup, i.e. a new install v0.6.1 Window Capture Update (8/31/2024) This update adds the much-requested window capture feature, which can be found in the "Screens" settings. This allows you to play games without filling up your whole desktop. It also lets you take advantage of the handheld's dual-screen feature without needing a second monitor. Note: Due to a restructuring of save data, screen settings may be reset when updating from older versions. Sorry for any inconvenience this may cause! Bindings: -Fixed bug where bindings wouldn't save if the autosave file was not found when the program starts -Fixed the "Are you sure?" dialog appearing instead of Quick Presets when the autosave file is not found or fails to load when the program starts Screens Settings: -The top and main screen settings have been consolidated! This means instead of having both of the screen's settings visible at the same time, you can now choose which screen you want to edit by selecting it at the top left of the settings. -Individual window capture added! You can now select a specific window to capture from the window list. Now setups that only have one monitor can take advantage of the handheld's dual-screen functionality! -You can check the "Show More" checkbox to show additional hidden windows -You can change the window capture API by pressing the "Change..." button next to "Capture Mode" -You can change the capture framerate to one of four presets: 30, 60, 90, and 120. You can also set the framerate using the slider. which has a range of 1-144. -You can toggle whether you want to show the cursor in the window capture -"Alt Desktop Capture" gives you the option to use the window capture APIs for desktop capture as well as their settings. -Desktop displays now appear in the sources list instead of being ID-based, allowing for (theoretically) more than 4 monitors and better parity between capture modes -Added "Fill" Display Mode, which crops out content based on the selected aspect ratio -Reworked 3D mode settings; Added "Swap Eyes" toggle to replace "Side-by-side 3D Flipped" toggle -Screens settings are now saved in "\Documents\My Games\Virtual Handheld\ScreensData\" instead of with the main handheld settings Handheld Overlay: -Added "No source selected!" text that shows when the screen is enabled but no source is displayed on the handheld screen -Added border and black backdrop to top screen overlay Tracking Settings: -Fixed handheld appearing on the floor at the center of the playspace when the "Big Screen (Stay)" preset is selected by changing the update mode to "On Handheld Enabled" instead of "Never" v0.6 Custom Aspect Ratios Update (6/29/2024) Aspect Ratios: -You can now set a custom aspect ratio! You're no longer limited to preset aspect ratios like 4:3 or 16:9. You can set the width or height to anywhere from 1-99. -The input visualizer now scales with the screen's aspect ratio, eliminating the need for letterboxing or pillarboxing on ratios other than 16:9 -Your screen's aspect ratio can now be auto-detected! If "Auto-Detect Ratio" is enabled, changes in your screen's aspect ratio will now be detected automatically. This is good for old games that change your screen's aspect ratio when switching to fullscreen. -Added buttons for portrait (aka "vertical") aspect ratios -3D modes are now supported on all aspect ratios -Added "Stretch" and "Fit" display modes for displaying content on the handheld screen Handheld Overlays: -The main screen overlay and input visualizer overlay have been combined into a single overlay instead of the screen overlay being slightly in front of the input visualizer overlay -The default scale of the handheld is now 40. "40 what?" you might be wondering. idk lol ¯\_(ツ)_/¯ Input Visualizer: -User will now be prompted to set their bindings in the Virtual Handheld Settings if all input bindings are found empty -Fixed bug where switching between Main and Alt sets would cause icons to inherit face button colors -Fixed issue where glyphs/icons would appear stretched on triggers and grips Virtual Gamepads: -Corrected the assumption that DualShock 4 triggers were dual-phase; now DirectInput will register a button press for L2/R2 if the trigger is pressed by any amount for better parity with real hardware Bindings: -Gamepad type toggle interaction is no longer disabled when a virtual gamepad is connected. Toggling the virtual gamepad type when a virtual gamepad is connected will auto-disconnect the virtual gamepad if automatic connect/disconnect is enabled. -Fixed binding confirmation text not appearing when setting a binding for the left VR controller -Trying to load a non-existent bindings profile no longer resets your bindings -Renamed "Quick Start" to "Quick Presets" -Deleted message saying that presets have moved -When resetting or loading bindings, the user will be asked if they are sure if they wish to proceed if the bindings are not empty -Updated gamepad presets to include DualShock 4 touchpad -Updated gamepad presets for Vive controllers to use Pad Touch Mode -Fixed bug where loading a binding would set the gamepad type to default but not change the actual current gamepad type to the default one -Added "Test Game Controller" button to open the "Game Controllers" settings window to test DirectInput controller compatibility Tracking: -Added "Big Handheld Mode" preset, which is the same scale that the default handheld scale used to be -Before, the "Big Screen Mode" preset was glitched so that it would retain whatever Update Transform mode was selected. Now this mode has been separated into "Big Screen (follow)" and "Big Screen (stay)" v0.5.3 Save-MORE-Setting Update! (5/25/2024) Virtual Gamepads: -Virtual gamepads will now auto-connect if a gamepad binding is detected when the handheld is enabled, the dashboard is toggled, or a gamepad button press is attempted (Auto-connect/disconnect can be disabled in the General settings.) -Virtual gamepads will auto-disconnect if a binding is loaded with a different virtual gamepad type or the default virtual gamepad is changed (Auto-connect/disconnect can be disabled in the General settings.) -Binding the DualShock 4 touchpad to an Xbox 360 controller layout no longer fallbacks to a "back" button press. Instead, it just does nothing. -Added slight jitter when thumbsticks are perfectly centered to prevent inputs from being desynced from not being properly updated (This behavior can be toggled off per-bindings profile) -Virtual DualShock 4 controllers can now simulate the button press at the end of a trigger pull. This will be simulated by VR controllers that have a tactile trigger click (i.e. Index, Vive). For inputs that don't have a tactile trigger click, or if "trigger_full_click" is not bound in the SteamVR Bindings UI (i.e. Oculus Touch), then a threshold of >99% trigger pull will be used. (This behavior can be toggled off per-bindings profile) General: -"Analog Stick Multiplier" renamed to "Joystick Multiplier" -Added section for virtual gamepad settings such as default virtual gamepad type and automatic connect/disconnect Bindings: -Presets moved to the new Quick Start tab -Added new icons to represent Keyboard & Mouse bindings and Gamepad bindings -Bindings now auto-save when changing a binding and will auto-load at startup -Added confirmation text for saving and loading bindings files -Gamepad type now saves with the bindings file, along with the added option to use the default gamepad type -Bindings file now saves what page/tab you were on in the Bindings menu -Instead of having two separate buttons for connecting virtual Xbox 360 and DualShock 4 controllers, there is now one "Connect Virtual Gamepad" button which changes to a "Disconnect Virtual Gamepad" button when a virtual gamepad is connected -Sliders in the keyboard & mouse bindings are now updated properly when the "Reset Bindings" button is pressed when not being shown -Fixed bug where the wrong scroll value would be used when binding a single scroll after loading a binding -"Single Scrolling" renamed to "One Shot Scroll" and "Continuous Scrolling" renamed to "Continuous Scroll" -Fixed issue where switching between gamepad types would make analog modifiers disappear from the VR buttons list -The depreciated "LTrigger" and "RTrigger" bindings now get converted to "LTAxis" and "RTAxis" respectively -Current Binding texts for gamepad DPads are now more consistent with other gamepad bindings -The "Expanded Keyboard" bindings tab button moved below the standard keyboard and next to the new "Mouse" bindings tab button -Expanded Keyboard layout rearranged to be more aesthetically pleasing Input Simulator: -Analog values bound to Trackpad Center fixed to use the correct input Input Visualizer: -The "Dashboard is open or SteamVR binding is incomplete" message changed to say "Inputs disabled while dashboard is open or SteamVR binding is incomplete" Colors: -Added confirmation text for saving and loading color files -Color settings will now auto-save when changed and will auto-load on startup -"On Text/Symbol" renamed to "On Glyphs", and "On Background" renamed to "Behind Glyphs" -The gamepad face button color setting now saves with color files -Fixed gamepad face button colors "Behind Glyphs" and "Off" settings not working properly for the DualShock controller layout -Fixed certain gamepad input text colors not changing properly when in an active state -The face button color will now show on the glyph face when a button is pressed when "Behind Glyphs" is selected Index: -Default bindings for Index controllers changed to be the same as Oculus controllers as the trackpads on Index controllers don't work very well as DPads About: -Added Rollthered's sticker and name to special thanks section for creating the new DJ Frog Advert. If you want your own name and/or sticker added to VH, consider becoming a memeber at https://buymeacoffee.com/zanycatxr/membership Changelog v0.5.2 Save-Your-Settings Update! (4-27-2024) Finally, you no longer have to configure your settings every time you start Virtual Handheld! At least, that's the way it should work! I kinda let feature creep catch up to me for this one, but it should still be mostly usable! I got sidetracked adding support for Windows Mixed Reality controllers, and then got distracted by adding controller type auto-detection and hot-swapping before I realized I was running out of time to add the main feature of this update: saving your settings! Next time, I'll try to not get distracted! NOTE: SteamVR Bindings for VH have changed. If you use the default bindings, you shouldn't have to do anything. If you created a custom binding (in the SteamVR Bindings UI, not VH itself) you will have to update them with the new input actions. SteamVR Bindings: -Added bindings for Windows Mixed Reality and HP Motion Controller layouts! -Triggers on Knuckles and Vive controllers now activate a button input from a threshold rather than a physical click at the end of the trigger (If you prefer the old behavior, you can bind it yourself in the SteamVR Bindings UI) -Joysticks and trackpads now use SteamVR's built-in system for D-pads (instead of being axis-based which caused a square deadzone on a circular field, which made it hard to reach corners) -"menu" has been renamed "menu_button" and "trackpad_click" has been renamed "trackpad_button" for consistency. Also, "trackpad_pressure" has been renamed "trackpad_force" -"grip_button" changed to generate from force sensor instead of pull value on Index controllers by default -"grip_squeeze" has been removed; "grip_analog" will now read from the force sensor instead of the "Pull" value on Index controllers. If you still want to use the "Pull" value, you can still bind it manually with a custom binding. -Haptic feedback disabled wherever applicable Save Files: -Settings will now be saved automatically and will load on startup. Settings will be saved to "\Documents\My Games\Virtual Handheld\HandheldSettings.o3o". No more having to change your settings every time you want to start playing! -New bindings profiles will be saved to "\Documents\My Games\Virtual Handheld\Bindings\". If this folder does not exist, then the old directory ("\Virtual Handheld_Data\") will be checked and legacy saves will be migrated. -New color profiles will be saved to "\Documents\My Games\Virtual Handheld\Colors\". If this folder does not exist, then the old directory ("\Virtual Handheld_Data\") will be checked and legacy saves will be migrated. Input Simulator: -Fixed bug where opening the dashboard while holding down a button would keep that button virtually held down while the dashboard was open Controller Layouts: -Added official support for Windows Mixed Reality and HP Motion Controllers! -VR controller type will now be auto-detected on connect if "Automatically update VR controller type on connect" is enabled in the General menu -Hot-swapping controllers is now supported (to the extent that your VR type allows) -Mismatched controller types are now supported! Want a Vive Controller in your left hand and an Index Controller in your right hand? You can do that now! -Button input visualizer updated to properly support mismatched controller layouts -You can now choose to have a "None" controller type set for one or both hands. This type will be set by default if no controller is detected, or if auto-detect is disabled on startup. -If the detected controller type does not match any of the officially supported types, it will default to showing the "All" layout Bindings Settings: -Mouse/analog sliders are now saved in bindings files -The "Reset Bindings" button now resets mouse/analogs sliders Screen Settings: -Screen settings are now auto-saved! -"Secondary Screen" renamed to "Top Screen" and put above Main Screen in the settings -Text on Alternate Desktop Capture toggle changed to mention integrated graphics Tracking Settings: -Tracking settings are now auto-saved! -Plus and minus buttons on the Head Lock Distance slider now update the correct slider instead of the z offset slider -Added "Big Screen Mode" preset, which puts the screen 10 meters away and makes it huge! Trackpads: -Added "Trackpad Center" as a bindable input -The "Trackpad Press" indicator on the handheld overlay moved above the trackpad directionals as the "Trackpad Center" indicator takes its place -"Trackpad Press" now always activates when the trackpad is "clicked" regardless of what direction is being pressed on the trackpad. This could be useful if you just want to use the whole trackpad as a button, but don't care about the direction. -Fixed issue with trackpads where pushing a direction with "require press" enabled and moving away from that direction deactivates that input and doesn't reactivate until you "click" the touchpad again -You can now move to the other directionals of the trackpad while "clicking" the trackpad, making it easier to use as a D-pad -The old mouthful of a setting "Require (left/right) trackpad press for directionals" changed to "Pad Touch Mode". If it is on, inputs will register from the trackpad merely being touched. If it is off, a trackpad "click" will be required to register an input. -Fixed mistake where the right trackpad toggle would affect both trackpads, while the left one did nothing -Pad Touch Mode is now saved along with the bindings file -Pad Touch Mode now gets reset when the "Reset Bindings" button is pressed -Pad Touch Mode can be set separately for Main and Alt -Analog inputs now obey the Pad Touch Mode setting Index/Knuckles: -The "Trackpad Press" indicator on the input visualizer overlay will now shrink according to the trackpad's force value -"Grip Pull" and "Grip Squeeze" have been reunited as a single "Grip" input, as it was determined having them be separate wasn't very useful ("Trackpad Center" now takes the place of "Grip Squeeze" in the save file, so Index users may need to update their bindings accordingly) -"System Touch" input added, which activates when the controller's system button is being touched; With this, the Index controllers can now take advantage of all 16 default inputs Other: -Checkmarks have been emboldened with pixel art graphics to be more visible on lower-resolution headsets -Parenthesis added to asterisks in the "All" layout that could either be digital or analog depending on the controller type -Input visualizer text "Inputs are disabled when dashboard is open!" changed to "Dashboard is open or SteamVR binding is incomplete" -The setting "Don't zero virtual analogs when switching between Main and Alt set (not recommended)" was removed as it was a vestigial setting made for the old analog system that is no longer used. I doubt that it will be missed. Supporters: -Added Bamber's name and sticker to the About page for supporting me on Buy Me a Coffee! You can get your name and/or sticker here by becoming a memeber here: https://buymeacoffee.com/zanycatxr/membership -Added white outline to Nestorboy's sticker! Changelog v0.5.1a minor patch (4/1/2024) -Added missing names (Hexson and Ayadea) to the testers section of the "About" screen -Added Must Be Kitten! logo to the "About" screen (Nefarius Software logo added in previous update but forgot to mention in changelog) -Fixed minor visual bug where the color of icons on the input overlay would be erroneously changed to the color of the face buttons when switching between Main and AltSet Changelog v0.5.1 UI Art Update (3/31/2024) This update not only introduces new pixel art graphics by the developer ZanyCat to the bindings UI and input overlay, but also fixes some notorious input problems, adds new keyboard keys that you can bind, updates mouse bindings, and updates controller-specific VR inputs. Input Fixes: -On launching, Virtual Handheld will now check the SteamVR setting "Enable global input from overlays (Experimental)" (This setting must be on for input blocking to work properly). If the setting is off, the handheld overlay will now display a message telling the user to go to the Virtual Handheld Settings. On the welcome screen, there will be a warning message with an "Auto Fix" button that will turn the setting on for you -Re-fixed an input bug that was accidentally re-introduced where the virtual Xbox 360 gamepad was able to navigate the settings menu, allowing you to adjust sliders while the settings were closed. This caused the handheld to sometimes change color, size, rotation, etc. when the joystick was moved Bindings UI: -Added new Xbox 360/DualShock 4 controller graphics and reworked controller binding UI for a more intuitive binding experience -Added new mouse graphics to keyboard & mouse binding UI -Inputs and bindings with analog values are now marked with asterisks in the Bindings menu -VR controller button list reordered to better match physical controller layout (B button above A button, for example) -Added "All" VR controller layout, which shows all possible inputs with controller-agnostic names -"Trackpad Click" renamed to "Trackpad Press" (or "Thumbrest" in the case of Oculus) -Keyboard & Mouse bindings separated into the "Keyboard & Mouse" tab and the "Expanded Keyboard" tab, with the standard keyboard available in both -Gamepad presets renamed to be more descriptive -"How to set bindings" text rewritten to be less confusing (hopefully) Input Overlay: -New pixel art graphics added to symbolize joysticks, D-pads, mouse and scroll wheel inputs -Fixed inconsistency where gamepad analogs would use square keys instead of round buttons Virtual Keyboard: -Moved numpad, volume and function 13-14 keys to the "Expanded Keyboard" tab -Added media keys and browser navigation keys Virtual Mouse: -Mouse button 4 and mouse button 5 (MB4 & MB5, you know, the buttons on the side of your gaming mouse?) can now be bound under the "Keyboard & Mouse" tab -"Base Mouse Speed" and "Base Scroll Speed" sliders added; These sliders determine the base speed of mouse inputs before the speed modifier is applied -Fixed oversight where "ScrLft" and "ScrRgt" were not loading properly from a saved bindings profile -Fixed the number of scroll clicks not loading properly from a saved bindings profile -Continuous (analog) scrolling is now actually analog: the amount you press now affects the speed of the scrolling -Mouse movement speed is no longer framerate-dependent Virtual Gamepad: -You can now bind the DualShock 4 trackpad button just like any other button. Note that this is the only button the Xbox 360 controller doesn't have an equivalent for, so it will default to the "Back" button when pressed on a virtual Xbox 360 controller Vive: -If grip_analog is not bound in the SteamVR Bindings UI (as is with Vive Wands), grip_button will be used for analog values bound to grip. Likewise, if trackpad_pressure is not bound, trackpad_click will be used for values bound to "Trackpad Press" Oculus: -Added support for the thumbrest on Touch Controllers (Takes the same input slot as Trackpad Press and activates when the thumbrest is touched) Index: -"Grip Pull" and "Grip Squeeze" have been separated for the Index layout; "Grip Pull" is how much your hand is closed onto the controller, and "Grip Squeeze" is how tightly the force sensor on the controller is being squeezed -Updated presets to use "Grip Squeeze" rather than "Grip Pull" -Index controllers should no longer generate haptic feedback when gripping -Analog values bound to "Trackpad Press" will now be mapped to the trackpad's pressure value Changelog v0.5 (2/18/2024) Features: -Replaced old analog toggles with a more flexible bindings system. Bind analog values however you want! -Replaced mouse movement toggles with the new system -You can now choose how many clicks you want for each scroll wheel turn or bind as an axis and hold it down to keep scrolling! -Bindings presets updated to accommodate the new system -Bindings presets are now tailored for the selected controller type Fixes: -Fixed a major bug that prevented input blocking from working on some systems! Yipppeeee! Other: -Made some adjustments to the About screen -Added testers who helped me out directly to the About screen -Added Nestorboy and ZanyCat stickers to the About screen. Have your sticker added by becoming a member: https://www.buymeacoffee.com/zanycatxr Changelog v0.4.1 (1/28/2024) Features: -Added Dashboard Detection, making it easier to interact with the SteamVR Dashboard while the handheld is enabled (This can be disabled in the General settings) -Replaced placeholder hand icon with new pixel art icons to represent input blocking -Added yellow "paused" input blocking icon to show when the input blocking is paused (i.e. when the dashboard is open) -Added orange "unknown" input blocking icon to show when the state of the input blocking is unknown (i.e. when Dashboard Detection is disabled) -Added a key to show the meaning of the input blocking icons -Added Console menu for viewing debug information -Console can be viewed on the handheld screens by toggling it on in the Console menu -'"TV" mode' preset in Tracking menu renamed to '"TV" mode (Tilted)' -'"TV" mode (Upright)' preset added which enables "Look-At-Me" toggle to keep the screen upright when enabled -Guide/PS button bound to Left Grip Alt on gamepad presets (squeeze both grips for guide button) -Added SteamVR bindings for Oculus Rift Remote, because why not? (D-Pad bound as joystick, back button bound as primary button. This has not been tested, so this does not mean it's supported!) -"Credits" page renamed to "About" -Added description and legal disclaimers to About page -Added Donate button to Welcome screen and link to memberships on About screen Fixes: -Fixed trigger mistakenly being bound to grip on Vive Wands in SteamVR bindings -Fixed input blocking icon not being properly toggled when input blocking is toggled -Small optimization where stabilizer script only runs when it's being used -Note text under Gamepad settings moved to not be covered up by "Load" button Other: -"Tap Controllers Together To Summon Handheld" changed to "Tap Controllers Together To Toggle Handheld" Changelog v0.4a (12/30/2023) -Fixed self-interaction bug with menus Changelog v0.4 (12/30/2023) Major Changes: -Added new Tracking menu that lets you customize how the handheld is tracked in 3D space! -You can now choose when your handheld position updates: Every Frame, On Enable, or Never. This allows you to place your handheld down in 3D space and have it stay there! -You can now stabilize the handheld position so it doesn't move so much while gaming, or turn it off to get the raw tracking position and rotation! -Size & Rotation settings are delegated from the General menu for ease of access! -You can have the handheld "Look-At-Me" which will have the handheld always facing you! -You can now offset the position of the handheld relative to the point of tracking! -You can choose what you want the handheld to be tracked to, whether it's a controller, HMD, or custom tracker! -4 presets are included for quick setup! Minor Changes: -You can now set the handheld scale up to 1000 (previously 100) so you can use your handheld as a big screen off in the distance! -Scale and angle sliders in General menu have been lengthened for finer value selection -Handheld no longer appears in the position it was in when it was last active before teleporting to it's new position when enabled -Changed message on desktop window to direct users to the SteamVR Dashboard Changelog v0.3.4 (12/9/2023) -Changed handheld scaling to be more granular (0-100) instead of discrete steps (1-8) -Handheld can now be scaled down to 0, allowing it to become invisible -Ghost inputs will no longer persist when handheld is disabled while holding a button. Conversely, inputs that are being held when the handheld is enabled will be activated. -By default, switching between Main and Alt set will zero the joysticks and triggers. This behavior can be reverted by checking "Don't zero virtual analogs when switching between Main and Alt set" in the General menu. (This will have no effect if "Disable Mouse/Analog Emulation When AltSet Is Being Used" is checked) -You can now increment and decrement the input bindings profiles in intervals of 10 Changelog v0.3.3 (12/2/2023) -Added uWindowCapture (currently only used as a backup desktop capture, but actual window capture will be added in the future!) -Added Toggle in Screens menu to switch Desktop capture method (only use when normal desktop capture does not work) -Updated desktop duplication error texture to be more helpful -Fixed bug where Scale slider was set to max by default, causing weird glitch when changing aspect ratios -Fixed capitalization of Nestorboy's name in the credits Changelog v0.3.2 (11/25/2023) Features: -Added Discord, YouTube and VRChat group links to the Welcome screen -Added "Analog Stick Multiplier" in General settings. This should hopefully negate issues related to diagnals being difficult to reach on some controllers. Fixes: -Fixed bug where left controller buttons won't light up on overlay when pressed if the button is binded to an Xbox 360 button and the corresponding button on the opposite side is not -Virtual Handheld no longer breaks if ViGEmBus driver is not installed and will now detect if it is not Other: -By default, buttons will now update to their correct state when switching between Main and Alt set. -You can change back to the old behavior (which was originally a bug, but is now a feature) by checking "Don't reset button states when changing between Main and Alt set". -Additionally, you can reset all buttons to their unpressed state by checking "Reset all button states when changing between Main and Alt set" -Added disclaimer to Welcome screen -Updated ReadMePls PDF -Redesigned logo by NestorBoy Changelog v0.3.1a (11/5/2023) Features: -Connecting a virtual Xbox 360 or DualShock 4 controller will now automatically set the gamepad type to the respective controller type in the bindings menu Fixes: -Fixed funny bug where keyboard ABXY keys appeared as Xbox ABXY in the bindings menu becuase I'm a silly little programmer who forgot to test it >w< -Fixed "Current Binding" text where it would say "Error2" instead of "AltSet" Other: -ViGEmBus Installer has been updated to it's final form (1.22.0) -Shoulder buttons now show as "L1" & "R1" and Triggers now show as "(L2)" & "(R2)" on button visualizer when using PS4 button layout -Shoulder buttons now show as "L1" & "R1" in bindings menu when using PS4 button layout -PlayStation face button graphics now show on bindings menu when using PS4 button layout instead of just spelling out the name of the button Changelog v0.3.1 (11/4/2023) Features: -Added sprite graphics for PlayStation controller buttons -You can now bind the Xbox Guide/PlayStation button! Yay! -Gamepad analog triggers are now shown on button visualizer in parenthesis when Xbox/PS4 controller is active and bound to trigger or grip (A more proper analog axis binding system will be added in the future) -You can now set the Xbox/PS4 controller face button colors to appear on the text/symbol, on the button background, or "Off" for the default button colors Fixes: -Button Visualizer now shows proper button shape when bindings are reset -Fixed DS4 DPad not working when analog is disabed when using AltSet -Fixed DS4 DPad getting stuck when binded only to the right controller -VR controller binding sets are no longer going slightly off the screen in the bindings menu -PS4 controller button names now show in bindings menu when PS4 controller checkbox is selected -Bindings menu now specifies Xbox ABXY over keyboard ABXY Other: -Updated "Zany Cat" color preset -Added new "Zany Cat Alt" color preset! Changelog v0.3 (10/29/2023) Features: -Brand new UI with things organized nicely into menus -You can now change the color of your handheld using the "Colors" menu! Changelog v0.2.1 (10/22/2023) Features: -Added Framerate slider that lets you choose a "Low", "Medium", "High", "Ultra" or "Infinite" framerate -Added FPS counter you can toggle on in settings Fixes: -Fixed "Move mouse with trackpad" not properly moving mouse on Y axis -Some small code optimizations Other: -Oculus Touch is now the default controller type as it is likely the most common VR controller type for SteamVR -"Connect/Disconnect Gamepad:" text and buttons made larger to make it more obvious what needs to be pressed Changelog v0.2 (10/15/2023) Features: -Added Alternate binding sets that you can switch to by binding and holding AltSet (hold)! -Mouse and analog emulation can be disabled when altset is being used! -VR Controller Buttons now highlight when you click them in the settings -Added debug input priority slider for diagnosing issues related to input blocking -Gamepad presets changed to take advantage of the new AltSet feature! Fixes: -Fixed issue were hands would freeze when inputs are locked in Resonite -Fixed Triggers binded as buttons not showing in UI -Fixed Trackpad Click and Menu buttons having the wrong "Now Binding" text -Fixed RTrigger/LTrigger as button not saving -Proper gamepad buttons now show in visualizer based on what gamepad type is selected in the settings -Fixed group URL in ReadMe file Changelog v0.1.1 (10/8/2023) Features: -You can now bind gamepad triggers to any VR button, not just triggers or grip! -You can now bind gamepad trigger pull to grip pressure or trackpad pressure -You can now swap analog triggers -When you bind an Xbox controller button, the equivalent PS4 controller button will also be binded and vice versa -You can now toggle the handheld with a single or tripple tap with the "Number of Taps" slider -You can now disable the main screen but still keep the input visualiser overlay on. This maybe useful for playing games on a different overlay, or for playing games with a VR mode that don't support SteamVR controllers. -Controller(X/B Swap) Preset added Fixes: -Cleaned up dashboard settings menu a bit -Fixed bug where bounding boxes for toggles were overlapping -Correction on "menu" buttons being called "menu/system" -Default Tap collider size adjusted