diff options
author | mano-wii <germano.costa@ig.com.br> | 2019-06-21 18:05:47 +0300 |
---|---|---|
committer | mano-wii <germano.costa@ig.com.br> | 2019-06-21 18:05:47 +0300 |
commit | 3039d86f8bc00796cde3b93185db23698652002a (patch) | |
tree | 85843eea2e0a45c3bd74fdc2103826f2add5888b /source | |
parent | 7c9f64d008357151ae2e0007172a088d41588dec (diff) |
Fix T65834: Circle Select does not update select_id buffer after orbiting view3d.
This solution checks if `persp_mat` has changed. If positive, the selection buffer is redrawn.
Differential Revision: https://developer.blender.org/D5081
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/editors/include/ED_view3d.h | 3 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_select.c | 15 |
2 files changed, 17 insertions, 1 deletions
diff --git a/source/blender/editors/include/ED_view3d.h b/source/blender/editors/include/ED_view3d.h index 21a18a0b387..99843c66d0e 100644 --- a/source/blender/editors/include/ED_view3d.h +++ b/source/blender/editors/include/ED_view3d.h @@ -519,6 +519,9 @@ struct EDSelectID_Context *ED_view3d_select_id_context_create(struct ViewContext short select_mode); void ED_view3d_select_id_context_destroy(struct EDSelectID_Context *sel_id_ctx); +void ED_view3d_select_id_validate_view_matrices(const struct EDSelectID_Context *sel_id_ctx, + struct ViewContext *vc); + uint ED_view3d_select_id_context_offset_for_object_elem( const struct EDSelectID_Context *sel_id_ctx, int base_index, char elem_type); diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c index c1b5b553c21..a694a8e7305 100644 --- a/source/blender/editors/space_view3d/view3d_select.c +++ b/source/blender/editors/space_view3d/view3d_select.c @@ -138,6 +138,9 @@ struct EDSelectID_Context { uint bases_len; /** Total number of items `base_array_index_offsets[bases_len - 1].vert`. */ uint base_array_index_len; + /** Used to check for changes. (Use depsgraph instead?). */ + float persmat[4][4]; + short select_mode; }; static bool check_ob_drawface_dot(short select_mode, const View3D *v3d, char dt) @@ -191,6 +194,14 @@ static void ed_select_id_draw_bases(struct EDSelectID_Context *sel_id_ctx, DRW_framebuffer_select_id_release(vc->ar); } +void ED_view3d_select_id_validate_view_matrices(const struct EDSelectID_Context *sel_id_ctx, + ViewContext *vc) +{ + if (!compare_m4m4(sel_id_ctx->persmat, vc->rv3d->persmat, FLT_EPSILON)) { + ed_select_id_draw_bases(sel_id_ctx, vc, sel_id_ctx->select_mode); + } +} + uint ED_view3d_select_id_context_offset_for_object_elem( const struct EDSelectID_Context *sel_id_ctx, int base_index, char elem_type) { @@ -223,7 +234,8 @@ struct EDSelectID_Context *ED_view3d_select_id_context_create(ViewContext *vc, __func__); sel_id_ctx->bases = bases; sel_id_ctx->bases_len = bases_len; - + copy_m4_m4(sel_id_ctx->persmat, vc->rv3d->persmat); + sel_id_ctx->select_mode = select_mode; ed_select_id_draw_bases(sel_id_ctx, vc, select_mode); return sel_id_ctx; @@ -3520,6 +3532,7 @@ static bool mesh_circle_select(ViewContext *vc, struct EditSelectBuf_Cache *esel = wm_userdata->data; if (use_zbuf) { + ED_view3d_select_id_validate_view_matrices(esel->sel_id_ctx, vc); const uint buffer_len = ED_view3d_select_id_context_elem_len(esel->sel_id_ctx); esel->select_bitmap = ED_select_buffer_bitmap_from_circle(buffer_len, mval, (int)(rad + 1.0f)); } |