The open source OpenXR runtime
0
fork

Configure Feed

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

st/oxr: Add force feedback extension implementation

authored by

Daniel Willmott and committed by
Moses Turner
0bed5850 b710127f

+89
+5
src/xrt/state_trackers/oxr/oxr_api_funcs.h
··· 544 544 const XrHandJointsLocateInfoEXT *locateInfo, 545 545 XrHandJointLocationsEXT *locations); 546 546 547 + //! OpenXR API function @ep{xrApplyForceFeedbackCurlMNDX} 548 + XRAPI_ATTR XrResult XRAPI_CALL 549 + oxr_xrApplyForceFeedbackCurlMNDX(XrHandTrackerEXT handTracker, const XrApplyForceFeedbackCurlLocationsMNDX *locations); 550 + 551 + 547 552 //! OpenXR API function @ep{xrEnumerateDisplayRefreshRatesFB} 548 553 XRAPI_ATTR XrResult XRAPI_CALL 549 554 oxr_xrEnumerateDisplayRefreshRatesFB(XrSession session,
+4
src/xrt/state_trackers/oxr/oxr_api_negotiate.c
··· 232 232 ENTRY_IF_EXT(xrLocateHandJointsEXT, EXT_hand_tracking); 233 233 #endif 234 234 235 + #ifdef OXR_HAVE_MNDX_force_feedback_curl 236 + ENTRY_IF_EXT(xrApplyForceFeedbackCurlMNDX, MNDX_force_feedback_curl); 237 + #endif 238 + 235 239 #ifdef OXR_HAVE_FB_display_refresh_rate 236 240 ENTRY_IF_EXT(xrEnumerateDisplayRefreshRatesFB, FB_display_refresh_rate); 237 241 ENTRY_IF_EXT(xrGetDisplayRefreshRateFB, FB_display_refresh_rate);
+23
src/xrt/state_trackers/oxr/oxr_api_session.c
··· 473 473 474 474 /* 475 475 * 476 + * XR_MNDX_force_feedback_curl 477 + * 478 + */ 479 + 480 + #ifdef XR_MNDX_force_feedback_curl 481 + 482 + XrResult 483 + oxr_xrApplyForceFeedbackCurlMNDX(XrHandTrackerEXT handTracker, const XrApplyForceFeedbackCurlLocationsMNDX *locations) 484 + { 485 + OXR_TRACE_MARKER(); 486 + 487 + struct oxr_hand_tracker *hand_tracker; 488 + struct oxr_logger log; 489 + OXR_VERIFY_HAND_TRACKER_AND_INIT_LOG(&log, handTracker, hand_tracker, "xrApplyForceFeedbackCurlMNDX"); 490 + OXR_VERIFY_ARG_TYPE_AND_NOT_NULL(&log, locations, XR_TYPE_FORCE_FEEDBACK_CURL_APPLY_LOCATIONS_MNDX); 491 + 492 + return oxr_session_apply_force_feedback(&log, hand_tracker, locations); 493 + } 494 + 495 + #endif 496 + 497 + /* 498 + * 476 499 * XR_FB_display_refresh_rate 477 500 * 478 501 */
+2
src/xrt/state_trackers/oxr/oxr_api_verify.h
··· 65 65 OXR_VERIFY_AND_SET_AND_INIT(log, thing, new_thing, oxr_action_set, ACTIONSET, name, new_thing->inst) 66 66 #define OXR_VERIFY_HAND_TRACKER_AND_INIT_LOG(log, thing, new_thing, name) \ 67 67 OXR_VERIFY_AND_SET_AND_INIT(log, thing, new_thing, oxr_hand_tracker, HTRACKER, name, new_thing->sess->sys->inst) 68 + #define OXR_VERIFY_FORCE_FEEDBACK_AND_INIT_LOG(log, thing, new_thing, name) \ 69 + OXR_VERIFY_AND_SET_AND_INIT(log, thing, new_thing, oxr_force_feedback, FFB, name, new_thing->sess->sys->inst) 68 70 // clang-format on 69 71 70 72 #define OXR_VERIFY_INSTANCE_NOT_NULL(log, arg, new_arg) OXR_VERIFY_SET(log, arg, new_arg, oxr_instance, INSTANCE);
+8
src/xrt/state_trackers/oxr/oxr_objects.h
··· 793 793 const XrHandJointsLocateInfoEXT *locateInfo, 794 794 XrHandJointLocationsEXT *locations); 795 795 796 + XrResult 797 + oxr_session_apply_force_feedback(struct oxr_logger *log, 798 + struct oxr_hand_tracker *hand_tracker, 799 + const XrApplyForceFeedbackCurlLocationsMNDX *locations); 800 + 796 801 /* 797 802 * 798 803 * oxr_space.c ··· 998 1003 999 1004 bool 1000 1005 oxr_system_get_hand_tracking_support(struct oxr_logger *log, struct oxr_instance *inst); 1006 + 1007 + bool 1008 + oxr_system_get_force_feedback_support(struct oxr_logger *log, struct oxr_instance *inst); 1001 1009 1002 1010 /* 1003 1011 *
+23
src/xrt/state_trackers/oxr/oxr_session.c
··· 1008 1008 1009 1009 return XR_SUCCESS; 1010 1010 } 1011 + 1012 + XrResult 1013 + oxr_session_apply_force_feedback(struct oxr_logger *log, 1014 + struct oxr_hand_tracker *hand_tracker, 1015 + const XrApplyForceFeedbackCurlLocationsMNDX *locations) 1016 + { 1017 + struct xrt_device *xdev = hand_tracker->xdev; 1018 + 1019 + union xrt_output_value result; 1020 + result.force_feedback.force_feedback_location_count = locations->locationCount; 1021 + for (uint32_t i = 0; i < locations->locationCount; i++) { 1022 + result.force_feedback.force_feedback[i].location = 1023 + (enum xrt_force_feedback_location)locations->locations[i].location; 1024 + result.force_feedback.force_feedback[i].value = locations->locations[i].value; 1025 + } 1026 + 1027 + xrt_device_set_output(xdev, 1028 + hand_tracker->hand == XRT_HAND_LEFT ? XRT_OUTPUT_NAME_FORCE_FEEDBACK_LEFT 1029 + : XRT_OUTPUT_NAME_FORCE_FEEDBACK_RIGHT, 1030 + &result); 1031 + 1032 + return XR_SUCCESS; 1033 + }
+24
src/xrt/state_trackers/oxr/oxr_system.c
··· 183 183 return left_supported || right_supported; 184 184 } 185 185 186 + bool 187 + oxr_system_get_force_feedback_support(struct oxr_logger *log, struct oxr_instance *inst) 188 + { 189 + struct oxr_system *sys = &inst->system; 190 + struct xrt_device *ffb_left = GET_XDEV_BY_ROLE(sys, hand_tracking.left); 191 + struct xrt_device *ffb_right = GET_XDEV_BY_ROLE(sys, hand_tracking.right); 192 + 193 + bool left_supported = ffb_left && ffb_left->force_feedback_supported; 194 + bool right_supported = ffb_right && ffb_right->force_feedback_supported; 195 + 196 + return left_supported || right_supported; 197 + } 198 + 186 199 XrResult 187 200 oxr_system_get_properties(struct oxr_logger *log, struct oxr_system *sys, XrSystemProperties *properties) 188 201 { ··· 217 230 218 231 if (hand_tracking_props) { 219 232 hand_tracking_props->supportsHandTracking = oxr_system_get_hand_tracking_support(log, sys->inst); 233 + } 234 + 235 + XrSystemForceFeedbackCurlPropertiesMNDX *force_feedback_props = NULL; 236 + if (sys->inst->extensions.MNDX_force_feedback_curl) { 237 + force_feedback_props = 238 + OXR_GET_OUTPUT_FROM_CHAIN(properties, XR_TYPE_SYSTEM_FORCE_FEEDBACK_CURL_PROPERTIES_MNDX, 239 + XrSystemForceFeedbackCurlPropertiesMNDX); 240 + } 241 + 242 + if (force_feedback_props) { 243 + force_feedback_props->supportsForceFeedbackCurl = oxr_system_get_force_feedback_support(log, sys->inst); 220 244 } 221 245 222 246 return XR_SUCCESS;