From 4dcbc68dec31c465826933bdb5a55a9fbc098d51 Mon Sep 17 00:00:00 2001 From: Korcan Hussein Date: Wed, 5 Nov 2025 15:41:44 +0000 Subject: [PATCH] d/android: support all cardboard vertical alignment modes Part-of: --- doc/changes/big/mr.2560.md | 3 +++ src/xrt/auxiliary/util/u_distortion.c | 17 ++++++++++++++--- src/xrt/auxiliary/util/u_distortion.h | 15 +++++++++++++++ src/xrt/drivers/android/android_sensors.c | 6 ++---- 4 files changed, 34 insertions(+), 7 deletions(-) diff --git a/doc/changes/big/mr.2560.md b/doc/changes/big/mr.2560.md index 5df8d9fe4..5066d1921 100644 --- a/doc/changes/big/mr.2560.md +++ b/doc/changes/big/mr.2560.md @@ -1,3 +1,6 @@ +--- +- mr.2614 +--- ### Added - New UI button to the Android About page for scanning cardboard calibration QR codes and saving them to device diff --git a/src/xrt/auxiliary/util/u_distortion.c b/src/xrt/auxiliary/util/u_distortion.c index 3d3164156..0c3f249ce 100644 --- a/src/xrt/auxiliary/util/u_distortion.c +++ b/src/xrt/auxiliary/util/u_distortion.c @@ -17,6 +17,18 @@ #include +static inline float +vertical_offset_meters(const struct u_cardboard_distortion_arguments *args) +{ + switch (args->vertical_alignment) { + case U_CARDBOARD_VERTICAL_ALIGNMENT_TOP: + return args->screen.h_meters - args->tray_to_lens_distance_meters - 0.003f; + case U_CARDBOARD_VERTICAL_ALIGNMENT_BOTTOM: return args->tray_to_lens_distance_meters - 0.003f; + case U_CARDBOARD_VERTICAL_ALIGNMENT_CENTER: + default: return args->screen.h_meters * 0.5f; + } +} + void u_distortion_cardboard_calculate(const struct u_cardboard_distortion_arguments *args, struct xrt_hmd_parts *parts, @@ -78,9 +90,8 @@ u_distortion_cardboard_calculate(const struct u_cardboard_distortion_arguments * args->screen_to_lens_distance_meters; } - // Cardboard vertical alignment bottom - values->screen.offset.y = - (args->tray_to_lens_distance_meters - 0.003f) / args->screen_to_lens_distance_meters; + // Cardboard vertical alignment + values->screen.offset.y = vertical_offset_meters(args) / args->screen_to_lens_distance_meters; // Tanangle to texture coordinates values->texture.size.x = tanf(-args->fov.angle_left) + tanf(args->fov.angle_right); diff --git a/src/xrt/auxiliary/util/u_distortion.h b/src/xrt/auxiliary/util/u_distortion.h index 18af969c0..7ed917c23 100644 --- a/src/xrt/auxiliary/util/u_distortion.h +++ b/src/xrt/auxiliary/util/u_distortion.h @@ -24,6 +24,18 @@ struct xrt_hmd_parts; * @ingroup aux_util */ +enum u_cardboard_vertical_alignment +{ + //! device rests against a fixed bottom tray + U_CARDBOARD_VERTICAL_ALIGNMENT_BOTTOM = 0, + + //! device screen assumed to be centered w.r.t. lenses + U_CARDBOARD_VERTICAL_ALIGNMENT_CENTER = 1, + + //! device rests against a fixed top tray + U_CARDBOARD_VERTICAL_ALIGNMENT_TOP = 2, +}; + /*! * These are the values that you need to supply to the distortion code to setup * a @ref u_cardboard_distortion properly. @@ -56,6 +68,9 @@ struct u_cardboard_distortion_arguments //! Fov values that the cardboard configuration has given us. struct xrt_fov fov; + + //! The vertical screen alignment + enum u_cardboard_vertical_alignment vertical_alignment; }; /*! diff --git a/src/xrt/drivers/android/android_sensors.c b/src/xrt/drivers/android/android_sensors.c index ec712bdd0..af30f2d36 100644 --- a/src/xrt/drivers/android/android_sensors.c +++ b/src/xrt/drivers/android/android_sensors.c @@ -120,10 +120,7 @@ load_cardboard_distortion(struct android_device *d, } if (params.has_vertical_alignment) { - if (params.vertical_alignment != cardboard_DeviceParams_VerticalAlignmentType_BOTTOM) { - ANDROID_ERROR(d, "Only vertical alignment bottom supported"); - return false; - } + args->vertical_alignment = (enum u_cardboard_vertical_alignment)params.vertical_alignment; } if (params.has_inter_lens_distance) { @@ -421,6 +418,7 @@ android_device_create(void) .angle_up = angle, .angle_down = -angle, }, + .vertical_alignment = U_CARDBOARD_VERTICAL_ALIGNMENT_BOTTOM, }; struct u_cardboard_distortion_arguments args = cardboard_v1_distortion_args; if (!load_cardboard_distortion(d, &metrics, &args)) { -- 2.51.2