diff options
author | Peter Kim <pk15950@gmail.com> | 2021-10-03 06:11:10 +0300 |
---|---|---|
committer | Peter Kim <pk15950@gmail.com> | 2021-10-03 06:11:10 +0300 |
commit | c4f65fa5da4c1f3498316da3eac7c0b43b218fd6 (patch) | |
tree | 64f495148d4fce5c22e252130a7a909e3a5c7890 /source/blender | |
parent | dda9762a16d65a7cfb9744a3530d2cdcbcb429f0 (diff) |
Cleanup
- Use doxygen style comments
- Improve comment for XR region type
- Improve RNA descriptions for XR nav location/rotation/scale
- Split controller draw callback into separate model and aim functions
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/makesdna/DNA_screen_types.h | 3 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_xr.c | 14 | ||||
-rw-r--r-- | source/blender/windowmanager/xr/intern/wm_xr_draw.c | 270 |
3 files changed, 149 insertions, 138 deletions
diff --git a/source/blender/makesdna/DNA_screen_types.h b/source/blender/makesdna/DNA_screen_types.h index ce5b93088b6..42dd6d2181b 100644 --- a/source/blender/makesdna/DNA_screen_types.h +++ b/source/blender/makesdna/DNA_screen_types.h @@ -666,7 +666,8 @@ typedef enum eRegionType { RGN_TYPE_EXECUTE = 10, RGN_TYPE_FOOTER = 11, RGN_TYPE_TOOL_HEADER = 12, - /* Region representing an XR headset's display (internally, corresponds to an XR surface). */ + /* Region type used exclusively by internal code and add-ons to register draw callbacks to the XR + context (surface, mirror view). Does not represent any real region. */ RGN_TYPE_XR = 13, #define RGN_TYPE_LEN (RGN_TYPE_XR + 1) diff --git a/source/blender/makesrna/intern/rna_xr.c b/source/blender/makesrna/intern/rna_xr.c index d1ff031f1e6..f64b6c5daca 100644 --- a/source/blender/makesrna/intern/rna_xr.c +++ b/source/blender/makesrna/intern/rna_xr.c @@ -2261,18 +2261,26 @@ static void rna_def_xr_session_state(BlenderRNA *brna) RNA_def_property_array(prop, 3); RNA_def_property_float_funcs( prop, "rna_XrSessionState_nav_location_get", "rna_XrSessionState_nav_location_set", NULL); - RNA_def_property_ui_text(prop, "Navigation Location", "VR navigation location in world space"); + RNA_def_property_ui_text( + prop, + "Navigation Location", + "Location offset to apply to base pose when determining viewer location"); prop = RNA_def_property(srna, "navigation_rotation", PROP_FLOAT, PROP_QUATERNION); RNA_def_property_array(prop, 4); RNA_def_property_float_funcs( prop, "rna_XrSessionState_nav_rotation_get", "rna_XrSessionState_nav_rotation_set", NULL); - RNA_def_property_ui_text(prop, "Navigation Rotation", "VR navigation rotation in world space"); + RNA_def_property_ui_text( + prop, + "Navigation Rotation", + "Rotation offset to apply to base pose when determining viewer rotation"); prop = RNA_def_property(srna, "navigation_scale", PROP_FLOAT, PROP_NONE); RNA_def_property_float_funcs( prop, "rna_XrSessionState_nav_scale_get", "rna_XrSessionState_nav_scale_set", NULL); - RNA_def_property_ui_text(prop, "Navigation Scale", "VR navigation scale in world space"); + RNA_def_property_ui_text(prop, + "Navigation Scale", + "Scale multiplier to apply to base pose when determining viewer scale"); } /** \} */ diff --git a/source/blender/windowmanager/xr/intern/wm_xr_draw.c b/source/blender/windowmanager/xr/intern/wm_xr_draw.c index bbbf7a16c9f..3287e29cdcf 100644 --- a/source/blender/windowmanager/xr/intern/wm_xr_draw.c +++ b/source/blender/windowmanager/xr/intern/wm_xr_draw.c @@ -244,162 +244,164 @@ static GPUBatch *wm_xr_controller_model_batch_create(GHOST_XrContextHandle xr_co return GPU_batch_create_ex(GPU_PRIM_TRIS, vbo, ibo, GPU_BATCH_OWNS_VBO | GPU_BATCH_OWNS_INDEX); } -void wm_xr_draw_controllers(const bContext *UNUSED(C), ARegion *UNUSED(region), void *customdata) +static void wm_xr_controller_model_draw(const XrSessionSettings *settings, + GHOST_XrContextHandle xr_context, + wmXrSessionState *state) { - const wmXrData *xr = customdata; - const XrSessionSettings *settings = &xr->session_settings; - wmXrSessionState *state = &xr->runtime->session_state; - - /* Model. */ - { - GHOST_XrContextHandle xr_context = xr->runtime->context; - GHOST_XrControllerModelData model_data; - float color[4]; - - switch (settings->controller_draw_style) { - case XR_CONTROLLER_DRAW_DARK: - case XR_CONTROLLER_DRAW_DARK_RAY: - color[0] = color[1] = color[2] = 0.0f, color[3] = 0.4f; - break; - case XR_CONTROLLER_DRAW_LIGHT: - case XR_CONTROLLER_DRAW_LIGHT_RAY: - color[0] = 0.422f, color[1] = 0.438f, color[2] = 0.446f, color[3] = 0.4f; - break; - } - - GPU_depth_test(GPU_DEPTH_NONE); - GPU_blend(GPU_BLEND_ALPHA); + GHOST_XrControllerModelData model_data; - LISTBASE_FOREACH (wmXrController *, controller, &state->controllers) { - GPUBatch *model = controller->model; - if (!model) { - model = controller->model = wm_xr_controller_model_batch_create( - xr_context, controller->subaction_path); - } + float color[4]; + switch (settings->controller_draw_style) { + case XR_CONTROLLER_DRAW_DARK: + case XR_CONTROLLER_DRAW_DARK_RAY: + color[0] = color[1] = color[2] = 0.0f, color[3] = 0.4f; + break; + case XR_CONTROLLER_DRAW_LIGHT: + case XR_CONTROLLER_DRAW_LIGHT_RAY: + color[0] = 0.422f, color[1] = 0.438f, color[2] = 0.446f, color[3] = 0.4f; + break; + } - if (model && - GHOST_XrGetControllerModelData(xr_context, controller->subaction_path, &model_data) && - model_data.count_components > 0) { - GPU_batch_program_set_builtin(model, GPU_SHADER_3D_UNIFORM_COLOR); - GPU_batch_uniform_4fv(model, "color", color); + GPU_depth_test(GPU_DEPTH_NONE); + GPU_blend(GPU_BLEND_ALPHA); - GPU_matrix_push(); - GPU_matrix_mul(controller->grip_mat); - for (unsigned int component_idx = 0; component_idx < model_data.count_components; - ++component_idx) { - const GHOST_XrControllerModelComponent *component = - &model_data.components[component_idx]; - GPU_matrix_push(); - GPU_matrix_mul(component->transform); - GPU_batch_draw_range(model, - model->elem ? component->index_offset : component->vertex_offset, - model->elem ? component->index_count : component->vertex_count); - GPU_matrix_pop(); - } - GPU_matrix_pop(); - } - else { - /* Fallback. */ - const float scale = 0.05f; - GPUBatch *sphere = GPU_batch_preset_sphere(2); - GPU_batch_program_set_builtin(sphere, GPU_SHADER_3D_UNIFORM_COLOR); - GPU_batch_uniform_4fv(sphere, "color", color); + LISTBASE_FOREACH (wmXrController *, controller, &state->controllers) { + GPUBatch *model = controller->model; + if (!model) { + model = controller->model = wm_xr_controller_model_batch_create(xr_context, + controller->subaction_path); + } + if (model && + GHOST_XrGetControllerModelData(xr_context, controller->subaction_path, &model_data) && + model_data.count_components > 0) { + GPU_batch_program_set_builtin(model, GPU_SHADER_3D_UNIFORM_COLOR); + GPU_batch_uniform_4fv(model, "color", color); + + GPU_matrix_push(); + GPU_matrix_mul(controller->grip_mat); + for (unsigned int component_idx = 0; component_idx < model_data.count_components; + ++component_idx) { + const GHOST_XrControllerModelComponent *component = &model_data.components[component_idx]; GPU_matrix_push(); - GPU_matrix_mul(controller->grip_mat); - GPU_matrix_scale_1f(scale); - GPU_batch_draw(sphere); + GPU_matrix_mul(component->transform); + GPU_batch_draw_range(model, + model->elem ? component->index_offset : component->vertex_offset, + model->elem ? component->index_count : component->vertex_count); GPU_matrix_pop(); } + GPU_matrix_pop(); } - } - - /* Aim. */ - { - bool draw_ray; - - switch (settings->controller_draw_style) { - case XR_CONTROLLER_DRAW_DARK: - case XR_CONTROLLER_DRAW_LIGHT: - draw_ray = false; - break; - case XR_CONTROLLER_DRAW_DARK_RAY: - case XR_CONTROLLER_DRAW_LIGHT_RAY: - draw_ray = true; - break; + else { + /* Fallback. */ + const float scale = 0.05f; + GPUBatch *sphere = GPU_batch_preset_sphere(2); + GPU_batch_program_set_builtin(sphere, GPU_SHADER_3D_UNIFORM_COLOR); + GPU_batch_uniform_4fv(sphere, "color", color); + + GPU_matrix_push(); + GPU_matrix_mul(controller->grip_mat); + GPU_matrix_scale_1f(scale); + GPU_batch_draw(sphere); + GPU_matrix_pop(); } + } +} - GPUVertFormat *format = immVertexFormat(); - uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT); - uint col = GPU_vertformat_attr_add( - format, "color", GPU_COMP_U8, 4, GPU_FETCH_INT_TO_FLOAT_UNIT); - immBindBuiltinProgram(GPU_SHADER_3D_POLYLINE_FLAT_COLOR); +static void wm_xr_controller_aim_draw(const XrSessionSettings *settings, wmXrSessionState *state) +{ + bool draw_ray; + switch (settings->controller_draw_style) { + case XR_CONTROLLER_DRAW_DARK: + case XR_CONTROLLER_DRAW_LIGHT: + draw_ray = false; + break; + case XR_CONTROLLER_DRAW_DARK_RAY: + case XR_CONTROLLER_DRAW_LIGHT_RAY: + draw_ray = true; + break; + } - float viewport[4]; - GPU_viewport_size_get_f(viewport); - immUniform2fv("viewportSize", &viewport[2]); + GPUVertFormat *format = immVertexFormat(); + uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT); + uint col = GPU_vertformat_attr_add(format, "color", GPU_COMP_U8, 4, GPU_FETCH_INT_TO_FLOAT_UNIT); + immBindBuiltinProgram(GPU_SHADER_3D_POLYLINE_FLAT_COLOR); - immUniform1f("lineWidth", 3.0f * U.pixelsize); + float viewport[4]; + GPU_viewport_size_get_f(viewport); + immUniform2fv("viewportSize", &viewport[2]); - if (draw_ray) { - const uchar color[4] = {89, 89, 255, 127}; - const float scale = settings->clip_end; - float ray[3]; + immUniform1f("lineWidth", 3.0f * U.pixelsize); - GPU_depth_test(GPU_DEPTH_LESS_EQUAL); - GPU_blend(GPU_BLEND_ALPHA); + if (draw_ray) { + const uchar color[4] = {89, 89, 255, 127}; + const float scale = settings->clip_end; + float ray[3]; - immBegin(GPU_PRIM_LINES, (uint)BLI_listbase_count(&state->controllers) * 2); + GPU_depth_test(GPU_DEPTH_LESS_EQUAL); + GPU_blend(GPU_BLEND_ALPHA); - LISTBASE_FOREACH (wmXrController *, controller, &state->controllers) { - const float(*mat)[4] = controller->aim_mat; - madd_v3_v3v3fl(ray, mat[3], mat[2], -scale); + immBegin(GPU_PRIM_LINES, (uint)BLI_listbase_count(&state->controllers) * 2); - immAttrSkip(col); - immVertex3fv(pos, mat[3]); - immAttr4ubv(col, color); - immVertex3fv(pos, ray); - } + LISTBASE_FOREACH (wmXrController *, controller, &state->controllers) { + const float(*mat)[4] = controller->aim_mat; + madd_v3_v3v3fl(ray, mat[3], mat[2], -scale); - immEnd(); + immAttrSkip(col); + immVertex3fv(pos, mat[3]); + immAttr4ubv(col, color); + immVertex3fv(pos, ray); } - else { - const uchar r[4] = {255, 51, 82, 255}; - const uchar g[4] = {139, 220, 0, 255}; - const uchar b[4] = {40, 144, 255, 255}; - const float scale = 0.01f; - float x_axis[3], y_axis[3], z_axis[3]; - - GPU_depth_test(GPU_DEPTH_NONE); - GPU_blend(GPU_BLEND_NONE); - - immBegin(GPU_PRIM_LINES, (uint)BLI_listbase_count(&state->controllers) * 6); - - LISTBASE_FOREACH (wmXrController *, controller, &state->controllers) { - const float(*mat)[4] = controller->aim_mat; - madd_v3_v3v3fl(x_axis, mat[3], mat[0], scale); - madd_v3_v3v3fl(y_axis, mat[3], mat[1], scale); - madd_v3_v3v3fl(z_axis, mat[3], mat[2], scale); - - immAttrSkip(col); - immVertex3fv(pos, mat[3]); - immAttr4ubv(col, r); - immVertex3fv(pos, x_axis); - - immAttrSkip(col); - immVertex3fv(pos, mat[3]); - immAttr4ubv(col, g); - immVertex3fv(pos, y_axis); - - immAttrSkip(col); - immVertex3fv(pos, mat[3]); - immAttr4ubv(col, b); - immVertex3fv(pos, z_axis); - } - immEnd(); + immEnd(); + } + else { + const uchar r[4] = {255, 51, 82, 255}; + const uchar g[4] = {139, 220, 0, 255}; + const uchar b[4] = {40, 144, 255, 255}; + const float scale = 0.01f; + float x_axis[3], y_axis[3], z_axis[3]; + + GPU_depth_test(GPU_DEPTH_NONE); + GPU_blend(GPU_BLEND_NONE); + + immBegin(GPU_PRIM_LINES, (uint)BLI_listbase_count(&state->controllers) * 6); + + LISTBASE_FOREACH (wmXrController *, controller, &state->controllers) { + const float(*mat)[4] = controller->aim_mat; + madd_v3_v3v3fl(x_axis, mat[3], mat[0], scale); + madd_v3_v3v3fl(y_axis, mat[3], mat[1], scale); + madd_v3_v3v3fl(z_axis, mat[3], mat[2], scale); + + immAttrSkip(col); + immVertex3fv(pos, mat[3]); + immAttr4ubv(col, r); + immVertex3fv(pos, x_axis); + + immAttrSkip(col); + immVertex3fv(pos, mat[3]); + immAttr4ubv(col, g); + immVertex3fv(pos, y_axis); + + immAttrSkip(col); + immVertex3fv(pos, mat[3]); + immAttr4ubv(col, b); + immVertex3fv(pos, z_axis); } - immUnbindProgram(); + immEnd(); } + + immUnbindProgram(); +} + +void wm_xr_draw_controllers(const bContext *UNUSED(C), ARegion *UNUSED(region), void *customdata) +{ + wmXrData *xr = customdata; + const XrSessionSettings *settings = &xr->session_settings; + GHOST_XrContextHandle xr_context = xr->runtime->context; + wmXrSessionState *state = &xr->runtime->session_state; + + wm_xr_controller_model_draw(settings, xr_context, state); + wm_xr_controller_aim_draw(settings, state); } |