diff options
author | Campbell Barton <ideasman42@gmail.com> | 2020-01-06 14:42:49 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2020-01-06 15:21:45 +0300 |
commit | 0d67eb277f9bcf01ab6781ae27816caf690eb671 (patch) | |
tree | 9a42dd57f5051cb1adc8592395addd15dc74d016 /source/blender/editors/gizmo_library/gizmo_types | |
parent | 98e4fbc7cc9e9bd6492e7bbb82e48dcf7b4d0bac (diff) |
Gizmo: support 3D arrow gizmos in 2D spaces
Allows 2D arrows to be removed, since they work slightly differently
and don't support offset matrices.
Use these in the UV editor.
Diffstat (limited to 'source/blender/editors/gizmo_library/gizmo_types')
-rw-r--r-- | source/blender/editors/gizmo_library/gizmo_types/arrow3d_gizmo.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/source/blender/editors/gizmo_library/gizmo_types/arrow3d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/arrow3d_gizmo.c index 6a28c626a81..c19613e4d8d 100644 --- a/source/blender/editors/gizmo_library/gizmo_types/arrow3d_gizmo.c +++ b/source/blender/editors/gizmo_library/gizmo_types/arrow3d_gizmo.c @@ -33,6 +33,7 @@ */ #include "BLI_math.h" +#include "BLI_utildefines.h" #include "DNA_view3d_types.h" @@ -56,6 +57,8 @@ #include "ED_screen.h" #include "ED_gizmo_library.h" +#include "UI_interface.h" + /* own includes */ #include "../gizmo_geometry.h" #include "../gizmo_library_intern.h" @@ -214,6 +217,37 @@ static void gizmo_arrow_draw(const bContext *UNUSED(C), wmGizmo *gz) } /** + * Selection for 2D views. + */ +static int gizmo_arrow_test_select(bContext *UNUSED(C), wmGizmo *gz, const int mval[2]) +{ + /* Project into 2D space since it simplifies pixel threshold tests. */ + ArrowGizmo3D *arrow = (ArrowGizmo3D *)gz; + const float arrow_length = RNA_float_get(arrow->gizmo.ptr, "length"); + + float matrix_final[4][4]; + WM_gizmo_calc_matrix_final(gz, matrix_final); + + /* Arrow in pixel space. */ + float arrow_start[2] = {matrix_final[3][0], matrix_final[3][1]}; + float arrow_end[2]; + { + float co[3] = {0, 0, arrow_length}; + mul_m4_v3(matrix_final, co); + copy_v2_v2(arrow_end, co); + } + + const float mval_fl[2] = {UNPACK2(mval)}; + const float arrow_stem_threshold_px = 5 * UI_DPI_FAC; + const float arrow_head_threshold_px = 10 * UI_DPI_FAC; + if (dist_squared_to_line_v2(mval_fl, arrow_start, arrow_end) < SQUARE(arrow_stem_threshold_px) || + len_squared_v2v2(mval_fl, arrow_end) < SQUARE(arrow_head_threshold_px)) { + return 0; + } + return -1; +} + +/** * Calculate arrow offset independent from prop min value, * meaning the range will not be offset by min value first. */ @@ -427,6 +461,7 @@ static void GIZMO_GT_arrow_3d(wmGizmoType *gzt) /* api callbacks */ gzt->draw = gizmo_arrow_draw; gzt->draw_select = gizmo_arrow_draw_select; + gzt->test_select = gizmo_arrow_test_select; gzt->matrix_basis_get = gizmo_arrow_matrix_basis_get; gzt->modal = gizmo_arrow_modal; gzt->setup = gizmo_arrow_setup; |