mirror of
https://gitlab.freedesktop.org/monado/monado.git
synced 2025-01-23 23:21:46 +00:00
d3893c229f
When using the Monado SteamVR driver plugin together with an Oculus Rift CV-1 and Oculus touch controllers, the grip / squeeze sensors (e.g., /user/hand/left/input/squeeze/value) and the thumbsticks did not work. This because SteamVR expects those controls to be exposed under a different path than what one would use for OpenXR, e.g., OpenXR /input/squeeze --> SteamVR /input/grip and OpenXR /input/thumbstick --> SteamVR /input/joystick The same is true for some other controller types. To fix this, add some new code for input subpath substitution, to perform this remapping, depending on binding type: For type "trigger": Substitute squeeze with grip For type "joystick": Substitute thumbstick with joystick For rare controller types where this would be the wrong thing to do, e.g., Valve Index (for type "joystick", needs the path to remain "thumbstick" as before), and for special cases not covered, we add a new optional parameter 'steamvr_path' which can be used in bindings.json to handle such mismatches in path flexibly to allow a dedicated path name for SteamVR, overriding the regular "OpenXR style" input path or auto-substituted path is if the parameter is omitted. This makes the Oculus Rift CV-1 touch controllers fully work under SteamVR. I haven't tested this with other controllers, as I only have Oculus controllers for testing atm. But after reading about the HTC Vive controllers, i did add a "steamvr_path" override for /input/menu -> /input/application_menu. Cfe. https://github.com/ValveSoftware/openvr/wiki/IVRDriverInput-Overview Also, a minor typo fix in steamvr_profiles.py as a bonus. Signed-off-by: Mario Kleiner <mario.kleiner.de@gmail.com>
117 lines
3.1 KiB
Python
117 lines
3.1 KiB
Python
#!/usr/bin/env python3
|
|
# Copyright 2020, Collabora, Ltd.
|
|
# SPDX-License-Identifier: BSL-1.0
|
|
"""Generate SteamVR input profiles from a JSON file describing interaction
|
|
profiles and bindings."""
|
|
|
|
from bindings import *
|
|
import argparse
|
|
import os
|
|
import errno
|
|
import json
|
|
|
|
|
|
def names(p):
|
|
hw_name = str(p.name.split("/")[-1])
|
|
vendor_name = str(p.name.split("/")[-2])
|
|
|
|
fname = vendor_name + "_" + hw_name + "_profile.json"
|
|
|
|
return hw_name, vendor_name, fname
|
|
|
|
|
|
def open_file(args, fname):
|
|
out_dir = str(args.output)
|
|
try:
|
|
os.makedirs(out_dir)
|
|
except OSError as e:
|
|
if e.errno != errno.EEXIST:
|
|
raise
|
|
|
|
fname = out_dir + "/" + fname
|
|
|
|
f = open(fname, "w")
|
|
return f
|
|
|
|
def get_required_components(path_type):
|
|
if path_type == "button":
|
|
return ["click", "touch"]
|
|
if path_type == "trigger":
|
|
return ["click", "touch", "value", "force"]
|
|
if path_type == "joystick":
|
|
return ["click", "touch"]
|
|
if path_type == "pose":
|
|
return []
|
|
if path_type == "vibration":
|
|
return []
|
|
return []
|
|
|
|
|
|
def main():
|
|
"""Handle command line and generate a file."""
|
|
parser = argparse.ArgumentParser(description='Bindings generator.')
|
|
parser.add_argument(
|
|
'bindings', help='Bindings file to use')
|
|
parser.add_argument(
|
|
'output', type=str, help='Output directory')
|
|
args = parser.parse_args()
|
|
|
|
bindings = Bindings.load_and_parse(args.bindings)
|
|
|
|
for p in bindings.profiles:
|
|
|
|
device_class = ""
|
|
if p.profile_type == "tracked_controller":
|
|
device_class = "TrackedDeviceClass_Controller"
|
|
else:
|
|
# TODO: profile for non-controller hw
|
|
continue
|
|
|
|
profile_type, vendor_name, fname = names(p)
|
|
|
|
input_source = {}
|
|
|
|
component: Component
|
|
for idx, component in enumerate(p.components):
|
|
subpath_name = component.steamvr_path
|
|
|
|
input_source[subpath_name] = {
|
|
"type": component.subpath_type,
|
|
"binding_image_point": [0, 0], # TODO
|
|
"order": idx
|
|
}
|
|
|
|
for req in get_required_components(component.subpath_type):
|
|
input_source[subpath_name][req] = req in component.components_for_subpath
|
|
|
|
j = {
|
|
"json_id": "input_profile",
|
|
"controller_type": "monado_" + vendor_name + "_" + profile_type,
|
|
"device_class": device_class,
|
|
"resource_root": "steamvr-monado",
|
|
"driver_name": "monado",
|
|
# "legacy_binding": None, # TODO
|
|
"input_bindingui_mode": "controller_handed",
|
|
"should_show_binding_errors": True,
|
|
"input_bindingui_left": {
|
|
"image": "{indexcontroller}/icons/indexcontroller_left.svg" # TODO
|
|
},
|
|
"input_bindingui_right": {
|
|
"image": "{indexcontroller}/icons/indexcontroller_right.svg" # TODO
|
|
},
|
|
"input_source": input_source
|
|
|
|
}
|
|
|
|
f = open_file(args, fname)
|
|
|
|
# print("Creating SteamVR input profile", f.name)
|
|
|
|
json.dump(j, f, indent=2)
|
|
|
|
f.close()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|