[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