[Bf-blender-cvs] [3039d86f8bc] master: Fix T65834: Circle Select does not update select_id buffer after orbiting view3d.
mano-wii
noreply at git.blender.org
Fri Jun 21 17:05:58 CEST 2019
Commit: 3039d86f8bc00796cde3b93185db23698652002a
Author: mano-wii
Date: Fri Jun 21 12:05:47 2019 -0300
Branches: master
https://developer.blender.org/rB3039d86f8bc00796cde3b93185db23698652002a
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
===================================================================
M source/blender/editors/include/ED_view3d.h
M source/blender/editors/space_view3d/view3d_select.c
===================================================================
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));
}
More information about the Bf-blender-cvs
mailing list