xrizer#

xrizer is a reimplementation of OpenVR on top of OpenXR. This enables you to run OpenVR games through any OpenXR runtime without running SteamVR.

Application developers: The OpenVR implementation is incomplete and contains only what’s necessary to run most games for compatibility and may omit certain information - if you plan to implement software, utilize the OpenXR API.

Installation#

If you’re using the Flatpak version of WiVRn, xrizer is already included, however if necessary you can get an updated version from a distribution package or GitHub by following the steps below.

Install xrizer (latest release) or xrizer-git (nightly) from the AUR.

You may also want to install the lib32- version for compatibility with 32-bit games.

Install media-libs/xrizer from Guru.

See the xrizer README for installation instructions.

Edit your profile and change the ‘OpenVR Compatibility Type’ to xrizer.

Using full body trackers#

Support for full body trackers when using Monado has been merged. Make sure you’re using at least v0.4 or the latest nightly (see above).

Fixing VRChat gestures on Index controllers#

When using Index controllers, VRChat uses skeletal summary data to determine the gesture you’re performing, which is not supported by xrizer. The next branch maintained by Sapphire (@sapphiwe on Discord) contains patches by RinLovesYou to add support for skeletal summary.

To use the above branch:

  • Click the three dots next to the profile selector and select ‘Edit profile’
  • If a popup asks if you would like to duplicate the profile, click yes.
  • Scroll down to ‘OpenVR Compatibility’ and set the following fields:
    • OpenVR Compatibility Repo: https://github.com/ImSapphire/xrizer
    • OpenVR Compatibility Branch: next
  • Clean build your profile from the menu at the top right, or use the Ctrl+F5 keybind.

Apply an overlay over nixpkgs to override the xrizer src:

{
  nixpkgs.overlays = [
    (final: prev: {
      xrizer = prev.xrizer.overrideAttrs rec {
        src = final.fetchFromGitHub {
          owner = "ImSapphire";
          repo = "xrizer";
          # Fill in the latest commit hash from https://github.com/ImSapphire/xrizer/commits/next (click the Copy full SHA button on the right side)
          rev = "";
          # Fill with the correct hash from the build error
          hash = "";
        };

        cargoDeps = prev.rustPlatform.importCargoLock {
          lockFile = src + "/Cargo.lock";
          outputHashes = {
            <any other packages that need it>
          };
        };
      };
    })
  ];
}

Or reference the source using flakes (so that it updates with the nix flake update command):

# flake.nix
{
  inputs.xrizer-next = {
    url = "github:ImSapphire/xrizer/next";
    flake = false;
  };

  outputs = {
    nixosConfigurations = { nixpkgs, ... } @ inputs: {
      <hostname> = {
        <...>

        specialArgs = { inherit <...> inputs; };
      };
  };
}

# configuration.nix
{ inputs, ... }:
{
  nixpkgs.overlays = [
    (final: prev: {
      xrizer = prev.xrizer.overrideAttrs {
        src = inputs.xrizer-next;

        cargoDeps = prev.rustPlatform.importCargoLock {
          lockFile = inputs.xrizer-next + "/Cargo.lock";
          outputHashes = {
            <any other packages that need it>
          };
        };
      };
    })
  ];
}

Using controllers / other devices as full-body trackers#

You can use the XRIZER_TRACKER_SERIALS environment variable, documented in the Environment Variables section of the xrizer README, to force devices to be used as full-body trackers.

You can get the serial numbers using motoc’s show subcommand, or by looking at the top of the Monado/WiVRn log.

Rebinding controls#

The process is mostly the same as OpenComposite, however there are a few things different:

  • The default directory name is xrizer, not OpenComposite
  • You can override the location of the custom bindings directory using the environment variable XRIZER_CUSTOM_BINDINGS_DIR
  • The name of the .json file will be the internal name of the controller type, but lowercase (e.g. oculustouch.json)