Monado OpenXR Runtime
u_distortion_mesh.h
Go to the documentation of this file.
1// Copyright 2019, Collabora, Ltd.
2// SPDX-License-Identifier: BSL-1.0
3/*!
4 * @file
5 * @brief Code to generate disortion meshes.
6 * @author Jakob Bornecrantz <jakob@collabora.com>
7 * @author Moshi Turner <moshiturner@protonmail.com>
8 * @ingroup aux_distortion
9 */
10
11#pragma once
12
13#include "xrt/xrt_device.h"
14#include "xrt/xrt_defines.h"
15
16#include "util/u_distortion.h"
17
18
19#ifdef __cplusplus
20extern "C" {
21#endif
22
23
24/*
25 *
26 * Panotools distortion
27 *
28 */
29
30/*!
31 * Values to create a distortion mesh from panotools values.
32 *
33 * @ingroup aux_distortion
34 */
36{
37 //! Panotools universal distortion k (reverse order from OpenHMD).
38 float distortion_k[5];
39 //! Panotools post distortion scale, <r, g, b>.
40 float aberration_k[3];
41 //! Panotools warp scale.
42 float scale;
43 //! Center of the lens.
45 //! Viewport size.
47};
48
49/*!
50 * Distortion correction implementation for Panotools distortion values.
51 *
52 * @ingroup aux_distortion
53 */
54void
55u_compute_distortion_panotools(struct u_panotools_values *values, float u, float v, struct xrt_uv_triplet *result);
56
57
58/*
59 *
60 * Vive, Vive Pro & Index distortion
61 *
62 */
63
64/*!
65 * Values to create a distortion mesh from Vive configuration values.
66 *
67 * @ingroup aux_distortion
68 */
70{
71 float aspect_x_over_y;
72 float grow_for_undistort;
73
74 float undistort_r2_cutoff;
75
76 //! r/g/b
77 struct xrt_vec2 center[3];
78
79 //! r/g/b, a/b/c/d
80 float coefficients[3][4];
81};
82
83/*!
84 * Distortion correction implementation for the Vive, Vive Pro, Valve Index
85 * distortion values found in the HMD configuration.
86 *
87 * @ingroup aux_distortion
88 */
89void
90u_compute_distortion_vive(struct u_vive_values *values, float u, float v, struct xrt_uv_triplet *result);
91
92
93/*
94 *
95 * Cardboard mesh distortion parameters.
96 *
97 */
98
99/*!
100 * Distortion correction implementation for the Cardboard devices.
101 *
102 * @ingroup aux_distortion
103 */
104void
106 float u,
107 float v,
108 struct xrt_uv_triplet *result);
109
110
111/*
112 *
113 * Values for North Star 2D/Polynomial distortion correction.
114 *
115 */
116
118{
119 float x_coefficients_left[16];
120 float x_coefficients_right[16];
121 float y_coefficients_left[16];
122 float y_coefficients_right[16];
123 struct xrt_fov fov[2]; // left, right
124 float ipd;
125};
126
127/*!
128 * Distortion correction implementation for North Star 2D/Polynomial.
129 *
130 * @ingroup aux_distortion
131 */
132void
133u_compute_distortion_ns_p2d(struct u_ns_p2d_values *values, int view, float u, float v, struct xrt_uv_triplet *result);
134
135/*
136 *
137 * Values for Moshi Turner's North Star distortion correction.
138 *
139 */
141{
142 int number_of_ipds;
143 float *ipds;
144 int num_grid_points_u;
145 int num_grid_points_v;
146 struct xrt_vec2 *grid[2];
147 struct xrt_fov fov[2]; // left, right
148 float ipd;
149};
150
151/*!
152 * Moshi Turner's North Star distortion correction implementation
153 *
154 * @ingroup aux_distortion
155 */
156void
158 struct u_ns_meshgrid_values *values, int view, float u, float v, struct xrt_uv_triplet *result);
159
160/*
161 *
162 * Windows Mixed Reality distortion
163 *
164 */
165
167{
168 struct xrt_vec2_i32 display_size;
169
170 /* X/Y center of the distortion (pixels) */
171 struct xrt_vec2 eye_center;
172
173 /* k1,k2,k3 params for radial distortion as
174 * per the radial distortion model in
175 * https://docs.opencv.org/4.x/d9/d0c/group__calib3d.html */
176 double k[3];
177};
178
180{
181 //! Inverse affine transform to move from (undistorted) pixels
182 //! to image plane / normalised image coordinates
184
185 //! tan(angle) FoV min/max for X and Y in the input texture
187 struct xrt_vec2 tex_y_range;
188
189 //! Hack values for WMR devices with weird distortions
190 int32_t y_offset;
191
192 struct u_poly_3k_distortion_values channels[3];
193};
194
195void
196u_compute_distortion_poly_3k(
197 struct u_poly_3k_eye_values *values, uint32_t view, float u, float v, struct xrt_uv_triplet *result);
198
199/*
200 * Compute the visible area bounds by calculating the X/Y limits of a
201 * crosshair through the distortion center, and back-project to the render FoV,
202 */
203void
204u_compute_distortion_bounds_poly_3k(const struct xrt_matrix_3x3 *inv_affine_xform,
205 struct u_poly_3k_distortion_values *values,
206 int view,
207 struct xrt_fov *out_fov,
208 struct xrt_vec2 *out_tex_x_range,
209 struct xrt_vec2 *out_tex_y_range);
210
211
212/*
213 *
214 * None distortion
215 *
216 */
217
218/*!
219 * Helper function for none distortion devices.
220 *
221 * @ingroup aux_distortion
222 */
224u_distortion_mesh_none(struct xrt_device *xdev, uint32_t view, float u, float v, struct xrt_uv_triplet *result);
225
226
227/*
228 *
229 * Mesh generation functions.
230 *
231 */
232
233/*!
234 * Given a @ref xrt_device generates meshes by calling
235 * xdev->compute_distortion(), populates `xdev->hmd_parts.distortion.mesh` &
236 * `xdev->hmd_parts.distortion.models`.
237 *
238 * @relatesalso xrt_device
239 * @ingroup aux_distortion
240 */
241void
243
244/*!
245 * Given a @ref xrt_device generates a no distortion mesh, populates
246 * `xdev->hmd_parts.distortion.mesh` & `xdev->hmd_parts.distortion.models`.
247 *
248 * @relatesalso xrt_device
249 * @ingroup aux_distortion
250 */
251void
253
254/*!
255 * Given a @ref xrt_device generates a no distortion mesh, also sets
256 * `xdev->compute_distortion()` and populates `xdev->hmd_parts.distortion.mesh`
257 * & `xdev->hmd_parts.distortion.models`.
258 *
259 * @relatesalso xrt_device
260 * @ingroup aux_distortion
261 */
262void
264
265
266#ifdef __cplusplus
267}
268#endif
void u_distortion_mesh_fill_in_none(struct xrt_device *xdev)
Given a xrt_device generates a no distortion mesh, populates xdev->hmd_parts.distortion....
Definition: u_distortion_mesh.c:560
void u_distortion_mesh_fill_in_compute(struct xrt_device *xdev)
Given a xrt_device generates meshes by calling xdev->compute_distortion(), populates xdev->hmd_parts....
Definition: u_distortion_mesh.c:598
void u_compute_distortion_cardboard(struct u_cardboard_distortion_values *values, float u, float v, struct xrt_uv_triplet *result)
Distortion correction implementation for the Cardboard devices.
Definition: u_distortion_mesh.c:235
void u_distortion_mesh_set_none(struct xrt_device *xdev)
Given a xrt_device generates a no distortion mesh, also sets xdev->compute_distortion() and populates...
Definition: u_distortion_mesh.c:574
void u_compute_distortion_ns_p2d(struct u_ns_p2d_values *values, int view, float u, float v, struct xrt_uv_triplet *result)
Distortion correction implementation for North Star 2D/Polynomial.
Definition: u_distortion_mesh.c:291
xrt_result_t u_distortion_mesh_none(struct xrt_device *xdev, uint32_t view, float u, float v, struct xrt_uv_triplet *result)
Helper function for none distortion devices.
Definition: u_distortion_mesh.c:548
void u_compute_distortion_vive(struct u_vive_values *values, float u, float v, struct xrt_uv_triplet *result)
Distortion correction implementation for the Vive, Vive Pro, Valve Index distortion values found in t...
Definition: u_distortion_mesh.c:129
void u_compute_distortion_ns_meshgrid(struct u_ns_meshgrid_values *values, int view, float u, float v, struct xrt_uv_triplet *result)
Moshi Turner's North Star distortion correction implementation.
Definition: u_distortion_mesh.c:329
void u_compute_distortion_panotools(struct u_panotools_values *values, float u, float v, struct xrt_uv_triplet *result)
Distortion correction implementation for Panotools distortion values.
Definition: u_distortion_mesh.c:198
enum xrt_result xrt_result_t
Result type used across Monado.
Values to create a distortion mesh from cardboard values.
Definition: u_distortion.h:72
Definition: u_distortion_mesh.h:141
Definition: u_distortion_mesh.h:118
Values to create a distortion mesh from panotools values.
Definition: u_distortion_mesh.h:36
struct xrt_vec2 viewport_size
Viewport size.
Definition: u_distortion_mesh.h:46
float scale
Panotools warp scale.
Definition: u_distortion_mesh.h:42
float distortion_k[5]
Panotools universal distortion k (reverse order from OpenHMD).
Definition: u_distortion_mesh.h:38
float aberration_k[3]
Panotools post distortion scale, <r, g, b>.
Definition: u_distortion_mesh.h:40
struct xrt_vec2 lens_center
Center of the lens.
Definition: u_distortion_mesh.h:44
Definition: u_distortion_mesh.h:167
Definition: u_distortion_mesh.h:180
int32_t y_offset
Hack values for WMR devices with weird distortions.
Definition: u_distortion_mesh.h:190
struct xrt_vec2 tex_x_range
tan(angle) FoV min/max for X and Y in the input texture
Definition: u_distortion_mesh.h:186
struct xrt_matrix_3x3 inv_affine_xform
Inverse affine transform to move from (undistorted) pixels to image plane / normalised image coordina...
Definition: u_distortion_mesh.h:183
Values to create a distortion mesh from Vive configuration values.
Definition: u_distortion_mesh.h:70
float coefficients[3][4]
r/g/b, a/b/c/d
Definition: u_distortion_mesh.h:80
struct xrt_vec2 center[3]
r/g/b
Definition: u_distortion_mesh.h:77
A single HMD or input device.
Definition: xrt_device.h:282
Describes a projection matrix fov.
Definition: xrt_defines.h:484
A tightly packed 3x3 matrix of floats.
Definition: xrt_defines.h:531
Represents a uv triplet for distortion, basically just three xrt_vec2.
Definition: xrt_defines.h:264
A 2 element vector with 32 bit integers.
Definition: xrt_defines.h:347
A 2 element vector with single floats.
Definition: xrt_defines.h:253
Code to handle distortion parameters and fov.
Common defines and enums for XRT.
Header defining an xrt display or controller device.