* Move logging set up into own function
This does not affect the ability to log, the logging macros are
available globally.
* Clean up logging logic and add comments
The logic to find the logging location was broken, in that it always
placed the logs in the directory of the executable.
It was supposed to place the logs in
AppData/Roaming/matzman666/OpenVRAdvancedSettings/AdvancedSettings.log,
but it hasn't done this since at least git tag "v2.7". Since the change
hasn't been documented anywhere it is assumed to be an unintentional
regression.
The settings file is also currently placed in
AppData/Roaming/matzman666/OpenVRAdvancedSettings.ini, so this commit
undoes the probable regression until a strategy can be developed for
changing all paths at once.
* Move command line arg logging calls and add to manifest calls
The LOG_IF macros are cleaner than if blocks, and they do not need to be
in the middle of the Qt logic inside a giant try block.
* Remove unused QCoreApplication constructor in manifest logic
The object is not used in any of the manifest logic functions and
running without the remove/install manifest calls does not use it
either.
* Unindent logic in installManifest
The error checking was unnecessarily done in an else block. Moving it
into an if block and negating the result does the same but leaves the
rest of the logic at a much smaller indentation level.
* Change array in installManifest to be 0 intialized
Not zero initializing could lead to strange bugs if the terminating null
isn't there.
* Move manifest install/removal to separate function
The manifest handling is tangential to the actual main operation of the
program, hence moving it to a separate function improves readability of
the actual program.
The enum ReturnErrorCode has also been moved to the top in order to be
available to all functions. On introspection it is revealed that it
should always have been placed at the top.
* Unindent logic in removeManifest
The logic is unnecessarily indented, leading to harder to follow logic.
While the current logic isn't that hard to understand, it's better if it
follows the same rhythm as installManifest, which errors checks the same
way with a !QFile::exists( manifestQPath ).
* Move manifestPath out of install/removeManifest
Moving the variable outside of the functions reduces code duplication
and increases the versatility of the functions.
Variable was renamed from manifestQPath to manifestPath, because the Q
does not add anything to the name except (maybe wrongfully in the
future) typing a variable that has been typed with 'auto'.
The default variable has been removed, as it did not improve readability
at all.
* Rename installManifest to handleManifestInstallLogic
The new name better reflects the overall purpose. installManifest should
be a function that only installs the manifest.
* Move manifest related things into manifest namespace
* Move manifestInstallation logic into functions
The logic becomes clearer when replaced by function names instead of
just blocks of error checking.
* Refactor installManifest into separate functions
The uses for the removeManifest and installManifest functions could be
boiled down to three separate use cases:
* If the application was passed the "-installmanifest" arg:
Reinstall the manifest and enable application autostart.
* If the application was passed thed "-removemanifest" arg:
Remove the manifest.
* If the application was not passed "-desktop" and also not passed
"-nomanifest" (basically every start):
Install the manifest.
Where reinstalling means to remove the manifest if installed and then
install it.
The relatively complex logic in installManifest hid this logic behind
several if statements and changing what the "alreadyInstalled" bool
signified.
The refactored functions should make everything easier to understand.
* Add variable for manifest name
* Rename variables in main to camelCase
This appears to be the style chosen for the majority of the project.
* Change cerr to be LOG(ERROR) and add logging for manifest completion
The cerr calls are not likely to be seen by anybody. Logging them as
ERROR will make sure they are available for diagnostics.
* Add comments for new manifest functions
* Reorder namespaces and functions in main
Namespaces and functions are now ordered as they appear in main.
* Add static_cast to height and width in func call in main
width and height are "qreal" (typedef for double). Having them
implicitly cast to int leads to warnings on some compilers, and can lead
to doubt whether they're supposed to be converted.
* Move organizationName and applicationName into overlaycontroller.h
The string have been moved to static constexpr autos inside the
overlaycontroller.
Them remaining static means that they are included in the final binary,
even if they don't need to be included as static.
They should probably also not be directly gotten, instead being offered
up as static getters, but it's better to do them all at the same time in
a specific commit for that.
* Add comment to installApplicationManifest
Describing that OpenVR must be initialized before the function is
called.
* Change QApplication var name and add comments
The previous QApplication was named "a". This is obviously not
sufficient for such a large part of the application, even if the class
is rather boilerplate heavy.
* Add comments to Qt portions of main
Some things have been left uncommented. That's because I don't know what
it does.
* Change documentation for command line arguments, logging config
The information under the Desktop Mode header could be rolled under the
"-desktop" command line arg.
Support for the command line args of Easylogging++ and custom logging
files have not been supported for the original developer. Both should
probably be dropped in favor of having the same logging behavior for all
users.
* Remove error causing property from QML MyStackViewPage and PlayspacePage
The properties were causing an error message to be spammed in the log
QML QQuickText: Detected anchors on an item that is managed by a layout.
This is undefined behavior; use Layout.alignment instead.
and
QML RowLayout: Detected anchors on an item that is managed by a layout.
This is undefined behavior; use Layout.alignment instead.
Removing them fixed the spam and didn't noticeably change the appearance
of the pages.
OpenVR Advanced Settings Overlay
Adds an overlay to the OpenVR dashboard that allows access to advanced settings.
Features
- Set supersampling values.
- Enable/disable asynchronous and interleaved reprojection.
- Save supersampling and reprojection settings into profiles.
- Change several chaperone settings not accessible via SteamVR settings (to e.g. make it completely invisible).
- Chaperone Proximity Warning: Several warning methods can be configured.
- Chaperone Profiles: Allows to quickly switch chaperone geometry and settings while in VR.
- Temporarily move and rotate the playspace.
- Floor height fix.
- Displays several performance statistics and other statistics (e.g. headset rotations).
- Select the playback/mirror/recording audio device
- Mute/unmute and set volume of audio mirror device.
- Mute/unmute and set volume of microphone device.
- Implements push-to-talk and allows to configure push-to-talk profiles.
- Desktop mode shows a window on the desktop instead of a vr overlay.
- Revive settings support (Requires Revive 1.0.4+ for full functionality).
- VR Keyboard Input Utilities
- Simple Alarm Clock
- Player height adjust toggle (Credits to mklim)
Usage
Installer
Download the newest installer from the release section and execute it.
If you have an older standalone version installed, delete the old application folder first.
Standalone
I am not currently providing standalone Archives if you want a standalone version you can:
Download the newest standalone archive from the release sectionand unpack the archive.
To install for the first time simply start AdvancedSettings.exe once while SteamVR is running. It will register with SteamVR and automatically starts whenever SteamVR starts (Can be disabled in the settings).
To upgrade an existing installation first stop SteamVR and delete the old application folder (or override it). Then start SteamVR and run AdvancedSettings.exe once.
Command Line Arguments
The application (AdvancedSettings.exe) can be run with the following five optional arguments:
"-desktop": Creates a settings window on the desktop as well as in VR. Running startdesktopmode.bat in the install directory has the same effect.
"-nosound": Forces sound effects off.
"-nomanifest": Forces not using a .vrmanifest.
"-installmanifest": Force installs the .vrmanifest and adds the application to autostart. If you're having issues with autostart not working try running the program once with this set. The program will exit early when this flag is set.
"-removemanifest": Force uninstalls the .vrmanifest. This should be done every time the application is uninstalled. On Windows it is automatically done by the uninstaller. The program will exit early when this flag is set.
In addition, the application can receive the command line arguments from the Easylogging++ library.
Logging Config
The logging output of the Easylogging++ library can be customized by placing a file called logging.conf in the directory of the binary. This should be considered for advanced users only and it is not recommended.
Preview builds
If you want to try latest and greatest unreleased features, you can download latest changes in the alpha branches of the repository.
Documentation
Top 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
- Microphone: Allows to set the microphone volume and to mute/unmute it.
- Push-to-Talk: Enable/disable push-to-talk and allows to apply push-to-talk profiles. Profiles can be created on the Audio page.
- 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 where 2.0 means twice the number of pixel.
- Compositor Render Target Multiplier: Supersampling setting for the OpenVR compositor (Requires restart). Compositor supersampling still behaves the old way where 2.0 means four-times the number of pixel.
- Enable Advanced Supersample Filtering: Einable/disable image filtering on supersampled renderings.
- Allow Asynchronous Reprojection: Enable/disable asynchronous reprojection.
- Allow Interleaved Reprojection: Enable/disable interleaved reprojection.
- Enable Always-on Reprojection: Enable/disable forced reprojection.
- Restart SteamVR: Restart SteamVR (May crash the Steam overlay when SteamVR Home is running when you restart. Therefore I advice that you close SteamVR Home before restarting).
- 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. Unlike the slider in the chaperone settings, this one is not capped at 30%. When set to 0 chaperone bounds are completely invisible.
- 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.
- 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.
- Proximity Warning Settings: Opens a page that allows to configure several warning methods for when the user comes too close to the chaperone bounds.
- Flip Orientation: Flips the orientation of the play space.
- Reload from Disk: Reloads the chaperone bounds geometry from disk.
- 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.
- Audio Warning: Plays an alarm sound when the user's distance to the chaperone falls below the configured activation distance.
- Loop Audio: Whether the audio alarm should only be played once or in a loop.
- Loop Audio: Modify audio volume as a function of the user's distance to the chaperone.
- Open dashboard: Opens the dashboard when the user's distance to the chaperone falls below the configured activation distance. The idea is to pause the game (most single-player games auto-pause when the dashboard is shown) to give the user time for reorientation.
- Velocity Dependent Fade/Activation Distance: Dynamically modifies the chaperone's fade distance and the proximity warning's activation distance as a function of the player's speed. The used formula is: distance = old_distance * ( 1 + distance_modifier * max(left_controller_speed, right_controller_speed, hmd_speed) )
- Play Space Page:
Allows to temporarily move and rotate the center of the playspace. This allows to reach interaction elements that are just inside 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?).
- Virtual Move Shortcut: Allows moving the placespace center by holding down the application menu shortcut and moving the controller.
- Adjust Chaperone: When enabled then the chaperone bounds stay in place when the playspace is moved or rotated (so noone gets hurt). Unfortunately this does not work when moving up/down.
- Playspace 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.
- 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.
- Microphone: Allows to select the microphone device, set its volume and to mute/unmute it.
- Proximity Sensor Mutes/Unmutes Microphone: Allows the proximity sensor to mute the microphone when the user is not wearing the HMD, and to unmute it when the user is wearing the HMD.
- Push-to-Talk: Enable/disable push-to-talk. When push-to-talk is activated the microphone gets muted unless one of the configured buttons is pressed on one of the configured controllers.
- Left Controller: Configure the left controller for push-to-talk.
- Right Controller: Configure the right controller for push-to-talk.
- Show Notification: Shows a notification icon in the headset when push-to-talk is enabled a configured button is pressed.
- Push-to-Mute: Inverse push-to-talk. The Microphone is unmuted by default and muted when any of the configured buttons is pressed.
- PTT Profile: Allows you to apply/define/delete push-to-talk profiles that save buttons, controller and notification settings.
- Audio Profile: Allows you to apply/define/delete audio profiles that save playback devices, mute state, and volume.
- Revive Page:
The Revive page is only visible when the Revive overlay is installed. In case an installed Revive overlay is not correctly detected you can force the Revive page in the settings.
Any changes to controller settings are immediately applied by Revive (Requires Revive 1.0.4+).
- Render Target Override: Overrides the Oculus-side render target (aka supersampling). Enabling it prevents Oculus applications from dynamically modifying this value. Warning: Is applied on top of the SteamVR supersampling value. (pixelsPerDisplayPixel setting in the vrsettings file)
- Grip Button mode: Allows to set the grip button mode. (ToggleGrip setting in the vrsettings file)
- Toggle Delay: Allows to configure the toggle delay. (ToggleDelay setting in the vrsettings file)
- Trigger As Grip: Swaps the trigger and grip. (TriggerAsGrip setting in the vrsettings file)
- Deadzone: Allows to modify the simulated thumbsticks' deadzone. (ThumbDeadzone setting in the vrsettings file)
- Sensitivity: Allows to modify the simulated thumbsticks' sensitivity. (ThumbSensitivity setting the vrsettings file)
- Yaw: Allows to modify the touch controllers yaw orientation. (TouchYaw setting the vrsettings file)
- Pitch: Allows to modify the touch controllers pitch orientation. (TouchPitch setting the vrsettings file)
- Roll: Allows to modify the touch controllers roll orientation. (TouchRoll setting the vrsettings file)
- X: Allows to modify the touch controllers x-offset. (TouchX setting the vrsettings file)
- Y: Allows to modify the touch controllers y-offset. (TouchY setting the vrsettings file)
- Z: Allows to modify the touch controllers z-offset. (TouchZ setting the vrsettings file)
- Controller Profile: Allows to apply/define/delete controller profiles that save the controller settings (grip button mode, deadzone, sensitivity, pitch/yaw/roll and x/y/z-offsets).
- 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.
-
Alarm Clock: Just a simple alarm clock so you don't miss important appointments. VR can sure mess up perception of time. Does not work in desktop mode.
-
Steam Desktop Overlay Width: Allows to increase the size of the Steam desktop overlay. Useful for multi-monitor setups.
- Accessibility Page:
- Adjust Player Height: Offsets the player height to allows short or wheelchair-bound players to fully interact with height-limited applications by both boosting their height and being able to touch the in-game floor when necessary by pressing a configurable motion controller button.
- 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).
- Left Controller Max Speed: Shows the max speed of the left controller.
- Right Controller Max Speed: Shows the max speed of the right controller.
- Presented Frames: Number of frames presented to the hmd in the currently running application.
- Dropped Frames: Number of frames dropped in the currently running application.
- Reprojected Frames: Number of frames reprojected in the currently running application.
- Timed Out: Number of times the currently running application timed out.
- Reprojection Ratio: Ratio of presented frames to reprojected frames.
- Settings Page:
- Autostart: Allows you to enable/disable auto start.
- Force Revive Page: Force the Revive page button on the root page to be visible.
How to Compile
Building on Windows
Full build instructions can be found here.
Building on Linux
If you want to run Advanced Settings on linux you can build it yourself using qmake and make or using Qt Creator, you'll have to copy the res folder from the src folder into folder that contains the binary
and copy third-party/openvr/lib/linux64/libopenvr_api.so into your systems library path.
If you want to contribute changes running clang-format is necessary. More details are in the CONTRIBUTING.md file.
Notes:
-
The center marker and the play space marker are provided by the chaperone subsystem, and therefore they will have the same color and visibility settings as the chaperone bounds.
-
Application autostart can also be configured in the SteamVR menu (SteamVR->Settings->Applications->"Advanced Settings").
-
You can modify the shutdown wait time when restarting SteamVR by opening restartvrserver.bat and changing the number behind "timeout /t" (unit is seconds).
Known Bugs
- None yet.
License
This software is released under GPL 3.0.












