The open source OpenXR runtime
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

st/oxr: Add Vive Wand and Valve Index Controller bindings

v2: add vive & index haptic output to khronos/simple_controller

authored by

Christoph Haag and committed by
Jakob Bornecrantz
88ce6b5d 04ebc426

+188 -1
+38
src/xrt/include/xrt/xrt_defines.h
··· 359 359 XRT_DEVICE_PSMV = 2, 360 360 XRT_DEVICE_HYDRA = 3, 361 361 XRT_DEVICE_DAYDREAM = 4, 362 + XRT_DEVICE_INDEX_CONTROLLER = 5, 363 + XRT_DEVICE_VIVE_WAND = 6, 362 364 }; 363 365 364 366 /*! ··· 454 456 XRT_INPUT_DAYDREAM_TOUCHPAD_VALUE_Y = XRT_INPUT_NAME(0x0046, VEC1_ZERO_TO_ONE), 455 457 XRT_INPUT_DAYDREAM_POSE = XRT_INPUT_NAME(0x0047, POSE), 456 458 459 + XRT_INPUT_INDEX_SYSTEM_CLICK = XRT_INPUT_NAME(0x0050, BOOLEAN), 460 + XRT_INPUT_INDEX_SYSTEM_TOUCH = XRT_INPUT_NAME(0x0051, BOOLEAN), 461 + XRT_INPUT_INDEX_A_CLICK = XRT_INPUT_NAME(0x0052, BOOLEAN), 462 + XRT_INPUT_INDEX_A_TOUCH = XRT_INPUT_NAME(0x0053, BOOLEAN), 463 + XRT_INPUT_INDEX_B_CLICK = XRT_INPUT_NAME(0x0054, BOOLEAN), 464 + XRT_INPUT_INDEX_B_TOUCH = XRT_INPUT_NAME(0x0055, BOOLEAN), 465 + XRT_INPUT_INDEX_SQUEEZE_VALUE = XRT_INPUT_NAME(0x0056, VEC1_ZERO_TO_ONE), 466 + XRT_INPUT_INDEX_SQUEEZE_FORCE = XRT_INPUT_NAME(0x0057, VEC1_ZERO_TO_ONE), 467 + XRT_INPUT_INDEX_TRIGGER_CLICK = XRT_INPUT_NAME(0x0058, BOOLEAN), 468 + XRT_INPUT_INDEX_TRIGGER_VALUE = XRT_INPUT_NAME(0x0059, VEC1_ZERO_TO_ONE), 469 + XRT_INPUT_INDEX_TRIGGER_TOUCH = XRT_INPUT_NAME(0x005A, BOOLEAN), 470 + XRT_INPUT_INDEX_THUMBSTICK_X = XRT_INPUT_NAME(0x005B, VEC1_ZERO_TO_ONE), 471 + XRT_INPUT_INDEX_THUMBSTICK_Y = XRT_INPUT_NAME(0x005C, VEC1_ZERO_TO_ONE), 472 + XRT_INPUT_INDEX_THUMBSTICK_CLICK = XRT_INPUT_NAME(0x005D, BOOLEAN), 473 + XRT_INPUT_INDEX_THUMBSTICK_TOUCH = XRT_INPUT_NAME(0x005E, BOOLEAN), 474 + XRT_INPUT_INDEX_TRACKPAD_X = XRT_INPUT_NAME(0x005F, VEC1_ZERO_TO_ONE), 475 + XRT_INPUT_INDEX_TRACKPAD_Y = XRT_INPUT_NAME(0x0060, VEC1_ZERO_TO_ONE), 476 + XRT_INPUT_INDEX_TRACKPAD_FORCE = XRT_INPUT_NAME(0x0061, VEC1_ZERO_TO_ONE), 477 + XRT_INPUT_INDEX_TRACKPAD_TOUCH = XRT_INPUT_NAME(0x0062, BOOLEAN), 478 + XRT_INPUT_INDEX_GRIP_POSE = XRT_INPUT_NAME(0x0063, POSE), 479 + XRT_INPUT_INDEX_AIM_POSE = XRT_INPUT_NAME(0x0064, POSE), 480 + 481 + XRT_INPUT_VIVE_SYSTEM_CLICK = XRT_INPUT_NAME(0x0070, BOOLEAN), 482 + XRT_INPUT_VIVE_SQUEEZE_CLICK = XRT_INPUT_NAME(0x0071, BOOLEAN), 483 + XRT_INPUT_VIVE_MENU_CLICK = XRT_INPUT_NAME(0x0072, BOOLEAN), 484 + XRT_INPUT_VIVE_TRIGGER_CLICK = XRT_INPUT_NAME(0x0073, BOOLEAN), 485 + XRT_INPUT_VIVE_TRIGGER_VALUE = XRT_INPUT_NAME(0x0074, VEC1_ZERO_TO_ONE), 486 + XRT_INPUT_VIVE_TRACKPAD_X = XRT_INPUT_NAME(0x0075, VEC1_ZERO_TO_ONE), 487 + XRT_INPUT_VIVE_TRACKPAD_Y = XRT_INPUT_NAME(0x0076, VEC1_ZERO_TO_ONE), 488 + XRT_INPUT_VIVE_TRACKPAD_CLICK = XRT_INPUT_NAME(0x0077, BOOLEAN), 489 + XRT_INPUT_VIVE_TRACKPAD_TOUCH = XRT_INPUT_NAME(0x0077, BOOLEAN), 490 + XRT_INPUT_VIVE_GRIP_POSE = XRT_INPUT_NAME(0x0078, POSE), 491 + XRT_INPUT_VIVE_AIM_POSE = XRT_INPUT_NAME(0x0079, POSE), 492 + 457 493 // clang-format on 458 494 }; 459 495 ··· 495 531 { 496 532 // clang-format off 497 533 XRT_OUTPUT_NAME_PSMV_RUMBLE_VIBRATION = XRT_OUTPUT_NAME(0x0020, VIBRATION), 534 + XRT_OUTPUT_NAME_INDEX_HAPTIC = XRT_OUTPUT_NAME(0x0030, VIBRATION), 535 + XRT_OUTPUT_NAME_VIVE_HAPTIC = XRT_OUTPUT_NAME(0x0040, VIBRATION), 498 536 // clang-format on 499 537 }; 500 538
+12
src/xrt/state_trackers/oxr/oxr_binding.c
··· 253 253 interaction_profile_find( 254 254 log, inst, inst->path_cache.khr_simple_controller, out_p); 255 255 return; 256 + case XRT_DEVICE_INDEX_CONTROLLER: 257 + // clang-format off 258 + interaction_profile_find(log, inst, inst->path_cache.khr_simple_controller, out_p); 259 + interaction_profile_find(log, inst, inst->path_cache.valve_index_controller, out_p); 260 + // clang-format on 261 + return; 262 + case XRT_DEVICE_VIVE_WAND: 263 + // clang-format off 264 + interaction_profile_find(log, inst, inst->path_cache.khr_simple_controller, out_p); 265 + interaction_profile_find(log, inst, inst->path_cache.htc_vive_controller, out_p); 266 + // clang-format on 267 + return; 256 268 default: return; 257 269 } 258 270 }
+138 -1
src/xrt/state_trackers/oxr/oxr_binding_data.h
··· 60 60 XRT_INPUT_PSMV_TRIGGER_VALUE, 61 61 XRT_INPUT_HYDRA_TRIGGER_VALUE, 62 62 XRT_INPUT_DAYDREAM_TOUCHPAD_CLICK, 63 + XRT_INPUT_INDEX_TRIGGER_VALUE, 64 + XRT_INPUT_VIVE_TRIGGER_VALUE, 63 65 (enum xrt_input_name)0, 64 66 }, 65 67 }, ··· 76 78 XRT_INPUT_PSMV_MOVE_CLICK, 77 79 XRT_INPUT_HYDRA_MIDDLE_CLICK, 78 80 XRT_INPUT_DAYDREAM_BAR_CLICK, 81 + XRT_INPUT_INDEX_B_CLICK, 82 + XRT_INPUT_VIVE_MENU_CLICK, 79 83 (enum xrt_input_name)0, 80 84 }, 81 85 }, ··· 92 96 XRT_INPUT_PSMV_BODY_CENTER_POSE, 93 97 XRT_INPUT_HYDRA_POSE, 94 98 XRT_INPUT_DAYDREAM_POSE, 99 + XRT_INPUT_INDEX_GRIP_POSE, 100 + XRT_INPUT_VIVE_GRIP_POSE, 95 101 (enum xrt_input_name)0, 96 102 }, 97 103 }, ··· 108 114 XRT_INPUT_PSMV_BALL_TIP_POSE, 109 115 XRT_INPUT_HYDRA_POSE, 110 116 XRT_INPUT_DAYDREAM_POSE, 117 + XRT_INPUT_INDEX_AIM_POSE, 118 + XRT_INPUT_VIVE_AIM_POSE, 111 119 (enum xrt_input_name)0, 112 120 }, 113 121 }, ··· 121 129 .outputs = 122 130 { 123 131 XRT_OUTPUT_NAME_PSMV_RUMBLE_VIBRATION, 132 + XRT_OUTPUT_NAME_INDEX_HAPTIC, 133 + XRT_OUTPUT_NAME_VIVE_HAPTIC, 124 134 (enum xrt_output_name)0, 125 135 }, 126 136 }, ··· 137 147 XRT_INPUT_PSMV_TRIGGER_VALUE, 138 148 XRT_INPUT_HYDRA_TRIGGER_VALUE, 139 149 XRT_INPUT_DAYDREAM_TOUCHPAD_CLICK, 150 + XRT_INPUT_INDEX_TRIGGER_VALUE, 151 + XRT_INPUT_VIVE_TRIGGER_VALUE, 140 152 (enum xrt_input_name)0, 141 153 }, 142 154 }, ··· 153 165 XRT_INPUT_PSMV_MOVE_CLICK, 154 166 XRT_INPUT_HYDRA_MIDDLE_CLICK, 155 167 XRT_INPUT_DAYDREAM_BAR_CLICK, 168 + XRT_INPUT_INDEX_B_CLICK, 169 + XRT_INPUT_VIVE_MENU_CLICK, 156 170 (enum xrt_input_name)0, 157 171 }, 158 172 }, ··· 169 183 XRT_INPUT_PSMV_BODY_CENTER_POSE, 170 184 XRT_INPUT_HYDRA_POSE, 171 185 XRT_INPUT_DAYDREAM_POSE, 186 + XRT_INPUT_INDEX_GRIP_POSE, 187 + XRT_INPUT_VIVE_GRIP_POSE, 172 188 (enum xrt_input_name)0, 173 189 }, 174 190 }, ··· 185 201 XRT_INPUT_PSMV_BALL_TIP_POSE, 186 202 XRT_INPUT_HYDRA_POSE, 187 203 XRT_INPUT_DAYDREAM_POSE, 204 + XRT_INPUT_INDEX_AIM_POSE, 205 + XRT_INPUT_VIVE_AIM_POSE, 188 206 (enum xrt_input_name)0, 189 207 }, 190 208 }, ··· 198 216 .outputs = 199 217 { 200 218 XRT_OUTPUT_NAME_PSMV_RUMBLE_VIBRATION, 219 + XRT_OUTPUT_NAME_INDEX_HAPTIC, 220 + XRT_OUTPUT_NAME_VIVE_HAPTIC, 201 221 (enum xrt_output_name)0, 202 222 }, 203 223 }, ··· 775 795 }, 776 796 }; 777 797 778 - static struct profile_template profiles[3] = { 798 + 799 + #define MAKE_INPUT(COMPONENT, SUFFIX, INPUT) \ 800 + { \ 801 + .sub_path = OXR_SUB_ACTION_PATH_LEFT, \ 802 + .paths = \ 803 + { \ 804 + "/user/hand/left/input/" #COMPONENT "/" #SUFFIX, \ 805 + "/user/hand/left/input/" #COMPONENT, \ 806 + NULL, \ 807 + }, \ 808 + .inputs = \ 809 + { \ 810 + INPUT, \ 811 + (enum xrt_input_name)0, \ 812 + }, \ 813 + }, \ 814 + { \ 815 + .sub_path = OXR_SUB_ACTION_PATH_RIGHT, \ 816 + .paths = \ 817 + { \ 818 + "/user/hand/right/input/" #COMPONENT "/" #SUFFIX, \ 819 + "/user/hand/right/input/" #COMPONENT, \ 820 + NULL, \ 821 + }, \ 822 + .inputs = \ 823 + { \ 824 + INPUT, \ 825 + (enum xrt_input_name)0, \ 826 + }, \ 827 + }, 828 + 829 + #define MAKE_OUTPUT(COMPONENT, SUFFIX, OUTPUT) \ 830 + { \ 831 + .sub_path = OXR_SUB_ACTION_PATH_LEFT, \ 832 + .paths = \ 833 + { \ 834 + "/user/hand/left/output/" #COMPONENT "/" #SUFFIX, \ 835 + "/user/hand/left/output/" #COMPONENT, \ 836 + NULL, \ 837 + }, \ 838 + .outputs = \ 839 + { \ 840 + OUTPUT, \ 841 + (enum xrt_output_name)0, \ 842 + }, \ 843 + }, \ 844 + { \ 845 + .sub_path = OXR_SUB_ACTION_PATH_RIGHT, \ 846 + .paths = \ 847 + { \ 848 + "/user/hand/right/output/" #COMPONENT "/" #SUFFIX, \ 849 + "/user/hand/right/output/" #COMPONENT, \ 850 + NULL, \ 851 + }, \ 852 + .outputs = \ 853 + { \ 854 + OUTPUT, \ 855 + (enum xrt_output_name)0, \ 856 + }, \ 857 + }, 858 + 859 + static struct binding_template valve_index_controller_bindings[44] = { 860 + // clang-format off 861 + MAKE_INPUT(system, click, XRT_INPUT_INDEX_SYSTEM_CLICK) 862 + MAKE_INPUT(system, touch, XRT_INPUT_INDEX_SYSTEM_TOUCH) 863 + MAKE_INPUT(a, click, XRT_INPUT_INDEX_A_CLICK) 864 + MAKE_INPUT(a, touch, XRT_INPUT_INDEX_A_TOUCH) 865 + MAKE_INPUT(b, click, XRT_INPUT_INDEX_B_CLICK) 866 + MAKE_INPUT(b, touch, XRT_INPUT_INDEX_B_TOUCH) 867 + MAKE_INPUT(squeeze, value, XRT_INPUT_INDEX_SQUEEZE_VALUE) 868 + MAKE_INPUT(squeeze, force, XRT_INPUT_INDEX_SQUEEZE_VALUE) 869 + MAKE_INPUT(trigger, click, XRT_INPUT_INDEX_TRIGGER_CLICK) 870 + MAKE_INPUT(trigger, value, XRT_INPUT_INDEX_TRIGGER_VALUE) 871 + MAKE_INPUT(trigger, touch, XRT_INPUT_INDEX_TRIGGER_TOUCH) 872 + MAKE_INPUT(thumbstick, x, XRT_INPUT_INDEX_THUMBSTICK_X) 873 + MAKE_INPUT(thumbstick, y, XRT_INPUT_INDEX_THUMBSTICK_Y) 874 + MAKE_INPUT(thumbstick, click, XRT_INPUT_INDEX_THUMBSTICK_CLICK) 875 + MAKE_INPUT(thumbstick, touch, XRT_INPUT_INDEX_THUMBSTICK_TOUCH) 876 + MAKE_INPUT(trackpad, x, XRT_INPUT_INDEX_TRACKPAD_X) 877 + MAKE_INPUT(trackpad, y, XRT_INPUT_INDEX_TRACKPAD_Y) 878 + MAKE_INPUT(trackpad, force, XRT_INPUT_INDEX_TRACKPAD_FORCE) 879 + MAKE_INPUT(trackpad, touch, XRT_INPUT_INDEX_TRACKPAD_TOUCH) 880 + MAKE_INPUT(grip, pose, XRT_INPUT_INDEX_GRIP_POSE) 881 + MAKE_INPUT(aim, pose, XRT_INPUT_INDEX_AIM_POSE) 882 + 883 + MAKE_OUTPUT(haptic, , XRT_OUTPUT_NAME_INDEX_HAPTIC) 884 + // clang-format on 885 + }; 886 + 887 + static struct binding_template htc_vive_controller_bindings[24] = { 888 + // clang-format off 889 + MAKE_INPUT(system, click, XRT_INPUT_VIVE_SYSTEM_CLICK) 890 + MAKE_INPUT(squeeze, click, XRT_INPUT_VIVE_SQUEEZE_CLICK) 891 + MAKE_INPUT(menu, click, XRT_INPUT_VIVE_MENU_CLICK) 892 + MAKE_INPUT(trigger, click, XRT_INPUT_VIVE_TRIGGER_CLICK) 893 + MAKE_INPUT(trigger, value, XRT_INPUT_VIVE_TRIGGER_VALUE) 894 + MAKE_INPUT(trackpad, x, XRT_INPUT_VIVE_TRACKPAD_X) 895 + MAKE_INPUT(trackpad, y, XRT_INPUT_VIVE_TRACKPAD_Y) 896 + MAKE_INPUT(trackpad, click, XRT_INPUT_VIVE_TRACKPAD_CLICK) 897 + MAKE_INPUT(trackpad, touch, XRT_INPUT_VIVE_TRACKPAD_TOUCH) 898 + MAKE_INPUT(grip, pose, XRT_INPUT_VIVE_GRIP_POSE) 899 + MAKE_INPUT(aim, pose, XRT_INPUT_VIVE_AIM_POSE) 900 + 901 + MAKE_OUTPUT(haptic, , XRT_OUTPUT_NAME_VIVE_HAPTIC) 902 + // clang-format on 903 + }; 904 + 905 + static struct profile_template profiles[5] = { 779 906 { 780 907 .path = "/interaction_profiles/khr/simple_controller", 781 908 .bindings = khr_simple_controller_bindings, ··· 790 917 .path = "/interaction_profiles/mnd/ball_on_stick_controller", 791 918 .bindings = mnd_ball_on_stick_controller_bindings, 792 919 .num_bindings = ARRAY_SIZE(mnd_ball_on_stick_controller_bindings), 920 + }, 921 + { 922 + .path = "/interaction_profiles/valve/index_controller", 923 + .bindings = valve_index_controller_bindings, 924 + .num_bindings = ARRAY_SIZE(valve_index_controller_bindings), 925 + }, 926 + { 927 + .path = "/interaction_profiles/htc/vive_controller", 928 + .bindings = htc_vive_controller_bindings, 929 + .num_bindings = ARRAY_SIZE(htc_vive_controller_bindings), 793 930 }, 794 931 };