Skip to content

About

A small software + native driver shim that bridges Standable: Fullbody Estimation to Linux, accommodating both SteamVR and Monado (primarily tested with native WiVRn) support.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

10 Commits

Folders and files

Repository files navigation

Standable Linux Bridge

A small software + native driver shim that bridges Standable: Fullbody Estimation to Linux, accommodating both SteamVR and Monado (primarily tested with native WiVRn) support.

No file editing/replacement required.

Disclaimer

This is an unofficial community project. It is not affiliated with, endorsed by, or supported by the developers of Standable. Please do not contact official Standable support for issues relating to Linux, Proton, or this bridge.

Also, AI was used for general troubleshooting and prototyping, although the entire project was rewritten manually to fit my own architectural choices instead.

Pre-requisites

  • A native Steam install: Flatpak versions of Steam, Monado or WiVRn won't work out of the box.
  • A VR Runtime: either SteamVR or anything Monado based.
  • A legit copy of Standable: Fullbody Estimation bought on Steam and installed on the system.
  • A valid Steamworks API: Standable and the bridge both require a file named steam_api64.dll placed in the app's root directory to authenticate the install. If missing, the install script will try to look for a valid one within your games library to borrow.

Install

As of right now, manual building is required.

1. Install Dependencies

Ubuntu / Debian / Linux Mint:

sudo apt update
sudo apt install build-essential cmake mingw-w64 libopenxr-dev

# Note: The bridge requires the POSIX thread model for MinGW.
# If the build script later complains about threads, run this and select the "posix" option:
# sudo update-alternatives --config x86_64-w64-mingw32-g++

Arch Linux:

sudo pacman -S base-devel cmake mingw-w64-gcc openxr

Fedora:

sudo dnf group install "Development Tools"
sudo dnf install cmake gcc-c++ mingw64-gcc-c++ openxr-devel

2. Clone the Repository

Download this repository and navigate into it:

git clone https://github.com/GasticNox/standable-linux-bridge.git
cd standable-linux-bridge

3. Build the Binaries

You can use the provided build script to build all the necessary binaries:

./scripts/build.sh

4. Install the Bridge

After building is successful, you can use the provided install script to actually copy the required files onto Standable's directory:

./scripts/install.sh

The install script will also ask for VRChat and Monado support. These are both opt-in! Make sure you read through the installation process!

5. Set Launch Commands

Once the bridge is installed through the script, it will give you a similar output:

========================================
Compatibility bridge installed and ready!
Paste this command into Standable's launch arguments:

~/.steam/steam/steamapps/common/Standable Full Body Estimation/scripts/launch_standable.sh %command%
========================================

Copy the given launch command into Standable's own:

Steam > right click Standable: Fullbody Estimation > Properties > Paste into Launch Options.

COPY the one given by the actual install script, and not from this example! And make sure to replace the entire command line! If you make use of special launch flags or variables for Standable, you can simply add them to this one. The launch script should correctly relay all flags.

Compatibility

SteamVR Support

Tested with Steam Link on a Quest 2.

SteamVR Support is active by default, defined by the native driver shim placed within Standable's root directory. SteamVR will load the driver automatically (if enabled), and automatically launch Standable.

All devices and tracking data is relayed to Standable through the bridge, and similarly the bridge will relay Standable's trackers to the real SteamVR instance.

Mixed Tracking under SteamVR should be working fine, although I couldn't test it since I have no real trackers.

I should note during my tests with Steam Link, Standable's trackers often appeared very jittery. This can be solved by turning on "Disable Velocity Math" in Standable's Settings. Strangely, this issue didn't seem to happen during my WiVRn tests.

Monado (WiVRn) Support

This was only tested through native WiVRn (not the Flatpak version), so global support is still quite uncertain...

Also note that not all of Standable's features might work under Monado, but basic ones should.

Monado Support is set during install and defined by an OpenXR API Layer registered at ~/.local/share/openxr/1/api_layers/explicit.d/xr_apilayer_standable_bridge.json.

This makes our bridge act in-between any VR Game running under OpenXR and Standable itself.

To use it, prepend XR_ENABLE_API_LAYERS=XR_APILAYER_STANDABLE_bridge to any game you'd like to use with Standable. It will take care of loading the native driver shim and automatically launch Standable through Steam (assuming you own it legitimately and it's installed).

Head and controller tracking is properly relayed to Standable. It also supports WayVR's Playspace Mover or similar implementations.

Mixed Tracking should still be possible, albeit with some differences... however that still remains untested since (once again) I do not have any real trackers to begin with.

When playing through Monado/OpenXR, the Standable UI will give warnings related to SteamVR's drivers and paths. These can be ignored, as its backend is indeed working and settings can still be adjusted through the UI as usual!

VRChat Support

VRChat Support is set during install and defined by a file named .vrclink placed into Standable's root directory.

When support is enabled (so when this file is present) it will try to look for and create a symlink to VRChat's own AppData directory whenever you launch Standable.

This will grant Standable the possibility of reading off of your VRChat Log File for auto-calibration. Additionally, this bridge will too watch over the same log file for height changes, and place them into Standable's Wine Prefix registry, so copying height from VRChat should work too.

Only thing that is currently NOT impleme.nted is setting the recommended VRChat Settings from within Standable. You'll have to set those settings yourself if you intend on using Standable with VRChat.

One extra thing VRChat Support does is telling Standable when VRChat is running by executing a stub program (vrchat_stub.cpp) in the same Wine prefix while the game is actually open, and killing it when it isn't.

Updating

If Standable is ever updated (or uninstalled), it could clean-up all the files added to its install making it "incompatible" with Linux once again. Re-installing this from scratch might be therefore necessary with every update.

If Standable still refuses to work even after a bridge re-install, the update could have broken the bridge. Downgrading Standable might be necessary until the bridge is updated to work with the newest version.

Uninstall

If you wish to get rid of this bridge and all its files, here's the list of files created by this bridge:

From Standable's directory:

  • vrserver.exe
  • launch_standable.sh
  • bin/linux64/driver_standable.so
  • .vrclink (if VRChat support was enabled)
  • VRChat.exe (if VRChat support was enabled)

OpenXR API Layer (if Monado support was enabled):

  • ~/.local/share/openxr/1/api_layers/explicit.d/xr_apilayer_standable_bridge.json

Or, from Standable's root directory, you can run this one-liner to remove everything at once:

rm -f vrserver.exe VRChat.exe launch_standable.sh .vrclink bin/linux64/driver_standable.so ~/.local/share/openxr/1/api_layers/explicit.d/xr_apilayer_standable_bridge.json

How it Works

It is mainly split into two pieces:

  • src/proton_bridge (vrserver.exe) — a Windows executable, run under Proton, that launches Standable's own UI (and driver) and forwards its tracking data pretending to be SteamVR's vrserver instance.
  • src/linux_host (driver_standable.so) — a native .so, loaded by SteamVR's runtime or as an OpenXR API layer, that receives that data on the Linux/Host side.

Both sides communicate through shared memory (src/common/ipc.*) on a simple loop, writing only bits of data on places they own.

It expects to relay mainly devices information and pose data.

Launch Script

If everything is set properly, when launching Standable, the command will go through a custom launch script. The script will replace the target Standable.exe with our custom vrserver.exe (our proton bridge), launching it with whatever Proton version was set through Steam.

The bridge will then launch Standable.exe, relaying all envs and flags.

Configuration

Logging is off by default. To enable, just add BRIDGE_LOGGING=1 to Standable's own launch command. It will write to a file named bridge_log.txt.

  • When using with SteamVR, you can enable driver-side logging by adding the same variable to SteamVR's launch settings.
  • Similarly, when using with Monado/OpenXR, you can enable driver-side logging by adding the same variable to the game's launch settings.

Here's a list of the currently implemented environment variables and flags:

Prop What it does
BRIDGE_LOGGING=1 Enable writing logs to bridge_log.txt.
BRIDGE_DEBUGGING=1 Include [DEBUG]-level lines (verbose).
--force (or -f) Will forcefully load Standable's Driver even without a VR runtime.

bridge_log.txt is created within Standable's install root. Both sides will append to the same file, differentiated by their PIDs.

About

A small software + native driver shim that bridges Standable: Fullbody Estimation to Linux, accommodating both SteamVR and Monado (primarily tested with native WiVRn) support.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages