Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authormano-wii <germano.costa@ig.com.br>2019-06-21 18:05:47 +0300
committermano-wii <germano.costa@ig.com.br>2019-06-21 18:05:47 +0300
commit3039d86f8bc00796cde3b93185db23698652002a (patch)
tree85843eea2e0a45c3bd74fdc2103826f2add5888b /source
parent7c9f64d008357151ae2e0007172a088d41588dec (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.h3
-rw-r--r--source/blender/editors/space_view3d/view3d_select.c15
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));
}