diff options
Diffstat (limited to 'source/blender/editors/gizmo_library/gizmo_types/button2d_gizmo.c')
-rw-r--r-- | source/blender/editors/gizmo_library/gizmo_types/button2d_gizmo.c | 401 |
1 files changed, 199 insertions, 202 deletions
diff --git a/source/blender/editors/gizmo_library/gizmo_types/button2d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/button2d_gizmo.c index 542b9aa19e3..1a132c2957a 100644 --- a/source/blender/editors/gizmo_library/gizmo_types/button2d_gizmo.c +++ b/source/blender/editors/gizmo_library/gizmo_types/button2d_gizmo.c @@ -32,7 +32,6 @@ #include "BKE_context.h" - #include "GPU_immediate.h" #include "GPU_immediate_util.h" #include "GPU_matrix.h" @@ -61,218 +60,216 @@ #include "../gizmo_library_intern.h" typedef struct ButtonGizmo2D { - wmGizmo gizmo; - bool is_init; - /* Use an icon or shape */ - int icon; - GPUBatch *shape_batch[2]; + wmGizmo gizmo; + bool is_init; + /* Use an icon or shape */ + int icon; + GPUBatch *shape_batch[2]; } ButtonGizmo2D; #define CIRCLE_RESOLUTION 32 /* -------------------------------------------------------------------- */ -static void button2d_geom_draw_backdrop( - const wmGizmo *gz, const float color[4], const bool select) +static void button2d_geom_draw_backdrop(const wmGizmo *gz, const float color[4], const bool select) { - GPU_line_width(gz->line_width); + GPU_line_width(gz->line_width); - GPUVertFormat *format = immVertexFormat(); - uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT); + GPUVertFormat *format = immVertexFormat(); + uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT); - immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR); + immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR); - immUniformColor4fv(color); + immUniformColor4fv(color); - /* TODO, other draw styles */ - imm_draw_circle_fill_2d(pos, 0, 0, 1.0f, CIRCLE_RESOLUTION); + /* TODO, other draw styles */ + imm_draw_circle_fill_2d(pos, 0, 0, 1.0f, CIRCLE_RESOLUTION); - immUnbindProgram(); + immUnbindProgram(); - UNUSED_VARS(select); + UNUSED_VARS(select); } -static void button2d_draw_intern( - const bContext *C, wmGizmo *gz, - const bool select, const bool highlight) +static void button2d_draw_intern(const bContext *C, + wmGizmo *gz, + const bool select, + const bool highlight) { - ButtonGizmo2D *button = (ButtonGizmo2D *)gz; - - const int draw_options = RNA_enum_get(gz->ptr, "draw_options"); - if (button->is_init == false) { - button->is_init = true; - PropertyRNA *prop = RNA_struct_find_property(gz->ptr, "icon"); - if (RNA_property_is_set(gz->ptr, prop)) { - button->icon = RNA_property_enum_get(gz->ptr, prop); - } - else { - prop = RNA_struct_find_property(gz->ptr, "shape"); - const uint polys_len = RNA_property_string_length(gz->ptr, prop); - /* We shouldn't need the +1, but a NULL char is set. */ - char *polys = MEM_mallocN(polys_len + 1, __func__); - RNA_property_string_get(gz->ptr, prop, polys); - button->shape_batch[0] = GPU_batch_tris_from_poly_2d_encoded((uchar *)polys, polys_len, NULL); - button->shape_batch[1] = GPU_batch_wire_from_poly_2d_encoded((uchar *)polys, polys_len, NULL); - MEM_freeN(polys); - } - } - - float color[4]; - float matrix_final[4][4]; - - gizmo_color_get(gz, highlight, color); - WM_gizmo_calc_matrix_final(gz, matrix_final); - - - bool is_3d = (gz->parent_gzgroup->type->flag & WM_GIZMOGROUPTYPE_3D) != 0; - - if ((select == false) && - (draw_options & ED_GIZMO_BUTTON_SHOW_HELPLINE)) - { - float matrix_final_no_offset[4][4]; - WM_gizmo_calc_matrix_final_no_offset(gz, matrix_final_no_offset); - uint pos = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT); - immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR); - immUniformColor4fv(color); - GPU_line_width(gz->line_width); - immUniformColor4fv(color); - immBegin(GPU_PRIM_LINE_STRIP, 2); - immVertex3fv(pos, matrix_final[3]); - immVertex3fv(pos, matrix_final_no_offset[3]); - immEnd(); - immUnbindProgram(); - } - - bool need_to_pop = true; - GPU_matrix_push(); - GPU_matrix_mul(matrix_final); - - if (is_3d) { - RegionView3D *rv3d = CTX_wm_region_view3d(C); - float matrix_align[4][4]; - float matrix_final_unit[4][4]; - normalize_m4_m4(matrix_final_unit, matrix_final); - mul_m4_m4m4(matrix_align, rv3d->viewmat, matrix_final_unit); - zero_v3(matrix_align[3]); - transpose_m4(matrix_align); - GPU_matrix_mul(matrix_align); - } - - if (select) { - BLI_assert(is_3d); - button2d_geom_draw_backdrop(gz, color, select); - } - else { - - GPU_blend(true); - if (button->shape_batch[0] != NULL) { - GPU_line_smooth(true); - GPU_polygon_smooth(false); - GPU_line_width(1.0f); - for (uint i = 0; i < ARRAY_SIZE(button->shape_batch) && button->shape_batch[i]; i++) { - /* Invert line color for wire. */ - GPU_batch_program_set_builtin(button->shape_batch[i], GPU_SHADER_2D_UNIFORM_COLOR); - GPU_batch_uniform_4f(button->shape_batch[i], "color", UNPACK4(color)); - GPU_batch_draw(button->shape_batch[i]); - - if (draw_options & ED_GIZMO_BUTTON_SHOW_OUTLINE) { - color[0] = 1.0f - color[0]; - color[1] = 1.0f - color[1]; - color[2] = 1.0f - color[2]; - } - } - GPU_line_smooth(false); - GPU_polygon_smooth(true); - } - else if (button->icon != ICON_NONE) { - if (draw_options & ED_GIZMO_BUTTON_SHOW_BACKDROP) { - button2d_geom_draw_backdrop(gz, color, select); - } - - float pos[2]; - if (is_3d) { - const float fac = 2.0f; - GPU_matrix_translate_2f(-(fac / 2), -(fac / 2)); - GPU_matrix_scale_2f(fac / (ICON_DEFAULT_WIDTH * UI_DPI_FAC), fac / (ICON_DEFAULT_HEIGHT * UI_DPI_FAC)); - pos[0] = 1.0f; - pos[1] = 1.0f; - } - else { - pos[0] = gz->matrix_basis[3][0] - (ICON_DEFAULT_WIDTH / 2.0) * UI_DPI_FAC; - pos[1] = gz->matrix_basis[3][1] - (ICON_DEFAULT_HEIGHT / 2.0) * UI_DPI_FAC; - GPU_matrix_pop(); - need_to_pop = false; - } - - float alpha = (highlight) ? 1.0f : 0.8f; - GPU_polygon_smooth(false); - UI_icon_draw_alpha(pos[0], pos[1], button->icon, alpha); - GPU_polygon_smooth(true); - } - GPU_blend(false); - } - - if (need_to_pop) { - GPU_matrix_pop(); - } + ButtonGizmo2D *button = (ButtonGizmo2D *)gz; + + const int draw_options = RNA_enum_get(gz->ptr, "draw_options"); + if (button->is_init == false) { + button->is_init = true; + PropertyRNA *prop = RNA_struct_find_property(gz->ptr, "icon"); + if (RNA_property_is_set(gz->ptr, prop)) { + button->icon = RNA_property_enum_get(gz->ptr, prop); + } + else { + prop = RNA_struct_find_property(gz->ptr, "shape"); + const uint polys_len = RNA_property_string_length(gz->ptr, prop); + /* We shouldn't need the +1, but a NULL char is set. */ + char *polys = MEM_mallocN(polys_len + 1, __func__); + RNA_property_string_get(gz->ptr, prop, polys); + button->shape_batch[0] = GPU_batch_tris_from_poly_2d_encoded( + (uchar *)polys, polys_len, NULL); + button->shape_batch[1] = GPU_batch_wire_from_poly_2d_encoded( + (uchar *)polys, polys_len, NULL); + MEM_freeN(polys); + } + } + + float color[4]; + float matrix_final[4][4]; + + gizmo_color_get(gz, highlight, color); + WM_gizmo_calc_matrix_final(gz, matrix_final); + + bool is_3d = (gz->parent_gzgroup->type->flag & WM_GIZMOGROUPTYPE_3D) != 0; + + if ((select == false) && (draw_options & ED_GIZMO_BUTTON_SHOW_HELPLINE)) { + float matrix_final_no_offset[4][4]; + WM_gizmo_calc_matrix_final_no_offset(gz, matrix_final_no_offset); + uint pos = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT); + immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR); + immUniformColor4fv(color); + GPU_line_width(gz->line_width); + immUniformColor4fv(color); + immBegin(GPU_PRIM_LINE_STRIP, 2); + immVertex3fv(pos, matrix_final[3]); + immVertex3fv(pos, matrix_final_no_offset[3]); + immEnd(); + immUnbindProgram(); + } + + bool need_to_pop = true; + GPU_matrix_push(); + GPU_matrix_mul(matrix_final); + + if (is_3d) { + RegionView3D *rv3d = CTX_wm_region_view3d(C); + float matrix_align[4][4]; + float matrix_final_unit[4][4]; + normalize_m4_m4(matrix_final_unit, matrix_final); + mul_m4_m4m4(matrix_align, rv3d->viewmat, matrix_final_unit); + zero_v3(matrix_align[3]); + transpose_m4(matrix_align); + GPU_matrix_mul(matrix_align); + } + + if (select) { + BLI_assert(is_3d); + button2d_geom_draw_backdrop(gz, color, select); + } + else { + + GPU_blend(true); + if (button->shape_batch[0] != NULL) { + GPU_line_smooth(true); + GPU_polygon_smooth(false); + GPU_line_width(1.0f); + for (uint i = 0; i < ARRAY_SIZE(button->shape_batch) && button->shape_batch[i]; i++) { + /* Invert line color for wire. */ + GPU_batch_program_set_builtin(button->shape_batch[i], GPU_SHADER_2D_UNIFORM_COLOR); + GPU_batch_uniform_4f(button->shape_batch[i], "color", UNPACK4(color)); + GPU_batch_draw(button->shape_batch[i]); + + if (draw_options & ED_GIZMO_BUTTON_SHOW_OUTLINE) { + color[0] = 1.0f - color[0]; + color[1] = 1.0f - color[1]; + color[2] = 1.0f - color[2]; + } + } + GPU_line_smooth(false); + GPU_polygon_smooth(true); + } + else if (button->icon != ICON_NONE) { + if (draw_options & ED_GIZMO_BUTTON_SHOW_BACKDROP) { + button2d_geom_draw_backdrop(gz, color, select); + } + + float pos[2]; + if (is_3d) { + const float fac = 2.0f; + GPU_matrix_translate_2f(-(fac / 2), -(fac / 2)); + GPU_matrix_scale_2f(fac / (ICON_DEFAULT_WIDTH * UI_DPI_FAC), + fac / (ICON_DEFAULT_HEIGHT * UI_DPI_FAC)); + pos[0] = 1.0f; + pos[1] = 1.0f; + } + else { + pos[0] = gz->matrix_basis[3][0] - (ICON_DEFAULT_WIDTH / 2.0) * UI_DPI_FAC; + pos[1] = gz->matrix_basis[3][1] - (ICON_DEFAULT_HEIGHT / 2.0) * UI_DPI_FAC; + GPU_matrix_pop(); + need_to_pop = false; + } + + float alpha = (highlight) ? 1.0f : 0.8f; + GPU_polygon_smooth(false); + UI_icon_draw_alpha(pos[0], pos[1], button->icon, alpha); + GPU_polygon_smooth(true); + } + GPU_blend(false); + } + + if (need_to_pop) { + GPU_matrix_pop(); + } } static void gizmo_button2d_draw_select(const bContext *C, wmGizmo *gz, int select_id) { - GPU_select_load_id(select_id); - button2d_draw_intern(C, gz, true, false); + GPU_select_load_id(select_id); + button2d_draw_intern(C, gz, true, false); } static void gizmo_button2d_draw(const bContext *C, wmGizmo *gz) { - const bool is_highlight = (gz->state & WM_GIZMO_STATE_HIGHLIGHT) != 0; + const bool is_highlight = (gz->state & WM_GIZMO_STATE_HIGHLIGHT) != 0; - GPU_blend(true); - button2d_draw_intern(C, gz, false, is_highlight); - GPU_blend(false); + GPU_blend(true); + button2d_draw_intern(C, gz, false, is_highlight); + GPU_blend(false); } -static int gizmo_button2d_test_select( - bContext *C, wmGizmo *gz, const int mval[2]) +static int gizmo_button2d_test_select(bContext *C, wmGizmo *gz, const int mval[2]) { - float point_local[2]; - - if (0) { - /* correct, but unnecessarily slow. */ - if (gizmo_window_project_2d( - C, gz, (const float[2]){UNPACK2(mval)}, 2, true, point_local) == false) - { - return -1; - } - } - else { - copy_v2_v2(point_local, (float[2]){UNPACK2(mval)}); - sub_v2_v2(point_local, gz->matrix_basis[3]); - mul_v2_fl(point_local, 1.0f / (gz->scale_basis * UI_DPI_FAC)); - } - /* The 'gz->scale_final' is already applied when projecting. */ - if (len_squared_v2(point_local) < 1.0f) { - return 0; - } - - return -1; + float point_local[2]; + + if (0) { + /* correct, but unnecessarily slow. */ + if (gizmo_window_project_2d(C, gz, (const float[2]){UNPACK2(mval)}, 2, true, point_local) == + false) { + return -1; + } + } + else { + copy_v2_v2(point_local, (float[2]){UNPACK2(mval)}); + sub_v2_v2(point_local, gz->matrix_basis[3]); + mul_v2_fl(point_local, 1.0f / (gz->scale_basis * UI_DPI_FAC)); + } + /* The 'gz->scale_final' is already applied when projecting. */ + if (len_squared_v2(point_local) < 1.0f) { + return 0; + } + + return -1; } static int gizmo_button2d_cursor_get(wmGizmo *gz) { - if (RNA_boolean_get(gz->ptr, "show_drag")) { - return BC_NSEW_SCROLLCURSOR; - } - return CURSOR_STD; + if (RNA_boolean_get(gz->ptr, "show_drag")) { + return BC_NSEW_SCROLLCURSOR; + } + return CURSOR_STD; } static void gizmo_button2d_free(wmGizmo *gz) { - ButtonGizmo2D *shape = (ButtonGizmo2D *)gz; + ButtonGizmo2D *shape = (ButtonGizmo2D *)gz; - for (uint i = 0; i < ARRAY_SIZE(shape->shape_batch); i++) { - GPU_BATCH_DISCARD_SAFE(shape->shape_batch[i]); - } + for (uint i = 0; i < ARRAY_SIZE(shape->shape_batch); i++) { + GPU_BATCH_DISCARD_SAFE(shape->shape_batch[i]); + } } /** \} */ @@ -284,42 +281,42 @@ static void gizmo_button2d_free(wmGizmo *gz) static void GIZMO_GT_button_2d(wmGizmoType *gzt) { - /* identifiers */ - gzt->idname = "GIZMO_GT_button_2d"; + /* identifiers */ + gzt->idname = "GIZMO_GT_button_2d"; - /* api callbacks */ - gzt->draw = gizmo_button2d_draw; - gzt->draw_select = gizmo_button2d_draw_select; - gzt->test_select = gizmo_button2d_test_select; - gzt->cursor_get = gizmo_button2d_cursor_get; - gzt->free = gizmo_button2d_free; + /* api callbacks */ + gzt->draw = gizmo_button2d_draw; + gzt->draw_select = gizmo_button2d_draw_select; + gzt->test_select = gizmo_button2d_test_select; + gzt->cursor_get = gizmo_button2d_cursor_get; + gzt->free = gizmo_button2d_free; - gzt->struct_size = sizeof(ButtonGizmo2D); + gzt->struct_size = sizeof(ButtonGizmo2D); - /* rna */ - static EnumPropertyItem rna_enum_draw_options[] = { - {ED_GIZMO_BUTTON_SHOW_OUTLINE, "OUTLINE", 0, "Outline", ""}, - {ED_GIZMO_BUTTON_SHOW_BACKDROP, "BACKDROP", 0, "Backdrop", ""}, - {ED_GIZMO_BUTTON_SHOW_HELPLINE, "HELPLINE", 0, "Help Line", ""}, - {0, NULL, 0, NULL, NULL}, - }; - PropertyRNA *prop; + /* rna */ + static EnumPropertyItem rna_enum_draw_options[] = { + {ED_GIZMO_BUTTON_SHOW_OUTLINE, "OUTLINE", 0, "Outline", ""}, + {ED_GIZMO_BUTTON_SHOW_BACKDROP, "BACKDROP", 0, "Backdrop", ""}, + {ED_GIZMO_BUTTON_SHOW_HELPLINE, "HELPLINE", 0, "Help Line", ""}, + {0, NULL, 0, NULL, NULL}, + }; + PropertyRNA *prop; - RNA_def_enum_flag(gzt->srna, "draw_options", rna_enum_draw_options, 0, "Draw Options", ""); + RNA_def_enum_flag(gzt->srna, "draw_options", rna_enum_draw_options, 0, "Draw Options", ""); - prop = RNA_def_property(gzt->srna, "icon", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_items(prop, rna_enum_icon_items); + prop = RNA_def_property(gzt->srna, "icon", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_items(prop, rna_enum_icon_items); - /* Passed to 'GPU_batch_tris_from_poly_2d_encoded' */ - RNA_def_property(gzt->srna, "shape", PROP_STRING, PROP_BYTESTRING); + /* Passed to 'GPU_batch_tris_from_poly_2d_encoded' */ + RNA_def_property(gzt->srna, "shape", PROP_STRING, PROP_BYTESTRING); - /* Currently only used for cursor display. */ - RNA_def_boolean(gzt->srna, "show_drag", true, "Show Drag", ""); + /* Currently only used for cursor display. */ + RNA_def_boolean(gzt->srna, "show_drag", true, "Show Drag", ""); } void ED_gizmotypes_button_2d(void) { - WM_gizmotype_append(GIZMO_GT_button_2d); + WM_gizmotype_append(GIZMO_GT_button_2d); } -/** \} */ // Button Gizmo API +/** \} */ // Button Gizmo API |