The open source OpenXR runtime
0
fork

Configure Feed

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

a/util: Make distortion utils compatible with view count equal to 1.

+57 -110
+41 -96
src/xrt/auxiliary/util/u_distortion.c
··· 25 25 * HMD parts 26 26 */ 27 27 28 - uint32_t w_pixels = args->screen.w_pixels / 2; 28 + uint32_t view_count = parts->view_count; 29 + 30 + uint32_t w_pixels = args->screen.w_pixels / view_count; 29 31 uint32_t h_pixels = args->screen.h_pixels; 30 32 31 33 // Base assumption, the driver can change afterwards. ··· 39 41 parts->screens[0].w_pixels = args->screen.w_pixels; 40 42 parts->screens[0].h_pixels = args->screen.h_pixels; 41 43 42 - parts->views[0].viewport.x_pixels = 0; 43 - parts->views[0].viewport.y_pixels = 0; 44 - parts->views[0].viewport.w_pixels = w_pixels; 45 - parts->views[0].viewport.h_pixels = h_pixels; 46 - parts->views[0].display.w_pixels = w_pixels; 47 - parts->views[0].display.h_pixels = h_pixels; 48 - parts->views[0].rot = u_device_rotation_ident; 49 - parts->distortion.fov[0] = args->fov; 44 + // Copy the arguments. 45 + out_dist->args = *args; 50 46 51 - parts->views[1].viewport.x_pixels = w_pixels; 52 - parts->views[1].viewport.y_pixels = 0; 53 - parts->views[1].viewport.w_pixels = w_pixels; 54 - parts->views[1].viewport.h_pixels = h_pixels; 55 - parts->views[1].display.w_pixels = w_pixels; 56 - parts->views[1].display.h_pixels = h_pixels; 57 - parts->views[1].rot = u_device_rotation_ident; 58 - parts->distortion.fov[1] = args->fov; 47 + // Save the results. 48 + for (uint32_t i = 0; i < view_count; ++i) { 49 + parts->views[i].viewport.x_pixels = 0 + i * w_pixels; 50 + parts->views[i].viewport.y_pixels = 0; 51 + parts->views[i].viewport.w_pixels = w_pixels; 52 + parts->views[i].viewport.h_pixels = h_pixels; 53 + parts->views[i].display.w_pixels = w_pixels; 54 + parts->views[i].display.h_pixels = h_pixels; 55 + parts->views[i].rot = u_device_rotation_ident; 56 + parts->distortion.fov[i] = args->fov; 59 57 58 + struct u_cardboard_distortion_values *values = &out_dist->values[i]; 59 + values->distortion_k[0] = args->distortion_k[0]; 60 + values->distortion_k[1] = args->distortion_k[1]; 61 + values->distortion_k[2] = args->distortion_k[2]; 62 + values->distortion_k[3] = args->distortion_k[3]; 63 + values->distortion_k[4] = args->distortion_k[4]; 64 + values->screen.size.x = args->screen.w_meters; 65 + values->screen.size.y = args->screen.h_meters; 66 + values->screen.offset.x = 67 + (args->screen.w_meters + pow(-1, i + 1) * args->inter_lens_distance_meters) / view_count; 68 + values->screen.offset.y = args->lens_y_center_on_screen_meters; 69 + // clang-format on 60 70 61 - /* 62 - * Left values 63 - */ 71 + // Turn into tanangles 72 + values->screen.size.x /= args->screen_to_lens_distance_meters; 73 + values->screen.size.y /= args->screen_to_lens_distance_meters; 74 + values->screen.offset.x /= args->screen_to_lens_distance_meters; 75 + values->screen.offset.y /= args->screen_to_lens_distance_meters; 64 76 65 - // clang-format off 66 - struct u_cardboard_distortion_values l_values = {0}; 67 - l_values.distortion_k[0] = args->distortion_k[0]; 68 - l_values.distortion_k[1] = args->distortion_k[1]; 69 - l_values.distortion_k[2] = args->distortion_k[2]; 70 - l_values.distortion_k[3] = args->distortion_k[3]; 71 - l_values.distortion_k[4] = args->distortion_k[4]; 72 - l_values.screen.size.x = args->screen.w_meters; 73 - l_values.screen.size.y = args->screen.h_meters; 74 - l_values.screen.offset.x = (args->screen.w_meters - args->inter_lens_distance_meters) / 2.0f; 75 - l_values.screen.offset.y = args->lens_y_center_on_screen_meters; 76 - // clang-format on 77 + // Tanangle to texture coordinates 78 + values->texture.size.x = tanf(-args->fov.angle_left) + tanf(args->fov.angle_right); 79 + values->texture.size.y = tanf(args->fov.angle_up) + tanf(-args->fov.angle_down); 80 + values->texture.offset.x = tanf(-args->fov.angle_left); 81 + values->texture.offset.y = tanf(-args->fov.angle_down); 77 82 78 - // Turn into tanangles 79 - l_values.screen.size.x /= args->screen_to_lens_distance_meters; 80 - l_values.screen.size.y /= args->screen_to_lens_distance_meters; 81 - l_values.screen.offset.x /= args->screen_to_lens_distance_meters; 82 - l_values.screen.offset.y /= args->screen_to_lens_distance_meters; 83 - 84 - // Tan-angle to texture coordinates 85 - // clang-format off 86 - l_values.texture.size.x = tanf(-args->fov.angle_left) + tanf(args->fov.angle_right); 87 - l_values.texture.size.y = tanf(args->fov.angle_up) + tanf(-args->fov.angle_down); 88 - l_values.texture.offset.x = tanf(-args->fov.angle_left); 89 - l_values.texture.offset.y = tanf(-args->fov.angle_down); 90 - // clang-format on 91 - 92 - // Fix up views not covering the entire screen. 93 - l_values.screen.size.x /= 2.0; 94 - 95 - 96 - /* 97 - * Right values 98 - */ 99 - 100 - // clang-format off 101 - struct u_cardboard_distortion_values r_values = {0}; 102 - r_values.distortion_k[0] = args->distortion_k[0]; 103 - r_values.distortion_k[1] = args->distortion_k[1]; 104 - r_values.distortion_k[2] = args->distortion_k[2]; 105 - r_values.distortion_k[3] = args->distortion_k[3]; 106 - r_values.distortion_k[4] = args->distortion_k[4]; 107 - r_values.screen.size.x = args->screen.w_meters; 108 - r_values.screen.size.y = args->screen.h_meters; 109 - r_values.screen.offset.x = (args->screen.w_meters + args->inter_lens_distance_meters) / 2.0f; 110 - r_values.screen.offset.y = args->lens_y_center_on_screen_meters; 111 - // clang-format on 112 - 113 - // Turn into tanangles 114 - r_values.screen.size.x /= args->screen_to_lens_distance_meters; 115 - r_values.screen.size.y /= args->screen_to_lens_distance_meters; 116 - r_values.screen.offset.x /= args->screen_to_lens_distance_meters; 117 - r_values.screen.offset.y /= args->screen_to_lens_distance_meters; 118 - 119 - // Tanangle to texture coordinates 120 - // clang-format off 121 - r_values.texture.size.x = tanf(-args->fov.angle_left) + tanf(args->fov.angle_right); 122 - r_values.texture.size.y = tanf(args->fov.angle_up) + tanf(-args->fov.angle_down); 123 - r_values.texture.offset.x = tanf(-args->fov.angle_left); 124 - r_values.texture.offset.y = tanf(-args->fov.angle_down); 125 - // clang-format on 126 - 127 - // Fix up views not covering the entire screen. 128 - r_values.screen.size.x /= 2.0; 129 - r_values.screen.offset.x -= r_values.screen.size.x; 130 - 131 - 132 - /* 133 - * Write results. 134 - */ 135 - 136 - // Copy the arguments. 137 - out_dist->args = *args; 138 - 139 - // Save the results. 140 - out_dist->values[0] = l_values; 141 - out_dist->values[1] = r_values; 83 + // Fix up views not covering the entire screen. 84 + values->screen.size.x /= view_count; 85 + values->screen.offset.x -= values->screen.size.x * i; 86 + } 142 87 }
+1 -1
src/xrt/auxiliary/util/u_distortion.h
··· 91 91 struct u_cardboard_distortion_arguments args; 92 92 93 93 //! Distortion parameters, some derived from @ref args. 94 - struct u_cardboard_distortion_values values[2]; 94 + struct u_cardboard_distortion_values values[XRT_MAX_VIEWS]; 95 95 }; 96 96 97 97 /*!
+15 -13
src/xrt/auxiliary/util/u_distortion_mesh.c
··· 17 17 #include "math/m_vec2.h" 18 18 #include "math/m_api.h" 19 19 20 + #include <stdint.h> 20 21 #include <stdio.h> 21 22 #include <assert.h> 22 23 ··· 33 34 } 34 35 35 36 static void 36 - run_func(struct xrt_device *xdev, func_calc calc, int view_count, struct xrt_hmd_parts *target, uint32_t num) 37 + run_func(struct xrt_device *xdev, func_calc calc, struct xrt_hmd_parts *target, uint32_t num) 37 38 { 38 39 assert(calc != NULL); 39 - assert(view_count == 2); 40 - assert(view_count <= 2); 41 40 42 - uint32_t vertex_offsets[2] = {0}; 43 - uint32_t index_offsets[2] = {0}; 41 + uint32_t view_count = target->view_count; 42 + 43 + uint32_t vertex_offsets[XRT_MAX_VIEWS] = {0}; 44 + uint32_t index_offsets[XRT_MAX_VIEWS] = {0}; 44 45 45 46 uint32_t cells_cols = num; 46 47 uint32_t cells_rows = num; ··· 58 59 59 60 // Setup the vertices for all views. 60 61 uint32_t i = 0; 61 - for (int view = 0; view < view_count; view++) { 62 + for (uint32_t view = 0; view < view_count; view++) { 62 63 vertex_offsets[view] = i / stride_in_floats; 63 64 64 65 for (uint32_t r = 0; r < vert_rows; r++) { ··· 90 91 91 92 // Set up indices for all views. 92 93 i = 0; 93 - for (int view = 0; view < view_count; view++) { 94 + for (uint32_t view = 0; view < view_count; view++) { 94 95 index_offsets[view] = i; 95 96 96 97 uint32_t off = vertex_offsets[view]; ··· 116 117 target->distortion.mesh.vertex_count = vertex_count; 117 118 target->distortion.mesh.uv_channels_count = uv_channels_count; 118 119 target->distortion.mesh.indices = indices; 119 - target->distortion.mesh.index_counts[0] = index_count_per_view; 120 - target->distortion.mesh.index_counts[1] = index_count_per_view; 121 - target->distortion.mesh.index_offsets[0] = index_offsets[0]; 122 - target->distortion.mesh.index_offsets[1] = index_offsets[1]; 123 120 target->distortion.mesh.index_count_total = index_count_total; 121 + for (uint32_t view = 0; view < view_count; ++view) { 122 + target->distortion.mesh.index_counts[view] = index_count_per_view; 123 + target->distortion.mesh.index_offsets[view] = index_offsets[view]; 124 + } 124 125 } 125 126 126 127 bool ··· 437 438 struct xrt_hmd_parts *target = xdev->hmd; 438 439 439 440 // Do the generation. 440 - run_func(xdev, u_distortion_mesh_none, 2, target, 1); 441 + run_func(xdev, u_distortion_mesh_none, target, 1); 441 442 442 443 // Make the target mostly usable. 443 444 target->distortion.models |= XRT_DISTORTION_MODEL_NONE; ··· 481 482 struct xrt_hmd_parts *target = xdev->hmd; 482 483 483 484 uint32_t num = (uint32_t)debug_get_num_option_mesh_size(); 484 - run_func(xdev, calc, 2, target, num); 485 + 486 + run_func(xdev, calc, target, num); 485 487 }