2020-10-25 01:12:11 +00:00
|
|
|
// Copyright 2020, Collabora, Ltd.
|
|
|
|
// SPDX-License-Identifier: BSL-1.0
|
|
|
|
/*!
|
|
|
|
* @file
|
|
|
|
* @brief Code to handle distortion parameters and fov.
|
|
|
|
* @author Jakob Bornecrantz <jakob@collabora.com>
|
|
|
|
* @ingroup aux_distortion
|
|
|
|
*/
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "xrt/xrt_defines.h"
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
struct xrt_hmd_parts;
|
|
|
|
|
|
|
|
/*!
|
2022-05-18 15:31:57 +00:00
|
|
|
* @defgroup aux_distortion Distortion utilities
|
2020-10-25 01:12:11 +00:00
|
|
|
* @ingroup aux_util
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* These are the values that you need to supply to the distortion code to setup
|
|
|
|
* a @ref u_cardboard_distortion properly.
|
|
|
|
*
|
|
|
|
* @ingroup aux_distortion
|
|
|
|
*/
|
|
|
|
struct u_cardboard_distortion_arguments
|
|
|
|
{
|
|
|
|
float distortion_k[5];
|
|
|
|
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
uint32_t w_pixels, h_pixels;
|
|
|
|
float w_meters, h_meters;
|
|
|
|
} screen;
|
|
|
|
|
|
|
|
//! Distances between the lenses in meters.
|
|
|
|
float inter_lens_distance_meters;
|
|
|
|
|
|
|
|
//! Where on the y axis the center of the lens is on the screen.
|
|
|
|
float lens_y_center_on_screen_meters;
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* The distance to the lens from the screen, used to calculate calculate
|
|
|
|
* tanangle of various distances on the screen.
|
|
|
|
*/
|
|
|
|
float screen_to_lens_distance_meters;
|
|
|
|
|
|
|
|
//! Fov values that the cardboard configuration has given us.
|
|
|
|
struct xrt_fov fov;
|
|
|
|
};
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* Values to create a distortion mesh from cardboard values.
|
|
|
|
*
|
|
|
|
* This matches the formula in the cardboard SDK, while the array is fixed size
|
2022-05-17 20:28:47 +00:00
|
|
|
* setting the K value to zero will make it not have a effect.
|
2020-10-25 01:12:11 +00:00
|
|
|
*
|
|
|
|
* p' = p (1 + K0 r^2 + K1 r^4 + ... + Kn r^(2n))
|
|
|
|
*
|
|
|
|
* @ingroup aux_distortion
|
|
|
|
*/
|
|
|
|
struct u_cardboard_distortion_values
|
|
|
|
{
|
|
|
|
//! Cardboard distortion k values.
|
|
|
|
float distortion_k[5];
|
|
|
|
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
//! Used to transform to and from tanangle space.
|
|
|
|
struct xrt_vec2 size;
|
|
|
|
//! Used to transform to and from tanangle space.
|
|
|
|
struct xrt_vec2 offset;
|
|
|
|
} screen, texture;
|
|
|
|
};
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* Both given and derived values needed for cardboard distortion.
|
|
|
|
*
|
|
|
|
* @ingroup aux_distortion
|
|
|
|
*/
|
|
|
|
struct u_cardboard_distortion
|
|
|
|
{
|
|
|
|
//! Arguments this distortion was created from.
|
|
|
|
struct u_cardboard_distortion_arguments args;
|
|
|
|
|
|
|
|
//! Distortion parameters, some derived from @ref args.
|
|
|
|
struct u_cardboard_distortion_values values[2];
|
|
|
|
};
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* Take cardboard arguments to turn them into a @ref u_cardboard_distortion and
|
|
|
|
* fill out a @ref xrt_hmd_parts struct.
|
|
|
|
*
|
|
|
|
* @ingroup aux_distortion
|
|
|
|
*/
|
|
|
|
void
|
2021-01-14 14:13:48 +00:00
|
|
|
u_distortion_cardboard_calculate(const struct u_cardboard_distortion_arguments *args,
|
|
|
|
struct xrt_hmd_parts *parts,
|
|
|
|
struct u_cardboard_distortion *out_dist);
|
2020-10-25 01:12:11 +00:00
|
|
|
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|