The open source OpenXR runtime
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

a/util: Device helpers and distortion handling for when the view count is equal to 1 or 2

+101 -53
+91 -52
src/xrt/auxiliary/util/u_device.c
··· 86 86 void 87 87 u_device_dump_config(struct xrt_device *xdev, const char *prefix, const char *prod) 88 88 { 89 - // clang-format off 90 89 U_LOG_RAW("%s - device_setup", prefix); 91 - PRINT_STR( "prod", prod); 90 + PRINT_STR("prod", prod); 92 91 if (xdev->hmd != NULL) { 93 - PRINT_INT( "screens[0].w_pixels ", xdev->hmd->screens[0].w_pixels); 94 - PRINT_INT( "screens[0].h_pixels ", xdev->hmd->screens[0].h_pixels); 95 - // PRINT_MM( "info.display.w_meters", info.display.w_meters); 96 - // PRINT_MM( "info.display.h_meters", info.display.h_meters); 97 - PRINT_INT( "views[0].viewport.x_pixels ", xdev->hmd->views[0].viewport.x_pixels); 98 - PRINT_INT( "views[0].viewport.y_pixels ", xdev->hmd->views[0].viewport.y_pixels); 99 - PRINT_INT( "views[0].viewport.w_pixels ", xdev->hmd->views[0].viewport.w_pixels); 100 - PRINT_INT( "views[0].viewport.h_pixels ", xdev->hmd->views[0].viewport.h_pixels); 101 - PRINT_INT( "views[0].display.w_pixels ", xdev->hmd->views[0].display.w_pixels); 102 - PRINT_INT( "views[0].display.h_pixels ", xdev->hmd->views[0].display.h_pixels); 103 - PRINT_MAT2X2("views[0].rot ", xdev->hmd->views[0].rot); 104 - PRINT_ANGLE( "distortion.fov[0].angle_left ", xdev->hmd->distortion.fov[0].angle_left); 105 - PRINT_ANGLE( "distortion.fov[0].angle_right", xdev->hmd->distortion.fov[0].angle_right); 106 - PRINT_ANGLE( "distortion.fov[0].angle_up ", xdev->hmd->distortion.fov[0].angle_up); 107 - PRINT_ANGLE( "distortion.fov[0].angle_down ", xdev->hmd->distortion.fov[0].angle_down); 108 - // PRINT_ANGLE( "distortion.fov[0] ", xdev->hmd->distortion.fov[0]); 109 - PRINT_INT( "views[1].viewport.x_pixels ", xdev->hmd->views[1].viewport.x_pixels); 110 - PRINT_INT( "views[1].viewport.y_pixels ", xdev->hmd->views[1].viewport.y_pixels); 111 - PRINT_INT( "views[1].viewport.w_pixels ", xdev->hmd->views[1].viewport.w_pixels); 112 - PRINT_INT( "views[1].viewport.h_pixels ", xdev->hmd->views[1].viewport.h_pixels); 113 - PRINT_INT( "views[1].display.w_pixels ", xdev->hmd->views[1].display.w_pixels); 114 - PRINT_INT( "views[1].display.h_pixels ", xdev->hmd->views[1].display.h_pixels); 115 - PRINT_MAT2X2("views[1].rot ", xdev->hmd->views[1].rot); 116 - PRINT_ANGLE( "distortion.fov[1].angle_left ", xdev->hmd->distortion.fov[1].angle_left); 117 - PRINT_ANGLE( "distortion.fov[1].angle_right", xdev->hmd->distortion.fov[1].angle_right); 118 - PRINT_ANGLE( "distortion.fov[1].angle_up ", xdev->hmd->distortion.fov[1].angle_up); 119 - PRINT_ANGLE( "distortion.fov[1].angle_down ", xdev->hmd->distortion.fov[1].angle_down); 120 - // PRINT_ANGLE( "distortion.fov[1] ", xdev->hmd->distortion.fov[1]); 92 + PRINT_INT("screens[0].w_pixels ", xdev->hmd->screens[0].w_pixels); 93 + PRINT_INT("screens[0].h_pixels ", xdev->hmd->screens[0].h_pixels); 94 + // PRINT_MM( "info.display.w_meters", info.display.w_meters); 95 + // PRINT_MM( "info.display.h_meters", info.display.h_meters); 96 + 97 + uint32_t view_count = xdev->hmd->view_count; 98 + PRINT_INT("view_count", view_count); 99 + for (uint32_t i = 0; i < view_count; ++i) { 100 + struct xrt_view *view = &xdev->hmd->views[i]; 101 + struct xrt_fov *fov = &xdev->hmd->distortion.fov[i]; 102 + U_LOG_RAW("\tview index = %u", i); 103 + U_LOG_RAW("\tviews[%d].viewport.x_pixels = %u", i, view->viewport.x_pixels); 104 + U_LOG_RAW("\tviews[%d].viewport.y_pixels = %u", i, view->viewport.y_pixels); 105 + U_LOG_RAW("\tviews[%d].viewport.w_pixels = %u", i, view->viewport.w_pixels); 106 + U_LOG_RAW("\tviews[%d].viewport.h_pixels = %u", i, view->viewport.h_pixels); 107 + U_LOG_RAW("\tviews[%d].display.w_pixels = %u", i, view->display.w_pixels); 108 + U_LOG_RAW("\tviews[%d].display.h_pixels = %u", i, view->display.h_pixels); 109 + U_LOG_RAW("\tviews[%d].rot = {%f, %f} {%f, %f}", i, view->rot.v[0], view->rot.v[1], 110 + view->rot.v[2], view->rot.v[3]); 111 + U_LOG_RAW("\tdistortion.fov[%d].angle_left = %f (%i°)", i, fov->angle_left, 112 + (int32_t)(fov->angle_left * (180 / M_PI))); 113 + U_LOG_RAW("\tdistortion.fov[%d].angle_right = %f (%i°)", i, fov->angle_right, 114 + (int32_t)(fov->angle_right * (180 / M_PI))); 115 + U_LOG_RAW("\tdistortion.fov[%d].angle_up = %f (%i°)", i, fov->angle_up, 116 + (int32_t)(fov->angle_up * (180 / M_PI))); 117 + U_LOG_RAW("\tdistortion.fov[%d].angle_down = %f (%i°)", i, fov->angle_down, 118 + (int32_t)(fov->angle_down * (180 / M_PI))); 119 + } 121 120 } 122 - // clang-format on 123 121 } 124 122 125 123 ··· 159 157 } 160 158 161 159 bool 160 + u_device_setup_one_eye(struct xrt_device *xdev, const struct u_device_simple_info *info) 161 + { 162 + uint32_t w_pixels = info->display.w_pixels; 163 + uint32_t h_pixels = info->display.h_pixels; 164 + float w_meters = info->display.w_meters; 165 + float h_meters = info->display.h_meters; 166 + 167 + float lens_center_x_meters = w_meters / 2.0; 168 + 169 + float lens_center_y_meters = info->lens_vertical_position_meters; 170 + 171 + // Common 172 + size_t idx = 0; 173 + xdev->hmd->blend_modes[idx++] = XRT_BLEND_MODE_OPAQUE; 174 + xdev->hmd->blend_mode_count = idx; 175 + 176 + if (xdev->hmd->distortion.models == 0) { 177 + xdev->hmd->distortion.models = XRT_DISTORTION_MODEL_NONE; 178 + xdev->hmd->distortion.preferred = XRT_DISTORTION_MODEL_NONE; 179 + } 180 + xdev->hmd->screens[0].w_pixels = info->display.w_pixels; 181 + xdev->hmd->screens[0].h_pixels = info->display.h_pixels; 182 + 183 + // Left 184 + xdev->hmd->views[0].display.w_pixels = w_pixels; 185 + xdev->hmd->views[0].display.h_pixels = h_pixels; 186 + xdev->hmd->views[0].viewport.x_pixels = 0; 187 + xdev->hmd->views[0].viewport.y_pixels = 0; 188 + xdev->hmd->views[0].viewport.w_pixels = w_pixels; 189 + xdev->hmd->views[0].viewport.h_pixels = h_pixels; 190 + xdev->hmd->views[0].rot = u_device_rotation_ident; 191 + 192 + { 193 + /* left eye */ 194 + if (!math_compute_fovs(w_meters, lens_center_x_meters, info->fov[0], h_meters, lens_center_y_meters, 0, 195 + &xdev->hmd->distortion.fov[0])) { 196 + return false; 197 + } 198 + } 199 + 200 + return true; 201 + } 202 + 203 + bool 162 204 u_device_setup_split_side_by_side(struct xrt_device *xdev, const struct u_device_simple_info *info) 163 205 { 164 - uint32_t w_pixels = info->display.w_pixels / 2; 206 + 207 + uint32_t view_count = xdev->hmd->view_count; 208 + 209 + uint32_t w_pixels = info->display.w_pixels / view_count; 165 210 uint32_t h_pixels = info->display.h_pixels; 166 - float w_meters = info->display.w_meters / 2; 211 + float w_meters = info->display.w_meters / view_count; 167 212 float h_meters = info->display.h_meters; 168 213 169 214 float lens_center_x_meters[2] = { ··· 189 234 xdev->hmd->screens[0].h_pixels = info->display.h_pixels; 190 235 191 236 // Left 192 - xdev->hmd->views[0].display.w_pixels = w_pixels; 193 - xdev->hmd->views[0].display.h_pixels = h_pixels; 194 - xdev->hmd->views[0].viewport.x_pixels = 0; 195 - xdev->hmd->views[0].viewport.y_pixels = 0; 196 - xdev->hmd->views[0].viewport.w_pixels = w_pixels; 197 - xdev->hmd->views[0].viewport.h_pixels = h_pixels; 198 - xdev->hmd->views[0].rot = u_device_rotation_ident; 199 - 200 - // Right 201 - xdev->hmd->views[1].display.w_pixels = w_pixels; 202 - xdev->hmd->views[1].display.h_pixels = h_pixels; 203 - xdev->hmd->views[1].viewport.x_pixels = w_pixels; 204 - xdev->hmd->views[1].viewport.y_pixels = 0; 205 - xdev->hmd->views[1].viewport.w_pixels = w_pixels; 206 - xdev->hmd->views[1].viewport.h_pixels = h_pixels; 207 - xdev->hmd->views[1].rot = u_device_rotation_ident; 237 + for (uint32_t i = 0; i < view_count; ++i) { 238 + xdev->hmd->views[i].display.w_pixels = w_pixels; 239 + xdev->hmd->views[i].display.h_pixels = h_pixels; 240 + xdev->hmd->views[i].viewport.x_pixels = w_pixels * i; 241 + xdev->hmd->views[i].viewport.y_pixels = 0; 242 + xdev->hmd->views[i].viewport.w_pixels = w_pixels; 243 + xdev->hmd->views[i].viewport.h_pixels = h_pixels; 244 + xdev->hmd->views[i].rot = u_device_rotation_ident; 245 + } 208 246 209 247 { 210 248 /* right eye */ 211 - if (!math_compute_fovs(w_meters, lens_center_x_meters[1], info->fov[1], h_meters, 212 - lens_center_y_meters[1], 0, &xdev->hmd->distortion.fov[1])) { 249 + if (!math_compute_fovs(w_meters, lens_center_x_meters[view_count - 1], info->fov[view_count - 1], 250 + h_meters, lens_center_y_meters[view_count - 1], 0, 251 + &xdev->hmd->distortion.fov[view_count - 1])) { 213 252 return false; 214 253 } 215 254 } 216 - { 255 + if (view_count == 2) { 217 256 /* left eye - mirroring right eye */ 218 257 xdev->hmd->distortion.fov[0].angle_up = xdev->hmd->distortion.fov[1].angle_up; 219 258 xdev->hmd->distortion.fov[0].angle_down = xdev->hmd->distortion.fov[1].angle_down;
+10 -1
src/xrt/auxiliary/util/u_device.h
··· 63 63 float lens_horizontal_separation_meters; 64 64 float lens_vertical_position_meters; 65 65 66 - float fov[2]; 66 + float fov[XRT_MAX_VIEWS]; 67 67 }; 68 + 69 + /*! 70 + * Setup the device information given a very simple info struct. 71 + * 72 + * @return true on success. 73 + * @ingroup aux_util 74 + */ 75 + bool 76 + u_device_setup_one_eye(struct xrt_device *xdev, const struct u_device_simple_info *info); 68 77 69 78 /*! 70 79 * Setup the device information given a very simple info struct.