111template <
class T, DeviceFunctions functions>
class DeviceBase
119 static_assert(std::is_standard_layout_v<DeviceBase>,
120 "glue base must be standard layout for pointer recovery");
121 static_assert(is_non_virtual_base_v<DeviceBase, T>,
122 "glue base must be a non-virtual base of T for pointer recovery");
132 if constexpr (functions.hmd) {
133 xdev.get_view_poses = getViewPosesWrap;
134 xdev.is_form_factor_available = isFormFactorAvailableWrap;
137 if constexpr (functions.distortion) {
138 xdev.compute_distortion = computeDistortionWrap;
141 if constexpr (functions.visibility_mask) {
142 xdev.get_visibility_mask = getVisibilityMaskWrap;
145 if constexpr (functions.update_inputs) {
146 xdev.update_inputs = updateInputsWrap;
149 if constexpr (functions.output) {
150 xdev.set_output = setOutputWrap;
153 if constexpr (functions.output_limits) {
154 xdev.get_output_limits = getOutputLimitsWrap;
157 if constexpr (functions.hand_tracking) {
158 xdev.get_hand_tracking = getHandTrackingWrap;
161 if constexpr (functions.face_tracking) {
162 xdev.get_face_tracking = getFaceTrackingWrap;
165 if constexpr (functions.face_calibration_android) {
166 xdev.get_face_calibration_state_android = getFaceCalibrationStateAndroidWrap;
169 if constexpr (functions.body_tracking) {
170 xdev.get_body_skeleton = getBodySkeletonWrap;
171 xdev.get_body_joints = getBodyJointsWrap;
172 xdev.reset_body_tracking_calibration_meta = resetBodyTrackingCalibrationMetaWrap;
173 xdev.set_body_tracking_calibration_override_meta = setBodyTrackingCalibrationOverrideMetaWrap;
176 if constexpr (functions.plane_detection) {
177 xdev.begin_plane_detection_ext = beginPlaneDetectionExtWrap;
178 xdev.destroy_plane_detection_ext = destroyPlaneDetectionExtWrap;
179 xdev.get_plane_detection_state_ext = getPlaneDetectionStateExtWrap;
180 xdev.get_plane_detections_ext = getPlaneDetectionsExtWrap;
183 if constexpr (functions.presence) {
184 xdev.get_presence = getPresenceWrap;
187 if constexpr (functions.reference_space) {
188 xdev.ref_space_usage = refSpaceUsageWrap;
191 if constexpr (functions.battery) {
192 xdev.get_battery_status = getBatteryStatusWrap;
195 if constexpr (functions.brightness) {
196 xdev.get_brightness = getBrightnessWrap;
197 xdev.set_brightness = setBrightnessWrap;
200 if constexpr (functions.compositor_info) {
201 xdev.get_compositor_info = getCompositorInfoWrap;
204 if constexpr (functions.features) {
205 xdev.begin_feature = beginFeatureWrap;
206 xdev.end_feature = endFeatureWrap;
216 derived() const noexcept
218 return static_cast<const T &
>(*this);
224 return static_cast<T &
>(*this);
231 return &(
reinterpret_cast<const DeviceBase *
>(xdev)->derived());
238 return &(
reinterpret_cast<DeviceBase *
>(xdev)->derived());
267#define GET(xdev) (fromXDev(xdev)->derived())
270 updateInputsWrap(
struct xrt_device *xdev)
noexcept
272 return GET(xdev).updateInputs();
279 int64_t at_timestamp_ns,
282 return GET(xdev).getTrackedPose(name, at_timestamp_ns, out_relation);
289 int64_t desired_timestamp_ns,
291 int64_t *out_timestamp_ns)
noexcept
293 return GET(xdev).getHandTracking(name, desired_timestamp_ns, out_value, out_timestamp_ns);
300 int64_t at_timestamp_ns,
303 return GET(xdev).getFaceTracking(facial_expression_type, at_timestamp_ns, out_value);
308 getFaceCalibrationStateAndroidWrap(
struct xrt_device *xdev,
bool *out_face_is_calibrated)
noexcept
310 return GET(xdev).getFaceCalibrationStateAndroid(out_face_is_calibrated);
319 return GET(xdev).getBodySkeleton(body_tracking_type, out_value);
326 int64_t desired_timestamp_ns,
329 return GET(xdev).getBodyJoints(body_tracking_type, desired_timestamp_ns, out_value);
334 resetBodyTrackingCalibrationMetaWrap(
struct xrt_device *xdev)
noexcept
336 return GET(xdev).resetBodyTrackingCalibrationMeta();
341 setBodyTrackingCalibrationOverrideMetaWrap(
struct xrt_device *xdev,
float new_body_height)
noexcept
343 return GET(xdev).setBodyTrackingCalibrationOverrideMeta(new_body_height);
350 return GET(xdev).setOutput(name, value);
357 return GET(xdev).getOutputLimits(limits);
362 getPresenceWrap(
struct xrt_device *xdev,
bool *presence)
noexcept
364 return GET(xdev).getPresence(presence);
369 beginPlaneDetectionExtWrap(
struct xrt_device *xdev,
371 uint64_t plane_detection_id,
372 uint64_t *out_plane_detection_id)
noexcept
374 return GET(xdev).beginPlaneDetectionExt(begin_info, plane_detection_id, out_plane_detection_id);
379 destroyPlaneDetectionExtWrap(
struct xrt_device *xdev, uint64_t plane_detection_id)
noexcept
381 return GET(xdev).destroyPlaneDetectionExt(plane_detection_id);
386 getPlaneDetectionStateExtWrap(
struct xrt_device *xdev,
387 uint64_t plane_detection_id,
390 return GET(xdev).getPlaneDetectionStateExt(plane_detection_id, out_state);
395 getPlaneDetectionsExtWrap(
struct xrt_device *xdev,
396 uint64_t plane_detection_id,
399 return GET(xdev).getPlaneDetectionsExt(plane_detection_id, out_detections);
405 const struct xrt_vec3 *default_eye_relation,
406 int64_t at_timestamp_ns,
411 struct xrt_pose *out_poses)
noexcept
413 return GET(xdev).getViewPoses(default_eye_relation, at_timestamp_ns, view_type, view_count,
414 out_head_relation, out_fovs, out_poses);
419 computeDistortionWrap(
422 return GET(xdev).computeDistortion(view, u, v, out_result);
427 getVisibilityMaskWrap(
struct xrt_device *xdev,
432 return GET(xdev).getVisibilityMask(type, view_index, out_mask);
442 return GET(xdev).refSpaceUsage(type, name, used);
447 isFormFactorAvailableWrap(
struct xrt_device *xdev,
449 bool *out_available)
noexcept
451 return GET(xdev).isFormFactorAvailable(form_factor, out_available);
456 getBatteryStatusWrap(
struct xrt_device *xdev,
bool *out_present,
bool *out_charging,
float *out_charge)
noexcept
458 return GET(xdev).getBatteryStatus(out_present, out_charging, out_charge);
463 getBrightnessWrap(
struct xrt_device *xdev,
float *out_brightness)
noexcept
465 return GET(xdev).getBrightness(out_brightness);
470 setBrightnessWrap(
struct xrt_device *xdev,
float brightness,
bool relative)
noexcept
472 return GET(xdev).setBrightness(brightness, relative);
477 getCompositorInfoWrap(
struct xrt_device *xdev,
481 return GET(xdev).getCompositorInfo(mode, out_info);
488 return GET(xdev).beginFeature(type);
495 return GET(xdev).endFeature(type);
500 destroyDeviceWrap(
struct xrt_device *xdev)
noexcept
502 T::destroyDevice(xdev);
CRTP glue wrapper for xrt_device.
Definition g_device.hpp:112
DeviceBase() noexcept
Fully resets and sets function pointers on xrt_device.
Definition g_device.hpp:117
xrt_device * getXDev() noexcept
Gets the underlying xrt_device pointer.
Definition g_device.hpp:250
static T * fromXDev(xrt_device *xdev) noexcept
Gets the pointer to the derived class from a xrt_device.
Definition g_device.hpp:236
static const T * fromXDev(const xrt_device *xdev) noexcept
Gets the pointer to the derived class from a xrt_device.
Definition g_device.hpp:229
~DeviceBase() noexcept=default
Destructor.
const xrt_device * getXDev() const noexcept
Gets the underlying xrt_device pointer.
Definition g_device.hpp:243
Catch guards for glue classes.
Shared type traits for glue classes.
void u_device_populate_function_pointers(struct xrt_device *xdev, u_device_get_tracked_pose_function_t get_tracked_pose_fn, u_device_destroy_function_t destroy_fn)
Populate the device's function pointers with default implementations.
Definition u_device.c:599
void u_device_id_assign(struct xrt_device *xdev)
Assign a newly generated ID to the given device.
Definition u_device_id.c:31
xrt_visibility_mask_type
Visibility mask, mirror of XrVisibilityMaskKHR.
Definition xrt_defines.h:2468
xrt_form_factor
What form factor is this device, mostly maps onto OpenXR's XrFormFactor.
Definition xrt_defines.h:2408
xrt_input_name
Every internal input source known to monado with a baked in type.
Definition xrt_defines.h:930
enum xrt_result xrt_result_t
Result type used across Monado.
xrt_reference_space_type
Type of a OpenXR mapped reference space, maps to the semantic spaces on the xrt_space_overseer struct...
Definition xrt_defines.h:625
xrt_output_name
Name of a output with a baked in type.
Definition xrt_defines.h:1612
xrt_plane_detector_state_ext
State of a plane detector, see xrt_device.
Definition xrt_plane_detector.h:83
Selects which functions that the DeviceBase wrapper should set.
Definition g_device.hpp:28
bool body_tracking
xrt_device::get_body_skeleton xrt_device::get_body_joints xrt_device::reset_body_tracking_calibration...
Definition g_device.hpp:65
bool reference_space
xrt_device::ref_space_usage
Definition g_device.hpp:79
bool plane_detection
xrt_device::begin_plane_detection_ext xrt_device::destroy_plane_detection_ext xrt_device::get_plane_d...
Definition g_device.hpp:73
bool output_limits
xrt_device::get_output_limits
Definition g_device.hpp:48
bool visibility_mask
xrt_device::get_visibility_mask
Definition g_device.hpp:39
bool update_inputs
xrt_device::update_inputs
Definition g_device.hpp:42
bool compositor_info
xrt_device::get_compositor_info
Definition g_device.hpp:91
bool hmd
xrt_device::get_view_poses xrt_device::is_form_factor_available
Definition g_device.hpp:33
bool output
xrt_device::set_output
Definition g_device.hpp:45
bool battery
xrt_device::get_battery_status
Definition g_device.hpp:82
bool brightness
xrt_device::get_brightness xrt_device::set_brightness
Definition g_device.hpp:88
bool hand_tracking
xrt_device::get_hand_tracking
Definition g_device.hpp:51
bool face_tracking
xrt_device::get_face_tracking
Definition g_device.hpp:54
bool distortion
xrt_device::compute_distortion
Definition g_device.hpp:36
bool features
xrt_device::begin_feature xrt_device::end_feature
Definition g_device.hpp:97
bool face_calibration_android
xrt_device::get_face_calibration_state_android
Definition g_device.hpp:57
bool presence
xrt_device::get_presence
Definition g_device.hpp:76
Definition xrt_defines.h:2301
Definition xrt_defines.h:2198
Compositor information for a device.
Definition xrt_device.h:110
Compositor mode information for a device.
Definition xrt_device.h:126
A single HMD or input device.
Definition xrt_device.h:340
Definition xrt_defines.h:1967
Describes a projection matrix fov.
Definition xrt_defines.h:512
Joint set type used for hand tracking.
Definition xrt_defines.h:1521
Output limits of a particular device.
Definition xrt_device.h:288
A union of all output types.
Definition xrt_defines.h:2386
Each plane has n polygons; ultimately plane metadata from xrt_plane_detections_ext::locations and xrt...
Definition xrt_plane_detector.h:172
A query for a plane.
Definition xrt_plane_detector.h:97
A pose composed of a position and orientation.
Definition xrt_defines.h:492
A relation with two spaces, includes velocity and acceleration.
Definition xrt_defines.h:683
Represents a uv triplet for distortion, basically just three xrt_vec2.
Definition xrt_defines.h:279
A 3 element vector with single floats.
Definition xrt_defines.h:289
Visibility mask helper, the indices and vertices are tightly packed after this struct.
Definition xrt_visibility_mask.h:26
Misc helpers for device drivers.
Generator for per-process unique xrt_device_id values.
xrt_view_type
View type to be rendered to by the compositor.
Definition xrt_defines.h:2417
Header defining an xrt display or controller device.
xrt_device_feature_type
Higher level features for devices.
Definition xrt_device.h:276