From f7a8e8810bd52f034a6d41c2c5daea471b961177 Mon Sep 17 00:00:00 2001 From: Christoph Haag Date: Tue, 24 Nov 2020 03:26:27 +0100 Subject: [PATCH] xrt: Split hand tracking input name into left/right oxr_hand_tracker now stores which xdev and input name it tracks. --- src/xrt/drivers/remote/r_device.c | 10 +++++-- src/xrt/drivers/survive/survive_driver.c | 15 ++++++----- src/xrt/drivers/vive/vive_controller.c | 9 ++++++- src/xrt/include/xrt/xrt_defines.h | 3 ++- src/xrt/state_trackers/oxr/oxr_api_session.c | 28 ++++++++++++++++++++ src/xrt/state_trackers/oxr/oxr_objects.h | 6 +++++ src/xrt/state_trackers/oxr/oxr_session.c | 26 ++---------------- 7 files changed, 63 insertions(+), 34 deletions(-) diff --git a/src/xrt/drivers/remote/r_device.c b/src/xrt/drivers/remote/r_device.c index dcb4071e0..da0707bae 100644 --- a/src/xrt/drivers/remote/r_device.c +++ b/src/xrt/drivers/remote/r_device.c @@ -127,7 +127,8 @@ r_device_get_hand_tracking(struct xrt_device *xdev, struct r_hub *r = rd->r; - if (name != XRT_INPUT_GENERIC_HAND_TRACKING_DEFAULT_SET) { + if (name != XRT_INPUT_GENERIC_HAND_TRACKING_LEFT && + name != XRT_INPUT_GENERIC_HAND_TRACKING_RIGHT) { U_LOG_E("Unknown input name for hand tracker"); return; } @@ -186,7 +187,7 @@ r_device_create(struct r_hub *r, bool is_left) { // Allocate. const enum u_device_alloc_flags flags = 0; - const uint32_t num_inputs = 4; + const uint32_t num_inputs = 5; const uint32_t num_outputs = 1; struct r_device *rd = U_DEVICE_ALLOCATE( // struct r_device, flags, num_inputs, num_outputs); @@ -215,6 +216,11 @@ r_device_create(struct r_hub *r, bool is_left) rd->base.inputs[1].name = XRT_INPUT_SIMPLE_MENU_CLICK; rd->base.inputs[2].name = XRT_INPUT_SIMPLE_GRIP_POSE; rd->base.inputs[3].name = XRT_INPUT_SIMPLE_AIM_POSE; + if (is_left) { + rd->base.inputs[4].name = XRT_INPUT_GENERIC_HAND_TRACKING_LEFT; + } else { + rd->base.inputs[4].name = XRT_INPUT_GENERIC_HAND_TRACKING_RIGHT; + } rd->base.outputs[0].name = XRT_OUTPUT_NAME_SIMPLE_VIBRATION; if (is_left) { diff --git a/src/xrt/drivers/survive/survive_driver.c b/src/xrt/drivers/survive/survive_driver.c index 5f1140d49..18ca41e2d 100644 --- a/src/xrt/drivers/survive/survive_driver.c +++ b/src/xrt/drivers/survive/survive_driver.c @@ -75,10 +75,8 @@ struct survive_system; enum input_index { - GENERIC_HEAD_POSE = 0, - // common inputs - VIVE_CONTROLLER_AIM_POSE, + VIVE_CONTROLLER_AIM_POSE = 0, VIVE_CONTROLLER_GRIP_POSE, VIVE_CONTROLLER_SYSTEM_CLICK, VIVE_CONTROLLER_TRIGGER_CLICK, @@ -105,8 +103,7 @@ enum input_index VIVE_CONTROLLER_TRIGGER_TOUCH, VIVE_CONTROLLER_TRACKPAD_FORCE, - VIVE_CONTROLLER_FINGERTRACKING, - VIVE_CONTROLLER_HAND_BASE, + VIVE_CONTROLLER_HAND_TRACKING, VIVE_CONTROLLER_MAX_INDEX, }; @@ -458,7 +455,8 @@ survive_controller_get_hand_tracking(struct xrt_device *xdev, { struct survive_device *survive = (struct survive_device *)xdev; - if (name != XRT_INPUT_GENERIC_HAND_TRACKING_DEFAULT_SET) { + if (name != XRT_INPUT_GENERIC_HAND_TRACKING_LEFT && + name != XRT_INPUT_GENERIC_HAND_TRACKING_RIGHT) { SURVIVE_ERROR(survive, "unknown input name for hand tracker"); return; } @@ -1297,6 +1295,7 @@ _create_controller_device(struct survive_system *sys, { enum u_device_alloc_flags flags = 0; + int inputs = VIVE_CONTROLLER_MAX_INDEX; int outputs = 1; struct survive_device *survive = @@ -1375,10 +1374,14 @@ _create_controller_device(struct survive_system *sys, if (variant == VIVE_VARIANT_VALVE_INDEX_LEFT_CONTROLLER) { survive->base.device_type = XRT_DEVICE_TYPE_LEFT_HAND_CONTROLLER; + survive->base.inputs[VIVE_CONTROLLER_HAND_TRACKING] + .name = XRT_INPUT_GENERIC_HAND_TRACKING_LEFT; } else if (variant == VIVE_VARIANT_VALVE_INDEX_RIGHT_CONTROLLER) { survive->base.device_type = XRT_DEVICE_TYPE_RIGHT_HAND_CONTROLLER; + survive->base.inputs[VIVE_CONTROLLER_HAND_TRACKING] + .name = XRT_INPUT_GENERIC_HAND_TRACKING_RIGHT; } else { survive->base.device_type = XRT_DEVICE_TYPE_ANY_HAND_CONTROLLER; diff --git a/src/xrt/drivers/vive/vive_controller.c b/src/xrt/drivers/vive/vive_controller.c index d9486bd89..eeb356622 100644 --- a/src/xrt/drivers/vive/vive_controller.c +++ b/src/xrt/drivers/vive/vive_controller.c @@ -79,6 +79,8 @@ enum vive_controller_input_index VIVE_CONTROLLER_INDEX_TRIGGER_TOUCH, VIVE_CONTROLLER_INDEX_TRACKPAD_FORCE, + VIVE_CONTROLLER_HAND_TRACKING, + VIVE_CONTROLLER_MAX_INDEX, }; @@ -328,7 +330,8 @@ vive_controller_get_hand_tracking(struct xrt_device *xdev, { struct vive_controller_device *d = vive_controller_device(xdev); - if (name != XRT_INPUT_GENERIC_HAND_TRACKING_DEFAULT_SET) { + if (name != XRT_INPUT_GENERIC_HAND_TRACKING_LEFT && + name != XRT_INPUT_GENERIC_HAND_TRACKING_RIGHT) { VIVE_ERROR(d, "unknown input name for hand tracker"); return; } @@ -1270,9 +1273,13 @@ vive_controller_create(struct os_hid_device *controller_hid, if (d->variant == CONTROLLER_INDEX_LEFT) { d->base.device_type = XRT_DEVICE_TYPE_LEFT_HAND_CONTROLLER; + d->base.inputs[VIVE_CONTROLLER_HAND_TRACKING].name = + XRT_INPUT_GENERIC_HAND_TRACKING_LEFT; } else if (d->variant == CONTROLLER_INDEX_RIGHT) { d->base.device_type = XRT_DEVICE_TYPE_RIGHT_HAND_CONTROLLER; + d->base.inputs[VIVE_CONTROLLER_HAND_TRACKING].name = + XRT_INPUT_GENERIC_HAND_TRACKING_RIGHT; } } else if (d->variant == CONTROLLER_TRACKER_GEN1) { d->base.name = XRT_DEVICE_VIVE_TRACKER_GEN1; diff --git a/src/xrt/include/xrt/xrt_defines.h b/src/xrt/include/xrt/xrt_defines.h index c9a75ee08..4a22b3a23 100644 --- a/src/xrt/include/xrt/xrt_defines.h +++ b/src/xrt/include/xrt/xrt_defines.h @@ -496,7 +496,8 @@ enum xrt_input_name // clang-format off XRT_INPUT_GENERIC_HEAD_POSE = XRT_INPUT_NAME(0x0000, POSE), XRT_INPUT_GENERIC_HEAD_DETECT = XRT_INPUT_NAME(0x0001, BOOLEAN), - XRT_INPUT_GENERIC_HAND_TRACKING_DEFAULT_SET = XRT_INPUT_NAME(0x0002, HAND_TRACKING), + XRT_INPUT_GENERIC_HAND_TRACKING_LEFT = XRT_INPUT_NAME(0x0002, HAND_TRACKING), + XRT_INPUT_GENERIC_HAND_TRACKING_RIGHT = XRT_INPUT_NAME(0x0003, HAND_TRACKING), XRT_INPUT_SIMPLE_SELECT_CLICK = XRT_INPUT_NAME(0x0010, BOOLEAN), XRT_INPUT_SIMPLE_MENU_CLICK = XRT_INPUT_NAME(0x0011, BOOLEAN), diff --git a/src/xrt/state_trackers/oxr/oxr_api_session.c b/src/xrt/state_trackers/oxr/oxr_api_session.c index 2ce1fe86d..4247e78c8 100644 --- a/src/xrt/state_trackers/oxr/oxr_api_session.c +++ b/src/xrt/state_trackers/oxr/oxr_api_session.c @@ -293,6 +293,34 @@ oxr_hand_tracker_create(struct oxr_logger *log, hand_tracker->hand = createInfo->hand; hand_tracker->hand_joint_set = createInfo->handJointSet; + //! @todo: Implement choice when more than one device has hand tracking + for (uint32_t i = 0; i < sess->sys->num_xdevs; i++) { + struct xrt_device *xdev = sess->sys->xdevs[i]; + + if (!xdev->hand_tracking_supported) { + continue; + } + + for (uint32_t j = 0; j < xdev->num_inputs; j++) { + struct xrt_input *input = &xdev->inputs[j]; + + if ((input->name == + XRT_INPUT_GENERIC_HAND_TRACKING_LEFT && + createInfo->hand == XR_HAND_LEFT_EXT) || + (input->name == + XRT_INPUT_GENERIC_HAND_TRACKING_RIGHT && + createInfo->hand == XR_HAND_RIGHT_EXT)) { + hand_tracker->xdev = xdev; + hand_tracker->input_name = input->name; + break; + } + } + + if (hand_tracker->xdev != NULL) { + break; + } + } + *out_hand_tracker = hand_tracker; return XR_SUCCESS; diff --git a/src/xrt/state_trackers/oxr/oxr_objects.h b/src/xrt/state_trackers/oxr/oxr_objects.h index 9c67921f0..06382939c 100644 --- a/src/xrt/state_trackers/oxr/oxr_objects.h +++ b/src/xrt/state_trackers/oxr/oxr_objects.h @@ -1964,6 +1964,12 @@ struct oxr_hand_tracker //! Owner of this hand tracker. struct oxr_session *sess; + //! xrt_device backing this hand tracker + struct xrt_device *xdev; + + //! the input name associated with this hand tracker + enum xrt_input_name input_name; + XrHandEXT hand; XrHandJointSetEXT hand_joint_set; }; diff --git a/src/xrt/state_trackers/oxr/oxr_session.c b/src/xrt/state_trackers/oxr/oxr_session.c index fd4c4e3ee..c17a0838d 100644 --- a/src/xrt/state_trackers/oxr/oxr_session.c +++ b/src/xrt/state_trackers/oxr/oxr_session.c @@ -2334,22 +2334,8 @@ oxr_session_hand_joints(struct oxr_logger *log, locations, XR_TYPE_HAND_JOINT_VELOCITIES_EXT, XrHandJointVelocitiesEXT); - struct xrt_device *xdev = NULL; - if (hand_tracker->hand == XR_HAND_LEFT_EXT) { - xdev = GET_XDEV_BY_ROLE(sess->sys, left); - } else if (hand_tracker->hand == XR_HAND_RIGHT_EXT) { - xdev = GET_XDEV_BY_ROLE(sess->sys, right); - } else { - return oxr_error(log, XR_ERROR_VALIDATION_FAILURE, - "invalid hand value"); - } - - if (xdev == NULL) { - //! @todo spec is not clear on whether we could have failed - //! creating a hand tracker if we don't have a device for it - locations->isActive = false; - return XR_SUCCESS; - } + struct xrt_device *xdev = hand_tracker->xdev; + enum xrt_input_name name = hand_tracker->input_name; struct xrt_pose *tracking_origin_offset = &xdev->tracking_origin->offset; @@ -2357,14 +2343,6 @@ oxr_session_hand_joints(struct oxr_logger *log, XrTime at_time = locateInfo->time; struct xrt_hand_joint_set value; - enum xrt_input_name name; - if (hand_tracker->hand_joint_set == XR_HAND_JOINT_SET_DEFAULT_EXT) { - name = XRT_INPUT_GENERIC_HAND_TRACKING_DEFAULT_SET; - } else { - return oxr_error(log, XR_ERROR_VALIDATION_FAILURE, - "invalid hand joint set"); - } - oxr_xdev_get_hand_tracking_at(log, sess->sys->inst, xdev, name, at_time, &value);