mirror of
https://gitlab.freedesktop.org/monado/monado.git
synced 2024-12-28 02:26:16 +00:00
d/remote: Update protocol to allow per view data
This commit is contained in:
parent
a8dc902468
commit
89aee1892b
|
@ -35,6 +35,15 @@ r_hmd(struct xrt_device *xdev)
|
|||
return (struct r_hmd *)xdev;
|
||||
}
|
||||
|
||||
static inline void
|
||||
copy_head_center_to_relation(struct r_hmd *rh, struct xrt_space_relation *out_relation)
|
||||
{
|
||||
out_relation->pose = rh->r->latest.head.center;
|
||||
out_relation->relation_flags = (enum xrt_space_relation_flags)(
|
||||
XRT_SPACE_RELATION_ORIENTATION_VALID_BIT | XRT_SPACE_RELATION_POSITION_VALID_BIT |
|
||||
XRT_SPACE_RELATION_ORIENTATION_TRACKED_BIT | XRT_SPACE_RELATION_POSITION_TRACKED_BIT);
|
||||
}
|
||||
|
||||
static void
|
||||
r_hmd_destroy(struct xrt_device *xdev)
|
||||
{
|
||||
|
@ -67,10 +76,7 @@ r_hmd_get_tracked_pose(struct xrt_device *xdev,
|
|||
return;
|
||||
}
|
||||
|
||||
out_relation->pose = rh->r->latest.hmd.pose;
|
||||
out_relation->relation_flags = (enum xrt_space_relation_flags)(
|
||||
XRT_SPACE_RELATION_ORIENTATION_VALID_BIT | XRT_SPACE_RELATION_POSITION_VALID_BIT |
|
||||
XRT_SPACE_RELATION_ORIENTATION_TRACKED_BIT | XRT_SPACE_RELATION_POSITION_TRACKED_BIT);
|
||||
copy_head_center_to_relation(rh, out_relation);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -93,8 +99,33 @@ r_hmd_get_view_poses(struct xrt_device *xdev,
|
|||
struct xrt_fov *out_fovs,
|
||||
struct xrt_pose *out_poses)
|
||||
{
|
||||
u_device_get_view_poses(xdev, default_eye_relation, at_timestamp_ns, view_count, out_head_relation, out_fovs,
|
||||
out_poses);
|
||||
struct r_hmd *rh = r_hmd(xdev);
|
||||
|
||||
if (!rh->r->latest.head.per_view_data_valid) {
|
||||
u_device_get_view_poses( //
|
||||
xdev, //
|
||||
default_eye_relation, //
|
||||
at_timestamp_ns, //
|
||||
view_count, //
|
||||
out_head_relation, //
|
||||
out_fovs, //
|
||||
out_poses); //
|
||||
|
||||
// Done now
|
||||
return;
|
||||
}
|
||||
|
||||
if (view_count > ARRAY_SIZE(rh->r->latest.head.views)) {
|
||||
U_LOG_E("Asking for too many views!");
|
||||
return;
|
||||
}
|
||||
|
||||
copy_head_center_to_relation(rh, out_head_relation);
|
||||
|
||||
for (uint32_t i = 0; i < view_count; i++) {
|
||||
out_poses[i] = rh->r->latest.head.views[i].pose;
|
||||
out_fovs[i] = rh->r->latest.head.views[i].fov;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -286,9 +286,9 @@ r_create_devices(uint16_t port, struct xrt_system_devices **out_xsysd)
|
|||
|
||||
r->base.destroy = r_hub_system_devices_destroy;
|
||||
r->origin.type = XRT_TRACKING_TYPE_RGB;
|
||||
r->origin.offset.orientation.w = 1.0f; // All other members are zero.
|
||||
r->reset.hmd.pose.position.y = 1.6f;
|
||||
r->reset.hmd.pose.orientation.w = 1.0f;
|
||||
r->origin.offset = (struct xrt_pose)XRT_POSE_IDENTITY;
|
||||
r->reset.head.center = (struct xrt_pose)XRT_POSE_IDENTITY;
|
||||
r->reset.head.center.position.y = 1.6f;
|
||||
r->reset.left.active = true;
|
||||
r->reset.left.hand_tracking_active = true;
|
||||
r->reset.left.pose.position.x = -0.2f;
|
||||
|
@ -353,7 +353,7 @@ r_create_devices(uint16_t port, struct xrt_system_devices **out_xsysd)
|
|||
|
||||
u_var_add_root(r, "Remote Hub", true);
|
||||
// u_var_add_gui_header(r, &r->gui.hmd, "MHD");
|
||||
u_var_add_pose(r, &r->latest.hmd.pose, "hmd.pose");
|
||||
u_var_add_pose(r, &r->latest.head.center, "head.center");
|
||||
// u_var_add_gui_header(r, &r->gui.left, "Left");
|
||||
u_var_add_bool(r, &r->latest.left.active, "left.active");
|
||||
u_var_add_pose(r, &r->latest.left.pose, "left.pose");
|
||||
|
|
|
@ -38,7 +38,7 @@ struct xrt_system_devices;
|
|||
*
|
||||
* @ingroup drv_remote
|
||||
*/
|
||||
#define R_HEADER_VALUE (*(uint64_t *)"mndrmt2\0")
|
||||
#define R_HEADER_VALUE (*(uint64_t *)"mndrmt3\0")
|
||||
|
||||
/*!
|
||||
* Data per controller.
|
||||
|
@ -78,6 +78,30 @@ struct r_remote_controller_data
|
|||
// active(2) + bools(11) + pad(3) = 16
|
||||
};
|
||||
|
||||
struct r_head_data
|
||||
{
|
||||
struct
|
||||
{
|
||||
//! The field of view values of this view.
|
||||
struct xrt_fov fov;
|
||||
|
||||
//! The pose of this view relative to @ref r_head_data::center.
|
||||
struct xrt_pose pose;
|
||||
|
||||
//! Padded to fov(16) + pose(16 + 12) + 4 = 48
|
||||
uint32_t _pad;
|
||||
} views[2];
|
||||
|
||||
//! The center of the head, in OpenXR terms the view space.
|
||||
struct xrt_pose center;
|
||||
|
||||
//! Is the per view data valid and should be used?
|
||||
bool per_view_data_valid;
|
||||
|
||||
//! pose(16 + 12) bool(1) + pad(3) = 32.
|
||||
bool _pad0, _pad1, _pad2;
|
||||
};
|
||||
|
||||
/*!
|
||||
* Remote data sent from the debugger to the hub.
|
||||
*
|
||||
|
@ -87,10 +111,7 @@ struct r_remote_data
|
|||
{
|
||||
uint64_t header;
|
||||
|
||||
struct
|
||||
{
|
||||
struct xrt_pose pose;
|
||||
} hmd;
|
||||
struct r_head_data head;
|
||||
|
||||
struct r_remote_controller_data left, right;
|
||||
};
|
||||
|
|
|
@ -298,10 +298,8 @@ render_cheat_menu(struct gui_remote *gr, struct gui_program *p)
|
|||
|
||||
#define POSE(prefix) \
|
||||
do { \
|
||||
handle_draggable_vec3_f32(#prefix ".pose.position", &d->prefix.pose.position, \
|
||||
&r->prefix.pose.position); \
|
||||
handle_draggable_quat(#prefix ".pose.orientation", &d->prefix.pose.orientation, \
|
||||
&r->prefix.pose.orientation); \
|
||||
handle_draggable_vec3_f32(#prefix ".pose.position", &d->prefix.position, &r->prefix.position); \
|
||||
handle_draggable_quat(#prefix ".pose.orientation", &d->prefix.orientation, &r->prefix.orientation); \
|
||||
} while (false)
|
||||
|
||||
#define LIN_ANG(prefix) \
|
||||
|
@ -334,19 +332,19 @@ on_connected(struct gui_remote *gr, struct gui_program *p)
|
|||
const struct r_remote_data *r = &gr->reset;
|
||||
struct r_remote_data *d = &gr->data;
|
||||
|
||||
igPushIDPtr(&d->hmd); // Make all IDs unique.
|
||||
POSE(hmd);
|
||||
igPushIDPtr(&d->head); // Make all IDs unique.
|
||||
POSE(head.center);
|
||||
igPopID(); // Pop unique IDs
|
||||
|
||||
igPushIDPtr(&d->left); // Make all IDs unique.
|
||||
POSE(left);
|
||||
POSE(left.pose);
|
||||
LIN_ANG(left);
|
||||
BUTTONS(left);
|
||||
HAND(left);
|
||||
igPopID(); // Pop unique IDs
|
||||
|
||||
igPushIDPtr(&d->right); // Make all IDs unique.
|
||||
POSE(right);
|
||||
POSE(right.pose);
|
||||
LIN_ANG(right);
|
||||
BUTTONS(right);
|
||||
HAND(right);
|
||||
|
|
Loading…
Reference in a new issue