113template <
class T, DeviceFunctions functions>
class DeviceBase
121 static_assert(std::is_standard_layout_v<DeviceBase>,
122 "glue base must be standard layout for pointer recovery");
123 static_assert(is_non_virtual_base_v<DeviceBase, T>,
124 "glue base must be a non-virtual base of T for pointer recovery");
134 if constexpr (functions.hmd) {
135 xdev.get_view_poses = getViewPosesWrap;
136 xdev.is_form_factor_available = isFormFactorAvailableWrap;
139 if constexpr (functions.distortion) {
140 xdev.compute_distortion = computeDistortionWrap;
143 if constexpr (functions.visibility_mask) {
144 xdev.get_visibility_mask = getVisibilityMaskWrap;
147 if constexpr (functions.update_inputs) {
148 xdev.update_inputs = updateInputsWrap;
151 if constexpr (functions.output) {
152 xdev.set_output = setOutputWrap;
155 if constexpr (functions.output_limits) {
156 xdev.get_output_limits = getOutputLimitsWrap;
159 if constexpr (functions.hand_tracking) {
160 xdev.get_hand_tracking = getHandTrackingWrap;
163 if constexpr (functions.face_tracking) {
164 xdev.get_face_tracking = getFaceTrackingWrap;
167 if constexpr (functions.face_calibration_android) {
168 xdev.get_face_calibration_state_android = getFaceCalibrationStateAndroidWrap;
171 if constexpr (functions.body_tracking) {
172 xdev.get_body_skeleton = getBodySkeletonWrap;
173 xdev.get_body_joints = getBodyJointsWrap;
174 xdev.reset_body_tracking_calibration_meta = resetBodyTrackingCalibrationMetaWrap;
175 xdev.set_body_tracking_calibration_override_meta = setBodyTrackingCalibrationOverrideMetaWrap;
178 if constexpr (functions.plane_detection) {
179 xdev.begin_plane_detection_ext = beginPlaneDetectionExtWrap;
180 xdev.destroy_plane_detection_ext = destroyPlaneDetectionExtWrap;
181 xdev.get_plane_detection_state_ext = getPlaneDetectionStateExtWrap;
182 xdev.get_plane_detections_ext = getPlaneDetectionsExtWrap;
185 if constexpr (functions.reference_space) {
186 xdev.ref_space_usage = refSpaceUsageWrap;
189 if constexpr (functions.battery) {
190 xdev.get_battery_status = getBatteryStatusWrap;
193 if constexpr (functions.brightness) {
194 xdev.get_brightness = getBrightnessWrap;
195 xdev.set_brightness = setBrightnessWrap;
198 if constexpr (functions.compositor_info) {
199 xdev.get_compositor_info = getCompositorInfoWrap;
202 if constexpr (functions.features) {
203 xdev.begin_feature = beginFeatureWrap;
204 xdev.end_feature = endFeatureWrap;
207 if constexpr (functions.notify_chirality) {
208 xdev.notify_chirality = notifyChiralityWrap;
218 derived() const noexcept
220 return static_cast<const T &
>(*this);
226 return static_cast<T &
>(*this);
233 return &(
reinterpret_cast<const DeviceBase *
>(xdev)->derived());
240 return &(
reinterpret_cast<DeviceBase *
>(xdev)->derived());
269#define GET(xdev) (fromXDev(xdev)->derived())
272 updateInputsWrap(
struct xrt_device *xdev)
noexcept
274 return GET(xdev).updateInputs();
281 int64_t at_timestamp_ns,
284 return GET(xdev).getTrackedPose(name, at_timestamp_ns, out_relation);
291 int64_t desired_timestamp_ns,
293 int64_t *out_timestamp_ns)
noexcept
295 return GET(xdev).getHandTracking(name, desired_timestamp_ns, out_value, out_timestamp_ns);
302 int64_t at_timestamp_ns,
305 return GET(xdev).getFaceTracking(facial_expression_type, at_timestamp_ns, out_value);
310 getFaceCalibrationStateAndroidWrap(
struct xrt_device *xdev,
bool *out_face_is_calibrated)
noexcept
312 return GET(xdev).getFaceCalibrationStateAndroid(out_face_is_calibrated);
321 return GET(xdev).getBodySkeleton(body_tracking_type, out_value);
328 int64_t desired_timestamp_ns,
331 return GET(xdev).getBodyJoints(body_tracking_type, desired_timestamp_ns, out_value);
336 resetBodyTrackingCalibrationMetaWrap(
struct xrt_device *xdev)
noexcept
338 return GET(xdev).resetBodyTrackingCalibrationMeta();
343 setBodyTrackingCalibrationOverrideMetaWrap(
struct xrt_device *xdev,
float new_body_height)
noexcept
345 return GET(xdev).setBodyTrackingCalibrationOverrideMeta(new_body_height);
352 return GET(xdev).setOutput(name, value);
359 return GET(xdev).getOutputLimits(limits);
364 beginPlaneDetectionExtWrap(
struct xrt_device *xdev,
366 uint64_t plane_detection_id,
367 uint64_t *out_plane_detection_id)
noexcept
369 return GET(xdev).beginPlaneDetectionExt(begin_info, plane_detection_id, out_plane_detection_id);
374 destroyPlaneDetectionExtWrap(
struct xrt_device *xdev, uint64_t plane_detection_id)
noexcept
376 return GET(xdev).destroyPlaneDetectionExt(plane_detection_id);
381 getPlaneDetectionStateExtWrap(
struct xrt_device *xdev,
382 uint64_t plane_detection_id,
385 return GET(xdev).getPlaneDetectionStateExt(plane_detection_id, out_state);
390 getPlaneDetectionsExtWrap(
struct xrt_device *xdev,
391 uint64_t plane_detection_id,
394 return GET(xdev).getPlaneDetectionsExt(plane_detection_id, out_detections);
400 const struct xrt_vec3 *default_eye_relation,
401 int64_t at_timestamp_ns,
406 struct xrt_pose *out_poses)
noexcept
408 return GET(xdev).getViewPoses(default_eye_relation, at_timestamp_ns, view_type, view_count,
409 out_head_relation, out_fovs, out_poses);
414 computeDistortionWrap(
417 return GET(xdev).computeDistortion(view, u, v, out_result);
422 getVisibilityMaskWrap(
struct xrt_device *xdev,
427 return GET(xdev).getVisibilityMask(type, view_index, out_mask);
437 return GET(xdev).refSpaceUsage(type, name, used);
442 isFormFactorAvailableWrap(
struct xrt_device *xdev,
444 bool *out_available)
noexcept
446 return GET(xdev).isFormFactorAvailable(form_factor, out_available);
451 getBatteryStatusWrap(
struct xrt_device *xdev,
bool *out_present,
bool *out_charging,
float *out_charge)
noexcept
453 return GET(xdev).getBatteryStatus(out_present, out_charging, out_charge);
458 getBrightnessWrap(
struct xrt_device *xdev,
float *out_brightness)
noexcept
460 return GET(xdev).getBrightness(out_brightness);
465 setBrightnessWrap(
struct xrt_device *xdev,
float brightness,
bool relative)
noexcept
467 return GET(xdev).setBrightness(brightness, relative);
472 getCompositorInfoWrap(
struct xrt_device *xdev,
476 return GET(xdev).getCompositorInfo(mode, out_info);
483 return GET(xdev).beginFeature(type);
490 return GET(xdev).endFeature(type);
495 notifyChiralityWrap(
struct xrt_device *xdev,
bool has_chirality,
enum xrt_hand chirality)
noexcept
497 return GET(xdev).notifyChirality(has_chirality, chirality);
502 destroyDeviceWrap(
struct xrt_device *xdev)
noexcept
504 T::destroyDevice(xdev);
CRTP glue wrapper for xrt_device.
Definition g_device.hpp:114
DeviceBase() noexcept
Fully resets and sets function pointers on xrt_device.
Definition g_device.hpp:119
xrt_device * getXDev() noexcept
Gets the underlying xrt_device pointer.
Definition g_device.hpp:252
static T * fromXDev(xrt_device *xdev) noexcept
Gets the pointer to the derived class from a xrt_device.
Definition g_device.hpp:238
static const T * fromXDev(const xrt_device *xdev) noexcept
Gets the pointer to the derived class from a xrt_device.
Definition g_device.hpp:231
~DeviceBase() noexcept=default
Destructor.
const xrt_device * getXDev() const noexcept
Gets the underlying xrt_device pointer.
Definition g_device.hpp:245
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_hand
Enumeration for left and right hand.
Definition xrt_defines.h:1478
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:76
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:88
bool notify_chirality
xrt_device::notify_chirality
Definition g_device.hpp:99
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:79
bool brightness
xrt_device::get_brightness xrt_device::set_brightness
Definition g_device.hpp:85
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:94
bool face_calibration_android
xrt_device::get_face_calibration_state_android
Definition g_device.hpp:57
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:341
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