···1515#include "util/u_device.h"
1616#include "util/u_distortion.h"
17171818+#include <assert.h>
18191920void
2021u_distortion_cardboard_calculate(const struct u_cardboard_distortion_arguments *args,
···2627 */
27282829 uint32_t view_count = parts->view_count;
3030+3131+ // Cardboard always has two views
3232+ assert(view_count == 2);
29333034 uint32_t w_pixels = args->screen.w_pixels / view_count;
3135 uint32_t h_pixels = args->screen.h_pixels;
···6165 values->distortion_k[2] = args->distortion_k[2];
6266 values->distortion_k[3] = args->distortion_k[3];
6367 values->distortion_k[4] = args->distortion_k[4];
6464- values->screen.size.x = args->screen.w_meters;
6565- values->screen.size.y = args->screen.h_meters;
6666- values->screen.offset.x =
6767- (args->screen.w_meters + pow(-1, i + 1) * args->inter_lens_distance_meters) / view_count;
6868- values->screen.offset.y = args->lens_y_center_on_screen_meters;
6969- // clang-format on
70687171- // Turn into tanangles
7272- values->screen.size.x /= args->screen_to_lens_distance_meters;
7373- values->screen.size.y /= args->screen_to_lens_distance_meters;
7474- values->screen.offset.x /= args->screen_to_lens_distance_meters;
7575- values->screen.offset.y /= args->screen_to_lens_distance_meters;
6969+ // Divide by view count since each view takes a part of the screen on the X axis
7070+ values->screen.size.x = args->screen.w_meters / args->screen_to_lens_distance_meters;
7171+ values->screen.size.y = args->screen.h_meters / args->screen_to_lens_distance_meters;
7272+7373+ if (i == 0) {
7474+ values->screen.offset.x = ((args->screen.w_meters - args->inter_lens_distance_meters) / 2) /
7575+ args->screen_to_lens_distance_meters;
7676+ } else if (i == 1) {
7777+ values->screen.offset.x = ((args->screen.w_meters + args->inter_lens_distance_meters) / 2) /
7878+ args->screen_to_lens_distance_meters;
7979+ }
8080+8181+ // Cardboard vertical alignment bottom
8282+ values->screen.offset.y =
8383+ (args->tray_to_lens_distance_meters - 0.003f) / args->screen_to_lens_distance_meters;
76847785 // Tanangle to texture coordinates
7886 values->texture.size.x = tanf(-args->fov.angle_left) + tanf(args->fov.angle_right);
+5-3
src/xrt/auxiliary/util/u_distortion.h
···4343 //! Distances between the lenses in meters.
4444 float inter_lens_distance_meters;
45454646- //! Where on the y axis the center of the lens is on the screen.
4747- float lens_y_center_on_screen_meters;
4848-4946 /*!
5047 * The distance to the lens from the screen, used to calculate calculate
5148 * tanangle of various distances on the screen.
5249 */
5350 float screen_to_lens_distance_meters;
5151+5252+ /*!
5353+ * The distance from the tray (the bottom of the screen) to the lens center on the Y axis.
5454+ */
5555+ float tray_to_lens_distance_meters;
54565557 //! Fov values that the cardboard configuration has given us.
5658 struct xrt_fov fov;