The open source OpenXR runtime

xrt: Adds support for XR_META_body_tracking_full_body xrt-devices

Part-of: <https://gitlab.freedesktop.org/monado/monado/-/merge_requests/2481>

authored by

korejan and committed by
Marge Bot
21e7c755 971c920a

+209 -10
+2
CMakeLists.txt
··· 369 369 option(XRT_FEATURE_OPENXR_VISIBILITY_MASK "Enable XR_KHR_visibility_mask" ON) 370 370 option(XRT_FEATURE_OPENXR_VULKAN_SWAPCHAIN_FORMAT_LIST "Enable XR_KHR_vulkan_swapchain_format_list" ON) 371 371 option(XRT_FEATURE_OPENXR_XDEV_SPACE "Enable XR_MNDX_xdev_space" ON) 372 + option_with_deps(XRT_FEATURE_OPENXR_BODY_TRACKING_FULL_BODY_META "Enable XR_META_body_tracking_full_body" DEPENDS XRT_FEATURE_OPENXR_BODY_TRACKING_FB) 372 373 373 374 # Interaction extension support. 374 375 option(XRT_FEATURE_OPENXR_INTERACTION_EXT_EYE_GAZE "Enable XR_EXT_eye_gaze_interaction" ON) ··· 595 596 message(STATUS "# FEATURE_OPENXR: ${XRT_FEATURE_OPENXR}") 596 597 message(STATUS "# FEATURE_OPENXR_ACTIVE_ACTION_SET_PRIORITY: ${XRT_FEATURE_OPENXR_ACTIVE_ACTION_SET_PRIORITY}") 597 598 message(STATUS "# FEATURE_OPENXR_BODY_TRACKING_FB: ${XRT_FEATURE_OPENXR_BODY_TRACKING_FB}") 599 + message(STATUS "# FEATURE_OPENXR_BODY_TRACKING_FULL_BODY_META: ${XRT_FEATURE_OPENXR_BODY_TRACKING_FULL_BODY_META}") 598 600 message(STATUS "# FEATURE_OPENXR_FACE_TRACKING2_FB: ${XRT_FEATURE_OPENXR_FACE_TRACKING2_FB}") 599 601 message(STATUS "# FEATURE_OPENXR_DEBUG_UTILS: ${XRT_FEATURE_OPENXR_DEBUG_UTILS}") 600 602 message(STATUS "# FEATURE_OPENXR_DISPLAY_REFRESH_RATE: ${XRT_FEATURE_OPENXR_DISPLAY_REFRESH_RATE}")
+1
scripts/generate_oxr_ext_support.py
··· 82 82 ['XR_FB_touch_controller_pro', 'XRT_FEATURE_OPENXR_INTERACTION_TOUCH_PRO'], 83 83 ['XR_FB_touch_controller_proximity', 'XRT_FEATURE_OPENXR_INTERACTION_FB_PROXIMITY'], 84 84 ['XR_HTC_facial_tracking', 'XRT_FEATURE_OPENXR_FACIAL_TRACKING_HTC'], 85 + ['XR_META_body_tracking_full_body', 'XRT_FEATURE_OPENXR_BODY_TRACKING_FULL_BODY_META'], 85 86 ['XR_META_touch_controller_plus', 'XRT_FEATURE_OPENXR_INTERACTION_TOUCH_PLUS'], 86 87 ['XR_ML_ml2_controller_interaction', 'XRT_FEATURE_OPENXR_INTERACTION_ML2'], 87 88 ['XR_EXT_plane_detection', 'XRT_FEATURE_OPENXR_PLANE_DETECTION'],
+1
scripts/mapping.imp
··· 34 34 { symbol: ["XRT_FEATURE_OPENXR", "public", "\"xrt/xrt_config_build.h\"", "public"] }, 35 35 { symbol: ["XRT_FEATURE_OPENXR_ACTIVE_ACTION_SET_PRIORITY", "public", "\"xrt/xrt_config_build.h\"", "public"] }, 36 36 { symbol: ["XRT_FEATURE_OPENXR_BODY_TRACKING_FB", "public", "\"xrt/xrt_config_build.h\"", "public"] }, 37 + { symbol: ["XRT_FEATURE_OPENXR_BODY_TRACKING_FULL_BODY_META", "public", "\"xrt/xrt_config_build.h\"", "public"] }, 37 38 { symbol: ["XRT_FEATURE_OPENXR_DEBUG_UTILS", "public", "\"xrt/xrt_config_build.h\"", "public"] }, 38 39 { symbol: ["XRT_FEATURE_OPENXR_DISPLAY_REFRESH_RATE", "public", "\"xrt/xrt_config_build.h\"", "public"] }, 39 40 { symbol: ["XRT_FEATURE_OPENXR_FACE_TRACKING2_FB", "public", "\"xrt/xrt_config_build.h\"", "public"] },
+1
src/xrt/compositor/multi/comp_multi_system.c
··· 419 419 .htc_facial_tracking_enabled = false, 420 420 .fb_body_tracking_enabled = false, 421 421 .fb_face_tracking2_enabled = false, 422 + .meta_body_tracking_full_body_enabled = false, 422 423 }; 423 424 424 425 switch (msc->sessions.state) {
+1
src/xrt/include/xrt/xrt_compositor.h
··· 972 972 bool htc_facial_tracking_enabled; 973 973 bool fb_body_tracking_enabled; 974 974 bool fb_face_tracking2_enabled; 975 + bool meta_body_tracking_full_body_enabled; 975 976 }; 976 977 977 978 /*!
+1
src/xrt/include/xrt/xrt_config_build.h.cmake_in
··· 33 33 #cmakedefine XRT_FEATURE_OPENXR 34 34 #cmakedefine XRT_FEATURE_OPENXR_ACTIVE_ACTION_SET_PRIORITY 35 35 #cmakedefine XRT_FEATURE_OPENXR_BODY_TRACKING_FB 36 + #cmakedefine XRT_FEATURE_OPENXR_BODY_TRACKING_FULL_BODY_META 36 37 #cmakedefine XRT_FEATURE_OPENXR_DEBUG_UTILS 37 38 #cmakedefine XRT_FEATURE_OPENXR_DISPLAY_REFRESH_RATE 38 39 #cmakedefine XRT_FEATURE_OPENXR_FACE_TRACKING2_FB
+111
src/xrt/include/xrt/xrt_defines.h
··· 1152 1152 \ 1153 1153 _(XRT_INPUT_GENERIC_BODY_TRACKING , XRT_INPUT_NAME(0x0700, BODY_TRACKING)) \ 1154 1154 _(XRT_INPUT_FB_BODY_TRACKING , XRT_INPUT_NAME(0x0701, BODY_TRACKING)) \ 1155 + _(XRT_INPUT_META_FULL_BODY_TRACKING , XRT_INPUT_NAME(0x0702, BODY_TRACKING)) \ 1155 1156 \ 1156 1157 _(XRT_INPUT_PICO_NEO3_X_CLICK , XRT_INPUT_NAME(0x0800, BOOLEAN)) \ 1157 1158 _(XRT_INPUT_PICO_NEO3_X_TOUCH , XRT_INPUT_NAME(0x0801, BOOLEAN)) \ ··· 1737 1738 XRT_BODY_JOINT_NONE_FB = -1, 1738 1739 }; 1739 1740 1741 + // XR_META_body_tracking_full_body 1742 + enum xrt_full_body_joint_meta 1743 + { 1744 + XRT_FULL_BODY_JOINT_ROOT_META = 0, 1745 + XRT_FULL_BODY_JOINT_HIPS_META = 1, 1746 + XRT_FULL_BODY_JOINT_SPINE_LOWER_META = 2, 1747 + XRT_FULL_BODY_JOINT_SPINE_MIDDLE_META = 3, 1748 + XRT_FULL_BODY_JOINT_SPINE_UPPER_META = 4, 1749 + XRT_FULL_BODY_JOINT_CHEST_META = 5, 1750 + XRT_FULL_BODY_JOINT_NECK_META = 6, 1751 + XRT_FULL_BODY_JOINT_HEAD_META = 7, 1752 + XRT_FULL_BODY_JOINT_LEFT_SHOULDER_META = 8, 1753 + XRT_FULL_BODY_JOINT_LEFT_SCAPULA_META = 9, 1754 + XRT_FULL_BODY_JOINT_LEFT_ARM_UPPER_META = 10, 1755 + XRT_FULL_BODY_JOINT_LEFT_ARM_LOWER_META = 11, 1756 + XRT_FULL_BODY_JOINT_LEFT_HAND_WRIST_TWIST_META = 12, 1757 + XRT_FULL_BODY_JOINT_RIGHT_SHOULDER_META = 13, 1758 + XRT_FULL_BODY_JOINT_RIGHT_SCAPULA_META = 14, 1759 + XRT_FULL_BODY_JOINT_RIGHT_ARM_UPPER_META = 15, 1760 + XRT_FULL_BODY_JOINT_RIGHT_ARM_LOWER_META = 16, 1761 + XRT_FULL_BODY_JOINT_RIGHT_HAND_WRIST_TWIST_META = 17, 1762 + XRT_FULL_BODY_JOINT_LEFT_HAND_PALM_META = 18, 1763 + XRT_FULL_BODY_JOINT_LEFT_HAND_WRIST_META = 19, 1764 + XRT_FULL_BODY_JOINT_LEFT_HAND_THUMB_METACARPAL_META = 20, 1765 + XRT_FULL_BODY_JOINT_LEFT_HAND_THUMB_PROXIMAL_META = 21, 1766 + XRT_FULL_BODY_JOINT_LEFT_HAND_THUMB_DISTAL_META = 22, 1767 + XRT_FULL_BODY_JOINT_LEFT_HAND_THUMB_TIP_META = 23, 1768 + XRT_FULL_BODY_JOINT_LEFT_HAND_INDEX_METACARPAL_META = 24, 1769 + XRT_FULL_BODY_JOINT_LEFT_HAND_INDEX_PROXIMAL_META = 25, 1770 + XRT_FULL_BODY_JOINT_LEFT_HAND_INDEX_INTERMEDIATE_META = 26, 1771 + XRT_FULL_BODY_JOINT_LEFT_HAND_INDEX_DISTAL_META = 27, 1772 + XRT_FULL_BODY_JOINT_LEFT_HAND_INDEX_TIP_META = 28, 1773 + XRT_FULL_BODY_JOINT_LEFT_HAND_MIDDLE_METACARPAL_META = 29, 1774 + XRT_FULL_BODY_JOINT_LEFT_HAND_MIDDLE_PROXIMAL_META = 30, 1775 + XRT_FULL_BODY_JOINT_LEFT_HAND_MIDDLE_INTERMEDIATE_META = 31, 1776 + XRT_FULL_BODY_JOINT_LEFT_HAND_MIDDLE_DISTAL_META = 32, 1777 + XRT_FULL_BODY_JOINT_LEFT_HAND_MIDDLE_TIP_META = 33, 1778 + XRT_FULL_BODY_JOINT_LEFT_HAND_RING_METACARPAL_META = 34, 1779 + XRT_FULL_BODY_JOINT_LEFT_HAND_RING_PROXIMAL_META = 35, 1780 + XRT_FULL_BODY_JOINT_LEFT_HAND_RING_INTERMEDIATE_META = 36, 1781 + XRT_FULL_BODY_JOINT_LEFT_HAND_RING_DISTAL_META = 37, 1782 + XRT_FULL_BODY_JOINT_LEFT_HAND_RING_TIP_META = 38, 1783 + XRT_FULL_BODY_JOINT_LEFT_HAND_LITTLE_METACARPAL_META = 39, 1784 + XRT_FULL_BODY_JOINT_LEFT_HAND_LITTLE_PROXIMAL_META = 40, 1785 + XRT_FULL_BODY_JOINT_LEFT_HAND_LITTLE_INTERMEDIATE_META = 41, 1786 + XRT_FULL_BODY_JOINT_LEFT_HAND_LITTLE_DISTAL_META = 42, 1787 + XRT_FULL_BODY_JOINT_LEFT_HAND_LITTLE_TIP_META = 43, 1788 + XRT_FULL_BODY_JOINT_RIGHT_HAND_PALM_META = 44, 1789 + XRT_FULL_BODY_JOINT_RIGHT_HAND_WRIST_META = 45, 1790 + XRT_FULL_BODY_JOINT_RIGHT_HAND_THUMB_METACARPAL_META = 46, 1791 + XRT_FULL_BODY_JOINT_RIGHT_HAND_THUMB_PROXIMAL_META = 47, 1792 + XRT_FULL_BODY_JOINT_RIGHT_HAND_THUMB_DISTAL_META = 48, 1793 + XRT_FULL_BODY_JOINT_RIGHT_HAND_THUMB_TIP_META = 49, 1794 + XRT_FULL_BODY_JOINT_RIGHT_HAND_INDEX_METACARPAL_META = 50, 1795 + XRT_FULL_BODY_JOINT_RIGHT_HAND_INDEX_PROXIMAL_META = 51, 1796 + XRT_FULL_BODY_JOINT_RIGHT_HAND_INDEX_INTERMEDIATE_META = 52, 1797 + XRT_FULL_BODY_JOINT_RIGHT_HAND_INDEX_DISTAL_META = 53, 1798 + XRT_FULL_BODY_JOINT_RIGHT_HAND_INDEX_TIP_META = 54, 1799 + XRT_FULL_BODY_JOINT_RIGHT_HAND_MIDDLE_METACARPAL_META = 55, 1800 + XRT_FULL_BODY_JOINT_RIGHT_HAND_MIDDLE_PROXIMAL_META = 56, 1801 + XRT_FULL_BODY_JOINT_RIGHT_HAND_MIDDLE_INTERMEDIATE_META = 57, 1802 + XRT_FULL_BODY_JOINT_RIGHT_HAND_MIDDLE_DISTAL_META = 58, 1803 + XRT_FULL_BODY_JOINT_RIGHT_HAND_MIDDLE_TIP_META = 59, 1804 + XRT_FULL_BODY_JOINT_RIGHT_HAND_RING_METACARPAL_META = 60, 1805 + XRT_FULL_BODY_JOINT_RIGHT_HAND_RING_PROXIMAL_META = 61, 1806 + XRT_FULL_BODY_JOINT_RIGHT_HAND_RING_INTERMEDIATE_META = 62, 1807 + XRT_FULL_BODY_JOINT_RIGHT_HAND_RING_DISTAL_META = 63, 1808 + XRT_FULL_BODY_JOINT_RIGHT_HAND_RING_TIP_META = 64, 1809 + XRT_FULL_BODY_JOINT_RIGHT_HAND_LITTLE_METACARPAL_META = 65, 1810 + XRT_FULL_BODY_JOINT_RIGHT_HAND_LITTLE_PROXIMAL_META = 66, 1811 + XRT_FULL_BODY_JOINT_RIGHT_HAND_LITTLE_INTERMEDIATE_META = 67, 1812 + XRT_FULL_BODY_JOINT_RIGHT_HAND_LITTLE_DISTAL_META = 68, 1813 + XRT_FULL_BODY_JOINT_RIGHT_HAND_LITTLE_TIP_META = 69, 1814 + XRT_FULL_BODY_JOINT_LEFT_UPPER_LEG_META = 70, 1815 + XRT_FULL_BODY_JOINT_LEFT_LOWER_LEG_META = 71, 1816 + XRT_FULL_BODY_JOINT_LEFT_FOOT_ANKLE_TWIST_META = 72, 1817 + XRT_FULL_BODY_JOINT_LEFT_FOOT_ANKLE_META = 73, 1818 + XRT_FULL_BODY_JOINT_LEFT_FOOT_SUBTALAR_META = 74, 1819 + XRT_FULL_BODY_JOINT_LEFT_FOOT_TRANSVERSE_META = 75, 1820 + XRT_FULL_BODY_JOINT_LEFT_FOOT_BALL_META = 76, 1821 + XRT_FULL_BODY_JOINT_RIGHT_UPPER_LEG_META = 77, 1822 + XRT_FULL_BODY_JOINT_RIGHT_LOWER_LEG_META = 78, 1823 + XRT_FULL_BODY_JOINT_RIGHT_FOOT_ANKLE_TWIST_META = 79, 1824 + XRT_FULL_BODY_JOINT_RIGHT_FOOT_ANKLE_META = 80, 1825 + XRT_FULL_BODY_JOINT_RIGHT_FOOT_SUBTALAR_META = 81, 1826 + XRT_FULL_BODY_JOINT_RIGHT_FOOT_TRANSVERSE_META = 82, 1827 + XRT_FULL_BODY_JOINT_RIGHT_FOOT_BALL_META = 83, 1828 + XRT_FULL_BODY_JOINT_COUNT_META = 84, 1829 + XRT_FULL_BODY_JOINT_NONE_META = 85, 1830 + }; 1831 + 1740 1832 enum xrt_body_joint_set_type_fb 1741 1833 { 1742 1834 XRT_BODY_JOINT_SET_UNKNOWN = 0, 1743 1835 // XR_FB_body_tracking 1744 1836 XRT_BODY_JOINT_SET_DEFAULT_FB, 1837 + // XR_Meta_body_tracking_full_body 1838 + XRT_BODY_JOINT_SET_FULL_BODY_META, 1745 1839 }; 1746 1840 1747 1841 // XR_FB_body_tracking ··· 1759 1853 struct xrt_body_skeleton_joint_fb joints[XRT_BODY_JOINT_COUNT_FB]; 1760 1854 }; 1761 1855 1856 + // XR_Meta_body_tracking_full_body 1857 + struct xrt_full_body_skeleton_meta 1858 + { 1859 + // ordered by xrt_full_body_joint_meta 1860 + struct xrt_body_skeleton_joint_fb joints[XRT_FULL_BODY_JOINT_COUNT_META]; 1861 + }; 1862 + 1762 1863 // structure is a container to represent the body skeleton in T-pose including the joint hierarchy, 1763 1864 // can have info such as skeleton scale and proportions 1764 1865 struct xrt_body_skeleton 1765 1866 { 1766 1867 union { 1767 1868 struct xrt_body_skeleton_fb body_skeleton_fb; 1869 + struct xrt_full_body_skeleton_meta full_body_skeleton_meta; 1768 1870 }; 1769 1871 }; 1770 1872 ··· 1789 1891 struct xrt_body_joint_location_fb joint_locations[XRT_BODY_JOINT_COUNT_FB]; 1790 1892 }; 1791 1893 1894 + // XR_Meta_body_tracking_full_body 1895 + struct xrt_full_body_joint_set_meta 1896 + { 1897 + struct xrt_base_body_joint_set_meta base; 1898 + // ordered by xrt_full_body_joint_meta 1899 + struct xrt_body_joint_location_fb joint_locations[XRT_FULL_BODY_JOINT_COUNT_META]; 1900 + }; 1901 + 1792 1902 struct xrt_body_joint_set 1793 1903 { 1794 1904 union { 1795 1905 struct xrt_base_body_joint_set_meta base_body_joint_set_meta; 1796 1906 struct xrt_body_joint_set_fb body_joint_set_fb; 1907 + struct xrt_full_body_joint_set_meta full_body_joint_set_meta; 1797 1908 }; 1798 1909 // in driver global space, without tracking_origin offset 1799 1910 struct xrt_space_relation body_pose;
+1
src/xrt/include/xrt/xrt_instance.h
··· 77 77 bool htc_facial_tracking_enabled; 78 78 bool fb_body_tracking_enabled; 79 79 bool fb_face_tracking2_enabled; 80 + bool meta_body_tracking_full_body_enabled; 80 81 }; 81 82 82 83 /*!
+4
src/xrt/ipc/server/ipc_server_handler.c
··· 326 326 #ifdef OXR_HAVE_FB_body_tracking 327 327 EXT(fb_body_tracking_enabled); 328 328 #endif 329 + #ifdef OXR_HAVE_META_body_tracking_full_body 330 + EXT(meta_body_tracking_full_body_enabled); 331 + #endif 329 332 #ifdef OXR_HAVE_FB_face_tracking2 330 333 EXT(fb_face_tracking2_enabled); 331 334 #endif ··· 423 426 .htc_facial_tracking_enabled = ics->client_state.info.htc_facial_tracking_enabled, 424 427 .fb_body_tracking_enabled = ics->client_state.info.fb_body_tracking_enabled, 425 428 .fb_face_tracking2_enabled = ics->client_state.info.fb_face_tracking2_enabled, 429 + .meta_body_tracking_full_body_enabled = ics->client_state.info.meta_body_tracking_full_body_enabled, 426 430 }; 427 431 428 432 return xrt_comp_begin_session(ics->xc, &begin_session_info);
+5
src/xrt/state_trackers/oxr/oxr_api_body_tracking.c
··· 32 32 OXR_VERIFY_SESSION_NOT_LOST(&log, sess); 33 33 OXR_VERIFY_ARG_TYPE_AND_NOT_NULL(&log, createInfo, XR_TYPE_BODY_TRACKER_CREATE_INFO_FB); 34 34 OXR_VERIFY_EXTENSION(&log, sess->sys->inst, FB_body_tracking); 35 + #ifdef OXR_HAVE_META_body_tracking_full_body 36 + if (createInfo->bodyJointSet == XR_BODY_JOINT_SET_FULL_BODY_META) { 37 + OXR_VERIFY_EXTENSION(&log, sess->sys->inst, META_body_tracking_full_body); 38 + } 39 + #endif 35 40 36 41 struct oxr_body_tracker_fb *body_tracker_fb = NULL; 37 42 ret = oxr_create_body_tracker_fb(&log, sess, createInfo, &body_tracker_fb);
+39 -10
src/xrt/state_trackers/oxr/oxr_body_tracking.c
··· 23 23 static enum xrt_body_joint_set_type_fb 24 24 oxr_to_xrt_body_joint_set_type_fb(XrBodyJointSetFB joint_set_type) 25 25 { 26 + #ifdef OXR_HAVE_META_body_tracking_full_body 27 + if (joint_set_type == XR_BODY_JOINT_SET_FULL_BODY_META) { 28 + return XRT_BODY_JOINT_SET_FULL_BODY_META; 29 + } 30 + #endif 26 31 if (joint_set_type == XR_BODY_JOINT_SET_DEFAULT_FB) { 27 32 return XRT_BODY_JOINT_SET_DEFAULT_FB; 28 33 } ··· 56 61 "\"bodyJointSet\" set to an unknown body joint set type"); 57 62 } 58 63 64 + #ifdef OXR_HAVE_META_body_tracking_full_body 65 + if (joint_set_type == XRT_BODY_JOINT_SET_FULL_BODY_META) { 66 + if (!oxr_system_get_full_body_tracking_meta_support(log, sess->sys->inst)) { 67 + return oxr_error(log, XR_ERROR_FEATURE_UNSUPPORTED, 68 + "System does not support META full body tracking"); 69 + } 70 + } 71 + #endif 72 + 59 73 struct xrt_device *xdev = GET_XDEV_BY_ROLE(sess->sys, body); 60 74 if (xdev == NULL || !xdev->supported.body_tracking) { 61 75 return oxr_error(log, XR_ERROR_FEATURE_UNSUPPORTED, "No device found for body tracking role"); ··· 84 98 "Device not found or does not support body tracking."); 85 99 } 86 100 87 - if (skeleton->jointCount < XRT_BODY_JOINT_COUNT_FB) { 101 + const bool is_meta_full_body = body_tracker_fb->joint_set_type == XRT_BODY_JOINT_SET_FULL_BODY_META; 102 + const uint32_t body_joint_count = is_meta_full_body ? XRT_FULL_BODY_JOINT_COUNT_META : XRT_BODY_JOINT_COUNT_FB; 103 + 104 + if (skeleton->jointCount < body_joint_count) { 88 105 return oxr_error(log, XR_ERROR_VALIDATION_FAILURE, "joint count is too small"); 89 106 } 90 107 91 108 struct xrt_body_skeleton body_skeleton_result = {0}; 92 - struct xrt_body_skeleton_joint_fb *src_skeleton_joints = body_skeleton_result.body_skeleton_fb.joints; 109 + struct xrt_body_skeleton_joint_fb *src_skeleton_joints = 110 + is_meta_full_body ? body_skeleton_result.full_body_skeleton_meta.joints 111 + : body_skeleton_result.body_skeleton_fb.joints; 112 + 113 + const enum xrt_input_name input_name = 114 + is_meta_full_body ? XRT_INPUT_META_FULL_BODY_TRACKING : XRT_INPUT_FB_BODY_TRACKING; 93 115 94 - if (xrt_device_get_body_skeleton(body_tracker_fb->xdev, XRT_INPUT_FB_BODY_TRACKING, &body_skeleton_result) != 95 - XRT_SUCCESS) { 116 + if (xrt_device_get_body_skeleton(body_tracker_fb->xdev, input_name, &body_skeleton_result) != XRT_SUCCESS) { 96 117 return oxr_error(log, XR_ERROR_RUNTIME_FAILURE, "Failed to get body skeleton"); 97 118 } 98 119 99 - for (size_t joint_index = 0; joint_index < XRT_BODY_JOINT_COUNT_FB; ++joint_index) { 120 + for (size_t joint_index = 0; joint_index < body_joint_count; ++joint_index) { 100 121 const struct xrt_body_skeleton_joint_fb *src_skeleton_joint = &src_skeleton_joints[joint_index]; 101 122 XrBodySkeletonJointFB *dst_skeleton_joint = &skeleton->joints[joint_index]; 102 123 OXR_XRT_POSE_TO_XRPOSEF(src_skeleton_joint->pose, dst_skeleton_joint->pose); 103 124 dst_skeleton_joint->joint = src_skeleton_joint->joint; 104 125 dst_skeleton_joint->parentJoint = src_skeleton_joint->parent_joint; 105 126 } 127 + 106 128 return XR_SUCCESS; 107 129 } 108 130 ··· 118 140 "Device not found or does not support body tracking."); 119 141 } 120 142 121 - if (locations->jointCount < XRT_BODY_JOINT_COUNT_FB) { 143 + const bool is_meta_full_body = body_tracker_fb->joint_set_type == XRT_BODY_JOINT_SET_FULL_BODY_META; 144 + const uint32_t body_joint_count = is_meta_full_body ? XRT_FULL_BODY_JOINT_COUNT_META : XRT_BODY_JOINT_COUNT_FB; 145 + 146 + if (locations->jointCount < body_joint_count) { 122 147 return oxr_error(log, XR_ERROR_VALIDATION_FAILURE, "joint count is too small"); 123 148 } 124 149 ··· 132 157 133 158 struct xrt_body_joint_set body_joint_set_result = {0}; 134 159 const struct xrt_body_joint_location_fb *src_body_joints = 135 - body_joint_set_result.body_joint_set_fb.joint_locations; 160 + is_meta_full_body ? body_joint_set_result.full_body_joint_set_meta.joint_locations 161 + : body_joint_set_result.body_joint_set_fb.joint_locations; 136 162 137 - if (xrt_device_get_body_joints(body_tracker_fb->xdev, XRT_INPUT_FB_BODY_TRACKING, at_timestamp_ns, 138 - &body_joint_set_result) != XRT_SUCCESS) { 163 + const enum xrt_input_name input_name = 164 + is_meta_full_body ? XRT_INPUT_META_FULL_BODY_TRACKING : XRT_INPUT_FB_BODY_TRACKING; 165 + 166 + if (xrt_device_get_body_joints(body_tracker_fb->xdev, input_name, at_timestamp_ns, &body_joint_set_result) != 167 + XRT_SUCCESS) { 139 168 return oxr_error(log, XR_ERROR_RUNTIME_FAILURE, "Failed to get FB body joint set"); 140 169 } 141 170 ··· 164 193 locations->confidence = body_joint_set_fb->confidence; 165 194 locations->skeletonChangedCount = body_joint_set_fb->skeleton_changed_count; 166 195 167 - for (size_t joint_index = 0; joint_index < XRT_BODY_JOINT_COUNT_FB; ++joint_index) { 196 + for (size_t joint_index = 0; joint_index < body_joint_count; ++joint_index) { 168 197 const struct xrt_body_joint_location_fb *src_joint = &src_body_joints[joint_index]; 169 198 XrBodyJointLocationFB *dst_joint = &locations->jointLocations[joint_index]; 170 199
+13
src/xrt/state_trackers/oxr/oxr_extension_support.h
··· 578 578 579 579 580 580 /* 581 + * XR_META_body_tracking_full_body 582 + */ 583 + #if defined(XR_META_body_tracking_full_body) && defined(XRT_FEATURE_OPENXR_BODY_TRACKING_FULL_BODY_META) 584 + #define OXR_HAVE_META_body_tracking_full_body 585 + #define OXR_EXTENSION_SUPPORT_META_body_tracking_full_body(_) \ 586 + _(META_body_tracking_full_body, META_BODY_TRACKING_FULL_BODY) 587 + #else 588 + #define OXR_EXTENSION_SUPPORT_META_body_tracking_full_body(_) 589 + #endif 590 + 591 + 592 + /* 581 593 * XR_META_touch_controller_plus 582 594 */ 583 595 #if defined(XR_META_touch_controller_plus) && defined(XRT_FEATURE_OPENXR_INTERACTION_TOUCH_PLUS) ··· 854 866 OXR_EXTENSION_SUPPORT_FB_touch_controller_pro(_) \ 855 867 OXR_EXTENSION_SUPPORT_FB_touch_controller_proximity(_) \ 856 868 OXR_EXTENSION_SUPPORT_HTC_facial_tracking(_) \ 869 + OXR_EXTENSION_SUPPORT_META_body_tracking_full_body(_) \ 857 870 OXR_EXTENSION_SUPPORT_META_touch_controller_plus(_) \ 858 871 OXR_EXTENSION_SUPPORT_ML_ml2_controller_interaction(_) \ 859 872 OXR_EXTENSION_SUPPORT_EXT_plane_detection(_) \
+3
src/xrt/state_trackers/oxr/oxr_instance.c
··· 315 315 #ifdef OXR_HAVE_FB_face_tracking2 316 316 .fb_face_tracking2_enabled = extensions->FB_face_tracking2, 317 317 #endif 318 + #ifdef OXR_HAVE_META_body_tracking_full_body 319 + .meta_body_tracking_full_body_enabled = extensions->META_body_tracking_full_body, 320 + #endif 318 321 }; 319 322 snprintf(i_info.app_info.application_name, sizeof(i_info.app_info.application_name), "%s", 320 323 createInfo->applicationInfo.applicationName);
+3
src/xrt/state_trackers/oxr/oxr_objects.h
··· 1101 1101 bool 1102 1102 oxr_system_get_body_tracking_fb_support(struct oxr_logger *log, struct oxr_instance *inst); 1103 1103 1104 + bool 1105 + oxr_system_get_full_body_tracking_meta_support(struct oxr_logger *log, struct oxr_instance *inst); 1106 + 1104 1107 /* 1105 1108 * 1106 1109 * oxr_event.cpp
+3
src/xrt/state_trackers/oxr/oxr_session.c
··· 250 250 #ifdef OXR_HAVE_FB_face_tracking2 251 251 .fb_face_tracking2_enabled = extensions->FB_face_tracking2, 252 252 #endif 253 + #ifdef OXR_HAVE_META_body_tracking_full_body 254 + .meta_body_tracking_full_body_enabled = extensions->META_body_tracking_full_body, 255 + #endif 253 256 }; 254 257 255 258 xrt_result_t xret = xrt_comp_begin_session(xc, &begin_session_info);
+20
src/xrt/state_trackers/oxr/oxr_system.c
··· 372 372 return oxr_system_get_body_tracking_support(log, inst, XRT_INPUT_FB_BODY_TRACKING); 373 373 } 374 374 375 + bool 376 + oxr_system_get_full_body_tracking_meta_support(struct oxr_logger *log, struct oxr_instance *inst) 377 + { 378 + return oxr_system_get_body_tracking_support(log, inst, XRT_INPUT_META_FULL_BODY_TRACKING); 379 + } 380 + 375 381 XrResult 376 382 oxr_system_get_properties(struct oxr_logger *log, struct oxr_system *sys, XrSystemProperties *properties) 377 383 { ··· 521 527 (XrPlaneDetectionCapabilityFlagsEXT)xdev->supported.plane_capability_flags; 522 528 } 523 529 #endif // OXR_HAVE_EXT_plane_detection 530 + 531 + #ifdef OXR_HAVE_META_body_tracking_full_body 532 + XrSystemPropertiesBodyTrackingFullBodyMETA *full_body_tracking_meta_props = NULL; 533 + if (sys->inst->extensions.META_body_tracking_full_body) { 534 + full_body_tracking_meta_props = 535 + OXR_GET_OUTPUT_FROM_CHAIN(properties, XR_TYPE_SYSTEM_PROPERTIES_BODY_TRACKING_FULL_BODY_META, 536 + XrSystemPropertiesBodyTrackingFullBodyMETA); 537 + } 538 + 539 + if (full_body_tracking_meta_props) { 540 + full_body_tracking_meta_props->supportsFullBodyTracking = 541 + oxr_system_get_full_body_tracking_meta_support(log, sys->inst); 542 + } 543 + #endif // OXR_HAVE_META_body_tracking_full_body 524 544 525 545 return XR_SUCCESS; 526 546 }