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 *
163 * None distortion
164 *
165 */
166
167/*!
168 * Helper function for none distortion devices.
169 *
170 * @ingroup aux_distortion
171 */
173u_distortion_mesh_none(struct xrt_device *xdev, uint32_t view, float u, float v, struct xrt_uv_triplet *result);
174
175
176/*
177 *
178 * Mesh generation functions.
179 *
180 */
181
182/*!
183 * Given a @ref xrt_device generates meshes by calling
184 * xdev->compute_distortion(), populates `xdev->hmd_parts.distortion.mesh` &
185 * `xdev->hmd_parts.distortion.models`.
186 *
187 * @relatesalso xrt_device
188 * @ingroup aux_distortion
189 */
190void
192
193/*!
194 * Given a @ref xrt_device generates a no distortion mesh, populates
195 * `xdev->hmd_parts.distortion.mesh` & `xdev->hmd_parts.distortion.models`.
196 *
197 * @relatesalso xrt_device
198 * @ingroup aux_distortion
199 */
200void
202
203/*!
204 * Given a @ref xrt_device generates a no distortion mesh, also sets
205 * `xdev->compute_distortion()` and populates `xdev->hmd_parts.distortion.mesh`
206 * & `xdev->hmd_parts.distortion.models`.
207 *
208 * @relatesalso xrt_device
209 * @ingroup aux_distortion
210 */
211void
213
214
215#ifdef __cplusplus
216}
217#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:421
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:459
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:435
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:409
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
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
Represents a uv triplet for distortion, basically just three xrt_vec2.
Definition: xrt_defines.h:264
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.