···29 };
303132-public:
33 // Exposed to the C api.
34 struct xrt_frame frame = {};
35···37 cv::Mat matrix = cv::Mat();
383940-public:
41 /*!
42 * Only public due to C needed to destroy it.
43 */
···50 * its reference count decremented so make sure it's a valid pointer.
51 */
52 static void
53- wrapR8G8B8(cv::Mat mat, xrt_frame **xf_ptr, const Params params = {});
5455 /*!
56 * Wraps the given cv::Mat assuming it's a 8bit format matrix.
···59 * its reference count decremented so make sure it's a valid pointer.
60 */
61 static void
62- wrapL8(cv::Mat mat, xrt_frame **xf_ptr, const Params params = {});
636465private:
···29 };
303132+33 // Exposed to the C api.
34 struct xrt_frame frame = {};
35···37 cv::Mat matrix = cv::Mat();
383940+41 /*!
42 * Only public due to C needed to destroy it.
43 */
···50 * its reference count decremented so make sure it's a valid pointer.
51 */
52 static void
53+ wrapR8G8B8(const cv::Mat &mat, xrt_frame **fm_out, Params params = {});
5455 /*!
56 * Wraps the given cv::Mat assuming it's a 8bit format matrix.
···59 * its reference count decremented so make sure it's a valid pointer.
60 */
61 static void
62+ wrapL8(const cv::Mat &mat, xrt_frame **fm_out, Params params = {});
636465private:
···314}
315316static float
317-dist_3d_cv(cv::Point3f a, cv::Point3f b)
318{
319 return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y) + (a.z - b.z) * (a.z - b.z));
320}
···508remove_outliers(std::vector<blob_point_t> *orig_points, std::vector<blob_point_t> *pruned_points, float outlier_thresh)
509{
510511- if (orig_points->size() == 0) {
512 return;
513 }
514···523 temp_points.push_back(orig_points->at(i));
524 }
525 }
526- if (temp_points.size() == 0) {
527 return;
528 }
529···620static void
621match_triangles(Eigen::Matrix4f *t1_mat,
622 Eigen::Matrix4f *t1_to_t2_mat,
623- Eigen::Vector4f t1_a,
624- Eigen::Vector4f t1_b,
625- Eigen::Vector4f t1_c,
626- Eigen::Vector4f t2_a,
627- Eigen::Vector4f t2_b,
628- Eigen::Vector4f t2_c)
629{
630 // given 3 vertices in 'model space', and a corresponding 3 vertices
631 // in 'world space', compute the transformation matrix to map one
···834 proximity_data.push_back(p);
835 }
836837- if (proximity_data.size() > 0) {
838839 // use the IMU rotation and the measured points in
840 // world space to compute a transform from model to world space.
···899 Eigen::Matrix4f imu_solved_pose =
900 solve_with_imu(t, measured_points, last_measurement, solved, PSVR_SEARCH_RADIUS);
901902- if (measured_points->size() < PSVR_OPTICAL_SOLVE_THRESH && last_measurement->size() > 0) {
903 return imu_solved_pose;
904 }
905···998 float prev_diff = last_diff(t, &meas_solved, &t.last_vertices);
999 float imu_diff = last_diff(t, &meas_solved, solved);
10001001- Eigen::Vector4f tl_pos, tr_pos, bl_pos, br_pos;
0001002 bool has_bl = false;
1003 bool has_br = false;
1004 bool has_tl = false;
···1147 uint32_t indices[PSVR_NUM_LEDS];
114811491150-public:
1151 ~Helper()
1152 {
1153 m_permutator_reset(&mp);
···126912701271static void
1272-sample_line(cv::Mat &src, cv::Point2i start, cv::Point2i end, int *inside_length)
1273{
1274 // use bresenhams algorithm to sample the
1275 // pixels between two points in an image
···1589 // Convert our 2d point + disparities into 3d points.
1590 std::vector<blob_data_t> blob_datas;
15911592- if (t.l_blobs.size() > 0) {
1593 for (uint32_t i = 0; i < t.l_blobs.size(); i++) {
1594 float disp = t.r_blobs[i].pt.x - t.l_blobs[i].pt.x;
1595 cv::Vec4d xydw(t.l_blobs[i].pt.x, t.l_blobs[i].pt.y, disp, 1.0f);
···1785 t.last_vertices.push_back(solved[i]);
1786 }
17871788- if (t.last_vertices.size() > 0) {
1789 filter_update(&t.last_vertices, t.track_filters, dt / 1000.0f);
1790 }
1791···1999extern "C" void
2000t_psvr_node_destroy(struct xrt_frame_node *node)
2001{
2002- auto t_ptr = container_of(node, TrackerPSVR, node);
20032004 os_thread_helper_destroy(&t_ptr->oth);
2005
···314}
315316static float
317+dist_3d_cv(const cv::Point3f &a, const cv::Point3f &b)
318{
319 return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y) + (a.z - b.z) * (a.z - b.z));
320}
···508remove_outliers(std::vector<blob_point_t> *orig_points, std::vector<blob_point_t> *pruned_points, float outlier_thresh)
509{
510511+ if (orig_points->empty()) {
512 return;
513 }
514···523 temp_points.push_back(orig_points->at(i));
524 }
525 }
526+ if (temp_points.empty()) {
527 return;
528 }
529···620static void
621match_triangles(Eigen::Matrix4f *t1_mat,
622 Eigen::Matrix4f *t1_to_t2_mat,
623+ const Eigen::Vector4f &t1_a,
624+ const Eigen::Vector4f &t1_b,
625+ const Eigen::Vector4f &t1_c,
626+ const Eigen::Vector4f &t2_a,
627+ const Eigen::Vector4f &t2_b,
628+ const Eigen::Vector4f &t2_c)
629{
630 // given 3 vertices in 'model space', and a corresponding 3 vertices
631 // in 'world space', compute the transformation matrix to map one
···834 proximity_data.push_back(p);
835 }
836837+ if (!proximity_data.empty()) {
838839 // use the IMU rotation and the measured points in
840 // world space to compute a transform from model to world space.
···899 Eigen::Matrix4f imu_solved_pose =
900 solve_with_imu(t, measured_points, last_measurement, solved, PSVR_SEARCH_RADIUS);
901902+ if (measured_points->size() < PSVR_OPTICAL_SOLVE_THRESH && !last_measurement->empty()) {
903 return imu_solved_pose;
904 }
905···998 float prev_diff = last_diff(t, &meas_solved, &t.last_vertices);
999 float imu_diff = last_diff(t, &meas_solved, solved);
10001001+ Eigen::Vector4f tl_pos;
1002+ Eigen::Vector4f tr_pos;
1003+ Eigen::Vector4f bl_pos;
1004+ Eigen::Vector4f br_pos;
1005 bool has_bl = false;
1006 bool has_br = false;
1007 bool has_tl = false;
···1150 uint32_t indices[PSVR_NUM_LEDS];
1151115201153 ~Helper()
1154 {
1155 m_permutator_reset(&mp);
···127112721273static void
1274+sample_line(cv::Mat &src, const cv::Point2i &start, const cv::Point2i &end, int *inside_length)
1275{
1276 // use bresenhams algorithm to sample the
1277 // pixels between two points in an image
···1591 // Convert our 2d point + disparities into 3d points.
1592 std::vector<blob_data_t> blob_datas;
15931594+ if (!t.l_blobs.empty()) {
1595 for (uint32_t i = 0; i < t.l_blobs.size(); i++) {
1596 float disp = t.r_blobs[i].pt.x - t.l_blobs[i].pt.x;
1597 cv::Vec4d xydw(t.l_blobs[i].pt.x, t.l_blobs[i].pt.y, disp, 1.0f);
···1787 t.last_vertices.push_back(solved[i]);
1788 }
17891790+ if (!t.last_vertices.empty()) {
1791 filter_update(&t.last_vertices, t.track_filters, dt / 1000.0f);
1792 }
1793···2001extern "C" void
2002t_psvr_node_destroy(struct xrt_frame_node *node)
2003{
2004+ auto *t_ptr = container_of(node, TrackerPSVR, node);
20052006 os_thread_helper_destroy(&t_ptr->oth);
2007
+4-4
src/xrt/auxiliary/tracking/t_tracking.h
···99};
100101/*!
102- * Allocates a new stereo calibration data, unreferences the old @p calib.
103 *
104 * Also initializes t_camera_calibration::distortion_num in t_stereo_camera_calibration::view, only 5 and 14 is
105 * accepted.
···107 * @public @memberof t_stereo_camera_calibration
108 */
109void
110-t_stereo_camera_calibration_alloc(struct t_stereo_camera_calibration **calib, uint32_t distortion_num);
111112/*!
113 * Only to be called by @p t_stereo_camera_calibration_reference.
···188 * @relates t_stereo_camera_calibration
189 */
190bool
191-t_stereo_camera_calibration_from_json_v2(cJSON *json, struct t_stereo_camera_calibration **out_data);
192193/*!
194 * Convert the given stereo calibration data into a json object in v2 format.
···196 * @relates t_stereo_camera_calibration
197 */
198bool
199-t_stereo_camera_calibration_to_json_v2(cJSON **out_json, struct t_stereo_camera_calibration *data);
200201202/*!
···99};
100101/*!
102+ * Allocates a new stereo calibration data, unreferences the old data pointed to by @p out_c.
103 *
104 * Also initializes t_camera_calibration::distortion_num in t_stereo_camera_calibration::view, only 5 and 14 is
105 * accepted.
···107 * @public @memberof t_stereo_camera_calibration
108 */
109void
110+t_stereo_camera_calibration_alloc(struct t_stereo_camera_calibration **out_c, uint32_t distortion_num);
111112/*!
113 * Only to be called by @p t_stereo_camera_calibration_reference.
···188 * @relates t_stereo_camera_calibration
189 */
190bool
191+t_stereo_camera_calibration_from_json_v2(cJSON *json, struct t_stereo_camera_calibration **out_stereo);
192193/*!
194 * Convert the given stereo calibration data into a json object in v2 format.
···196 * @relates t_stereo_camera_calibration
197 */
198bool
199+t_stereo_camera_calibration_to_json_v2(cJSON **out_cjson, struct t_stereo_camera_calibration *data);
200201202/*!
···103104static void
105euroc_device_update_inputs(struct xrt_device *xdev)
106-{
107- return;
108-}
109110//! Corrections specific for original euroc datasets and Kimera.
111//! If your datasets comes from a different camera you should probably
···103104static void
105euroc_device_update_inputs(struct xrt_device *xdev)
106+{}
00107108//! Corrections specific for original euroc datasets and Kimera.
109//! If your datasets comes from a different camera you should probably
+2-3
src/xrt/drivers/euroc/euroc_player.cpp
···453{
454 bool stereo = ep->playback.stereo;
455456- struct xrt_frame *left_xf = NULL, *right_xf = NULL;
0457 euroc_player_load_next_frame(ep, true, left_xf);
458 if (stereo) {
459 // TODO: Some SLAM systems expect synced frames, but that's not an
···787 m_ff_vec3_f32_free(&ep->accel_ff);
788789 free(ep);
790-791- return;
792}
793794
···453{
454 bool stereo = ep->playback.stereo;
455456+ struct xrt_frame *left_xf = NULL;
457+ struct xrt_frame *right_xf = NULL;
458 euroc_player_load_next_frame(ep, true, left_xf);
459 if (stereo) {
460 // TODO: Some SLAM systems expect synced frames, but that's not an
···788 m_ff_vec3_f32_free(&ep->accel_ff);
789790 free(ep);
00791}
792793
···209210211Vector2
212-OpticalSystem::DisplayUVToRenderUVPreviousSeed(Vector2 inputUV)
213{
214 // if we don't find a point we generate it and add it to our list
215 Vector2 curDisplayUV;
···209210211Vector2
212+OpticalSystem::DisplayUVToRenderUVPreviousSeed(const Vector2 &inputUV)
213{
214 // if we don't find a point we generate it and add it to our list
215 Vector2 curDisplayUV;
···107 assert(fabsf(out_fov.angle_right) < M_PI_2);
108 memcpy(left_fov, &out_fov, sizeof(struct xrt_fov));
109 memcpy(right_fov, &out_fov, sizeof(struct xrt_fov));
110- return;
111}
112113bool
···641 // avoid unintended consequences. As soon as you have a specific reason to support it, go ahead and support it.
642 ns->base.hmd->blend_mode_count = idx;
643644- uint64_t start, end;
0645646 start = os_monotonic_get_ns();
647 u_distortion_mesh_fill_in_compute(&ns->base);
···107 assert(fabsf(out_fov.angle_right) < M_PI_2);
108 memcpy(left_fov, &out_fov, sizeof(struct xrt_fov));
109 memcpy(right_fov, &out_fov, sizeof(struct xrt_fov));
0110}
111112bool
···640 // avoid unintended consequences. As soon as you have a specific reason to support it, go ahead and support it.
641 ns->base.hmd->blend_mode_count = idx;
642643+ uint64_t start;
644+ uint64_t end;
645646 start = os_monotonic_get_ns();
647 u_distortion_mesh_fill_in_compute(&ns->base);
+4-2
src/xrt/drivers/psmv/psmv_driver.c
···1295 struct psmv_calibration_zcm1 data;
1296 uint8_t *dst = (uint8_t *)&data;
1297 int ret = 0;
1298- size_t src_offset, dst_offset;
012991300 for (int i = 0; i < 3; i++) {
1301 struct psmv_calibration_part part = {0};
···1511 struct psmv_calibration_zcm2 data;
1512 uint8_t *dst = (uint8_t *)&data;
1513 int ret = 0;
1514- size_t src_offset, dst_offset;
015151516 for (int i = 0; i < 2; i++) {
1517 struct psmv_calibration_part part = {0};
···1295 struct psmv_calibration_zcm1 data;
1296 uint8_t *dst = (uint8_t *)&data;
1297 int ret = 0;
1298+ size_t src_offset;
1299+ size_t dst_offset;
13001301 for (int i = 0; i < 3; i++) {
1302 struct psmv_calibration_part part = {0};
···1512 struct psmv_calibration_zcm2 data;
1513 uint8_t *dst = (uint8_t *)&data;
1514 int ret = 0;
1515+ size_t src_offset;
1516+ size_t dst_offset;
15171518 for (int i = 0; i < 2; i++) {
1519 struct psmv_calibration_part part = {0};
···46static struct qwerty_device *
47default_qwerty_device(struct xrt_device **xdevs, size_t xdev_count, struct qwerty_system *qsys)
48{
49- int head, left, right;
0050 head = left = right = XRT_DEVICE_ROLE_UNASSIGNED;
51 u_device_assign_xdev_roles(xdevs, xdev_count, &head, &left, &right);
52···72static struct qwerty_controller *
73default_qwerty_controller(struct xrt_device **xdevs, size_t xdev_count, struct qwerty_system *qsys)
74{
75- int head, left, right;
0076 head = left = right = XRT_DEVICE_ROLE_UNASSIGNED;
77 u_device_assign_xdev_roles(xdevs, xdev_count, &head, &left, &right);
78
···46static struct qwerty_device *
47default_qwerty_device(struct xrt_device **xdevs, size_t xdev_count, struct qwerty_system *qsys)
48{
49+ int head;
50+ int left;
51+ int right;
52 head = left = right = XRT_DEVICE_ROLE_UNASSIGNED;
53 u_device_assign_xdev_roles(xdevs, xdev_count, &head, &left, &right);
54···74static struct qwerty_controller *
75default_qwerty_controller(struct xrt_device **xdevs, size_t xdev_count, struct qwerty_system *qsys)
76{
77+ int head;
78+ int left;
79+ int right;
80 head = left = right = XRT_DEVICE_ROLE_UNASSIGNED;
81 u_device_assign_xdev_roles(xdevs, xdev_count, &head, &left, &right);
82
+7-4
src/xrt/drivers/remote/r_hub.c
···29#define __USE_MISC // SOL_TCP on C11
30#endif
31#ifndef _BSD_SOURCE
32-#define _BSD_SOURCE // same, but for musl
33#endif
3435#include <netinet/tcp.h>
···85do_accept(struct r_hub *r)
86{
87 struct sockaddr_in addr = {0};
88- int ret, conn_fd;
08990 socklen_t addr_length = (socklen_t)sizeof(addr);
91 ret = accept(r->accept_fd, (struct sockaddr *)&addr, &addr_length);
···286 ssize_t ret = read(rc->fd, ptr, size - current);
287 if (ret < 0) {
288 return ret;
289- } else if (ret > 0) {
0290 current += (size_t)ret;
291 } else {
292 U_LOG_I("Disconnected!");
···309 ssize_t ret = write(rc->fd, ptr, size - current);
310 if (ret < 0) {
311 return ret;
312- } else if (ret > 0) {
0313 current += (size_t)ret;
314 } else {
315 U_LOG_I("Disconnected!");
···29#define __USE_MISC // SOL_TCP on C11
30#endif
31#ifndef _BSD_SOURCE
32+#define _BSD_SOURCE // same, but for musl // NOLINT
33#endif
3435#include <netinet/tcp.h>
···85do_accept(struct r_hub *r)
86{
87 struct sockaddr_in addr = {0};
88+ int ret;
89+ int conn_fd;
9091 socklen_t addr_length = (socklen_t)sizeof(addr);
92 ret = accept(r->accept_fd, (struct sockaddr *)&addr, &addr_length);
···287 ssize_t ret = read(rc->fd, ptr, size - current);
288 if (ret < 0) {
289 return ret;
290+ }
291+ if (ret > 0) {
292 current += (size_t)ret;
293 } else {
294 U_LOG_I("Disconnected!");
···311 ssize_t ret = write(rc->fd, ptr, size - current);
312 if (ret < 0) {
313 return ret;
314+ }
315+ if (ret > 0) {
316 current += (size_t)ret;
317 } else {
318 U_LOG_I("Disconnected!");
+2-1
src/xrt/drivers/vive/vive_device.c
···269 const struct vive_imu_sample *sample = report->sample;
270 uint8_t last_seq = d->imu.sequence;
271 d->imu.ts_received_ns = os_monotonic_get_ns();
272- int i, j;
0273274 /*
275 * The three samples are updated round-robin. New messages
···269 const struct vive_imu_sample *sample = report->sample;
270 uint8_t last_seq = d->imu.sequence;
271 d->imu.ts_received_ns = os_monotonic_get_ns();
272+ int i;
273+ int j;
274275 /*
276 * The three samples are updated round-robin. New messages
+10-5
src/xrt/drivers/wmr/wmr_bt_controller.c
···72 if (size < 0) {
73 WMR_ERROR(d, "WMR Controller (Bluetooth): Error reading from device");
74 return false;
75- } else if (size == 0) {
076 WMR_TRACE(d, "WMR Controller (Bluetooth): No data to read from device");
77 return true; // No more messages, return.
78 }
···163{
164 struct wmr_controller_fw_cmd_response fw_cmd_response;
165166- uint8_t *data, *data_pos, *data_end;
167- uint32_t data_size, remain;
000168169 struct wmr_controller_fw_cmd fw_cmd;
170 memset(&fw_cmd, 0, sizeof(fw_cmd));
···224static bool
225read_controller_config(struct wmr_bt_controller *d)
226{
227- unsigned char *data = NULL, *config_json_block;
0228 size_t data_size;
229 int ret;
230···234 // USB PID/VID are visible in them, but it's not clear
235 // what the layout is and we don't use them currently,
236 // so this if 0 code is just exemplary.
237-238 // Read serials
239 ret = wmr_read_fw_block(d, 0x03, &data, &data_size);
240 if (ret < 0 || data == NULL)
···72 if (size < 0) {
73 WMR_ERROR(d, "WMR Controller (Bluetooth): Error reading from device");
74 return false;
75+ }
76+ if (size == 0) {
77 WMR_TRACE(d, "WMR Controller (Bluetooth): No data to read from device");
78 return true; // No more messages, return.
79 }
···164{
165 struct wmr_controller_fw_cmd_response fw_cmd_response;
166167+ uint8_t *data;
168+ uint8_t *data_pos;
169+ uint8_t *data_end;
170+ uint32_t data_size;
171+ uint32_t remain;
172173 struct wmr_controller_fw_cmd fw_cmd;
174 memset(&fw_cmd, 0, sizeof(fw_cmd));
···228static bool
229read_controller_config(struct wmr_bt_controller *d)
230{
231+ unsigned char *data = NULL;
232+ unsigned char *config_json_block;
233 size_t data_size;
234 int ret;
235···239 // USB PID/VID are visible in them, but it's not clear
240 // what the layout is and we don't use them currently,
241 // so this if 0 code is just exemplary.
242+243 // Read serials
244 ret = wmr_read_fw_block(d, 0x03, &data, &data_size);
245 if (ret < 0 || data == NULL)
+11-5
src/xrt/drivers/wmr/wmr_camera.c
···140static bool
141compute_frame_size(struct wmr_camera *cam)
142{
143- int i, cams_found = 0;
144- int width, height;
145- size_t F, n_packets, leftover;
0000146147 F = 26;
148···402 DRV_TRACE_MARKER();
403404 struct wmr_camera *cam = calloc(1, sizeof(struct wmr_camera));
405- int res, i;
0406407 cam->log_level = log_level;
408 cam->debug_gain = DEFAULT_GAIN;
···572{
573 DRV_TRACE_MARKER();
574575- int res, i;
0576577 if (!cam->running) {
578 return true;
···140static bool
141compute_frame_size(struct wmr_camera *cam)
142{
143+ int i;
144+ int cams_found = 0;
145+ int width;
146+ int height;
147+ size_t F;
148+ size_t n_packets;
149+ size_t leftover;
150151 F = 26;
152···406 DRV_TRACE_MARKER();
407408 struct wmr_camera *cam = calloc(1, sizeof(struct wmr_camera));
409+ int res;
410+ int i;
411412 cam->log_level = log_level;
413 cam->debug_gain = DEFAULT_GAIN;
···577{
578 DRV_TRACE_MARKER();
579580+ int res;
581+ int i;
582583 if (!cam->running) {
584 return true;
···32//! @todo IMU data should be generated from within the data source, but right
33//! now we need this function because it is being generated from wmr_hmd
34void
35-wmr_source_push_imu_packet(struct xrt_fs *xfs, uint64_t ts[4], struct xrt_vec3 accels[4], struct xrt_vec3 gyros[4]);
0003637/*!
38 * @}
···32//! @todo IMU data should be generated from within the data source, but right
33//! now we need this function because it is being generated from wmr_hmd
34void
35+wmr_source_push_imu_packet(struct xrt_fs *xfs,
36+ const uint64_t ts[4],
37+ struct xrt_vec3 accels[4],
38+ struct xrt_vec3 gyros[4]);
3940/*!
41 * @}
···347 * @ingroup ipc_server
348 */
349void
350-ipc_server_set_active_client(struct ipc_server *s, int active_client_index);
351352/*!
353 * Called by client threads to set a session to active.
···379 * @ingroup ipc_server
380 */
381void *
382-ipc_server_client_thread(void *_cs);
383384/*!
385 * This destroys the native compositor for this client and any extra objects
···347 * @ingroup ipc_server
348 */
349void
350+ipc_server_set_active_client(struct ipc_server *s, int client_id);
351352/*!
353 * Called by client threads to set a session to active.
···379 * @ingroup ipc_server
380 */
381void *
382+ipc_server_client_thread(void *_ics);
383384/*!
385 * This destroys the native compositor for this client and any extra objects
+4-2
src/xrt/ipc/server/ipc_server_mainloop_linux.c
···76{
77 // no fd provided
78 struct sockaddr_un addr;
79- int fd, ret;
08081 fd = socket(PF_UNIX, SOCK_STREAM, 0);
82 if (fd < 0) {
···143static int
144init_listen_socket(struct ipc_server_mainloop *ml)
145{
146- int fd = -1, ret;
0147 ml->listen_socket = -1;
148149 ret = get_systemd_socket(ml, &fd);
···76{
77 // no fd provided
78 struct sockaddr_un addr;
79+ int fd;
80+ int ret;
8182 fd = socket(PF_UNIX, SOCK_STREAM, 0);
83 if (fd < 0) {
···144static int
145init_listen_socket(struct ipc_server_mainloop *ml)
146{
147+ int fd = -1;
148+ int ret;
149 ml->listen_socket = -1;
150151 ret = get_systemd_socket(ml, &fd);
···132 * @ingroup gui
133 */
134void
135-gui_ogl_sink_update(struct gui_ogl_texture *);
136137/*!
138 * Push the scene to the top of the lists.
···132 * @ingroup gui
133 */
134void
135+gui_ogl_sink_update(struct gui_ogl_texture * /*tex*/);
136137/*!
138 * Push the scene to the top of the lists.
···191 * @public @memberof oxr_input_transform
192 */
193bool
194-oxr_input_transform_init_root(struct oxr_input_transform *transform, const enum xrt_input_type input_type);
195196/*!
197 * Allocate a transform to get the X component of a Vec2.
···191 * @public @memberof oxr_input_transform
192 */
193bool
194+oxr_input_transform_init_root(struct oxr_input_transform *transform, enum xrt_input_type input_type);
195196/*!
197 * Allocate a transform to get the X component of a Vec2.