mirror of
https://gitlab.freedesktop.org/monado/monado.git
synced 2025-01-22 14:41:47 +00:00
d/qwerty: Implement still HMD creation
This commit is contained in:
parent
0340ae3cc8
commit
e6db1fae74
|
@ -7,6 +7,117 @@
|
||||||
* @ingroup drv_qwerty
|
* @ingroup drv_qwerty
|
||||||
*/
|
*/
|
||||||
|
|
||||||
typedef int _silence_compiler_about_empty_translation_unit;
|
#include "qwerty_device.h"
|
||||||
|
|
||||||
// @todo
|
#include "util/u_device.h"
|
||||||
|
|
||||||
|
#include "util/u_distortion_mesh.h"
|
||||||
|
|
||||||
|
#include "math/m_api.h"
|
||||||
|
#include "math/m_mathinclude.h"
|
||||||
|
|
||||||
|
#include "xrt/xrt_device.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
struct qwerty_device *
|
||||||
|
qwerty_device(struct xrt_device *xd)
|
||||||
|
{
|
||||||
|
struct qwerty_device *qd = (struct qwerty_device *)xd;
|
||||||
|
assert(qd);
|
||||||
|
return qd;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
qwerty_update_inputs(struct xrt_device *xd)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
qwerty_get_tracked_pose(struct xrt_device *xd,
|
||||||
|
enum xrt_input_name name,
|
||||||
|
uint64_t at_timestamp_ns,
|
||||||
|
struct xrt_space_relation *out_relation)
|
||||||
|
{
|
||||||
|
if (name != XRT_INPUT_GENERIC_HEAD_POSE) {
|
||||||
|
printf("Unexpected input name = 0x%04X\n", name >> 8); // @todo: use u_logging.h
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct xrt_pose identity = {{0.0f, 0.0f, 0.0f, 1.0f}, {0.0f, 0.0f, 0.0f}};
|
||||||
|
out_relation->pose = identity;
|
||||||
|
out_relation->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
|
||||||
|
qwerty_get_view_pose(struct xrt_device *xd,
|
||||||
|
struct xrt_vec3 *eye_relation,
|
||||||
|
uint32_t view_index,
|
||||||
|
struct xrt_pose *out_pose)
|
||||||
|
{
|
||||||
|
// Adapted from dummy_hmd_get_view_pose()
|
||||||
|
struct xrt_pose pose = {{0.0f, 0.0f, 0.0f, 1.0f}, {0.0f, 0.0f, 0.0f}};
|
||||||
|
bool is_left = view_index == 0;
|
||||||
|
float adjust = is_left ? -0.5f : 0.5f;
|
||||||
|
struct xrt_vec3 eye_offset = *eye_relation;
|
||||||
|
math_vec3_scalar_mul(adjust, &eye_offset);
|
||||||
|
math_vec3_accum(&eye_offset, &pose.position);
|
||||||
|
*out_pose = pose;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
qwerty_destroy(struct xrt_device *xd)
|
||||||
|
{
|
||||||
|
u_device_free(xd);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct qwerty_device *
|
||||||
|
qwerty_hmd_create(void)
|
||||||
|
{
|
||||||
|
enum u_device_alloc_flags flags = U_DEVICE_ALLOC_HMD | U_DEVICE_ALLOC_TRACKING_NONE;
|
||||||
|
size_t num_inputs = 1, num_outputs = 0;
|
||||||
|
struct qwerty_device *qd = U_DEVICE_ALLOCATE(struct qwerty_device, flags, num_inputs, num_outputs);
|
||||||
|
assert(qd);
|
||||||
|
|
||||||
|
struct xrt_device *xd = &qd->base;
|
||||||
|
xd->name = XRT_DEVICE_GENERIC_HMD;
|
||||||
|
xd->device_type = XRT_DEVICE_TYPE_HMD;
|
||||||
|
|
||||||
|
snprintf(xd->str, XRT_DEVICE_NAME_LEN, QWERTY_HMD_STR);
|
||||||
|
snprintf(xd->serial, XRT_DEVICE_NAME_LEN, QWERTY_HMD_STR);
|
||||||
|
|
||||||
|
// Fill in xd->hmd
|
||||||
|
struct u_device_simple_info info;
|
||||||
|
info.display.w_pixels = 1280;
|
||||||
|
info.display.h_pixels = 720;
|
||||||
|
info.display.w_meters = 0.13f;
|
||||||
|
info.display.h_meters = 0.07f;
|
||||||
|
info.lens_horizontal_separation_meters = 0.13f / 2.0f;
|
||||||
|
info.lens_vertical_position_meters = 0.07f / 2.0f;
|
||||||
|
info.views[0].fov = 85.0f * (M_PI / 180.0f);
|
||||||
|
info.views[1].fov = 85.0f * (M_PI / 180.0f);
|
||||||
|
|
||||||
|
if (!u_device_setup_split_side_by_side(xd, &info)) {
|
||||||
|
printf("Failed to setup HMD properties\n"); // @todo: Use u_logging.h
|
||||||
|
qwerty_destroy(xd);
|
||||||
|
assert(false);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
xd->tracking_origin->type = XRT_TRACKING_TYPE_OTHER;
|
||||||
|
snprintf(xd->tracking_origin->name, XRT_TRACKING_NAME_LEN, QWERTY_HMD_TRACKER_STR);
|
||||||
|
|
||||||
|
xd->inputs[0].name = XRT_INPUT_GENERIC_HEAD_POSE;
|
||||||
|
|
||||||
|
xd->update_inputs = qwerty_update_inputs;
|
||||||
|
xd->get_tracked_pose = qwerty_get_tracked_pose;
|
||||||
|
xd->get_view_pose = qwerty_get_view_pose;
|
||||||
|
xd->destroy = qwerty_destroy;
|
||||||
|
u_distortion_mesh_set_none(xd); // Fill in xd->compute_distortion()
|
||||||
|
|
||||||
|
return qd;
|
||||||
|
}
|
||||||
|
|
|
@ -8,6 +8,11 @@
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "xrt/xrt_device.h"
|
||||||
|
|
||||||
|
#define QWERTY_HMD_STR "Qwerty HMD"
|
||||||
|
#define QWERTY_HMD_TRACKER_STR QWERTY_HMD_STR " Tracker"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
@ -17,7 +22,19 @@ extern "C" {
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// @todo
|
//! @implements xrt_device
|
||||||
|
struct qwerty_device
|
||||||
|
{
|
||||||
|
struct xrt_device base;
|
||||||
|
};
|
||||||
|
|
||||||
|
//! Cast to qwerty_device. Ensures returning a valid device or crashing.
|
||||||
|
struct qwerty_device *
|
||||||
|
qwerty_device(struct xrt_device *xd);
|
||||||
|
|
||||||
|
//! Create qwerty_hmd. Crash on failure.
|
||||||
|
struct qwerty_device *
|
||||||
|
qwerty_hmd_create(void);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @}
|
* @}
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
* @ingroup drv_qwerty
|
* @ingroup drv_qwerty
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "qwerty_device.h"
|
||||||
#include "util/u_misc.h"
|
#include "util/u_misc.h"
|
||||||
#include "xrt/xrt_prober.h"
|
#include "xrt/xrt_prober.h"
|
||||||
|
|
||||||
|
@ -35,8 +36,16 @@ qwerty_prober_autoprobe(struct xrt_auto_prober *xap,
|
||||||
struct xrt_prober *xp,
|
struct xrt_prober *xp,
|
||||||
struct xrt_device **out_xdevs)
|
struct xrt_device **out_xdevs)
|
||||||
{
|
{
|
||||||
// @todo
|
bool hmd_wanted = !no_hmds; // Hopefully easier to reason about
|
||||||
return 0;
|
|
||||||
|
struct qwerty_device *qhmd = qwerty_hmd_create();
|
||||||
|
|
||||||
|
if (hmd_wanted) {
|
||||||
|
out_xdevs[0] = &qhmd->base;
|
||||||
|
}
|
||||||
|
|
||||||
|
int num_qwerty_devices = hmd_wanted;
|
||||||
|
return num_qwerty_devices;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct xrt_auto_prober *
|
struct xrt_auto_prober *
|
||||||
|
|
|
@ -57,6 +57,17 @@ enum xrt_tracking_type
|
||||||
|
|
||||||
// The device(s) are tracked by external SLAM
|
// The device(s) are tracked by external SLAM
|
||||||
XRT_TRACKING_TYPE_EXTERNAL_SLAM,
|
XRT_TRACKING_TYPE_EXTERNAL_SLAM,
|
||||||
|
|
||||||
|
/* @remove: on next commit
|
||||||
|
Is it a good idea to add a new tracking type instead of using _NONE? Two reasons:
|
||||||
|
1. _NONE makes u_device_setup_tracking_origins modify tracking origins in
|
||||||
|
the app but this is not yet synced with the service
|
||||||
|
2. _NONE is not quite exact, for what I understand qwerty devices *are*
|
||||||
|
being tracked. Though I might be missunderstanding what tracking is.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// The device(s) are tracked by other methods.
|
||||||
|
XRT_TRACKING_TYPE_OTHER,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|
Loading…
Reference in a new issue