Commit: a4bd3f7d7e5634c96fd15d4bd8c2ed0211dc990a
Author: mano-wii
Date:   Thu Jun 13 23:40:49 2019 -0300
Branches: master
https://developer.blender.org/rBa4bd3f7d7e5634c96fd15d4bd8c2ed0211dc990a

Mesh Selection: Move Selection ID Context Utilities to ED_view3d.

This patch does not bring functional changes, but it is a good change if we 
want to use these utilities in areas other than those using BMesh (eg painting 
editors).

This is also a step to replace `ED_view3d_select_id_validate`. That function 
erroneously checks `V3D_INVALID_BACKBUF` which causes it to update 
unnecessarily.

Reviewers: campbellbarton

Differential Revision: https://developer.blender.org/D5072

===================================================================

M       source/blender/editors/include/ED_mesh.h
M       source/blender/editors/include/ED_view3d.h
M       source/blender/editors/mesh/CMakeLists.txt
M       source/blender/editors/mesh/editmesh_select.c
M       source/blender/editors/space_view3d/view3d_select.c

===================================================================

diff --git a/source/blender/editors/include/ED_mesh.h 
b/source/blender/editors/include/ED_mesh.h
index 0a8304f3f8a..5d8038d0b28 100644
--- a/source/blender/editors/include/ED_mesh.h
+++ b/source/blender/editors/include/ED_mesh.h
@@ -142,22 +142,6 @@ bool BMBVH_EdgeVisible(struct BMBVHTree *tree,
 void ED_mesh_undosys_type(struct UndoType *ut);
 
 /* editmesh_select.c */
-struct EDBMSelectID_Context;
-struct EDBMSelectID_Context *EDBM_select_id_context_create(struct ViewContext 
*vc,
-                                                           struct Base **bases,
-                                                           const uint 
bases_len,
-                                                           short select_mode);
-void EDBM_select_id_context_destroy(struct EDBMSelectID_Context *sel_id_ctx);
-struct BMElem *EDBM_select_id_bm_elem_get(struct EDBMSelectID_Context 
*sel_id_ctx,
-                                          const uint sel_id,
-                                          uint *r_base_index);
-
-uint EDBM_select_id_context_offset_for_object_elem(const struct 
EDBMSelectID_Context *sel_id_ctx,
-                                                   int base_index,
-                                                   char htype);
-
-uint EDBM_select_id_context_elem_len(const struct EDBMSelectID_Context 
*sel_id_ctx);
-
 void EDBM_select_mirrored(
     struct BMEditMesh *em, const int axis, const bool extend, int *r_totmirr, 
int *r_totfail);
 void EDBM_automerge(struct Scene *scene, struct Object *ob, bool update, const 
char hflag);
diff --git a/source/blender/editors/include/ED_view3d.h 
b/source/blender/editors/include/ED_view3d.h
index 751f71cc53b..21a18a0b387 100644
--- a/source/blender/editors/include/ED_view3d.h
+++ b/source/blender/editors/include/ED_view3d.h
@@ -512,6 +512,23 @@ int view3d_opengl_select(struct ViewContext *vc,
                          eV3DSelectObjectFilter select_filter);
 
 /* view3d_select.c */
+struct EDSelectID_Context;
+struct EDSelectID_Context *ED_view3d_select_id_context_create(struct 
ViewContext *vc,
+                                                              struct Base 
**bases,
+                                                              const uint 
bases_len,
+                                                              short 
select_mode);
+
+void ED_view3d_select_id_context_destroy(struct EDSelectID_Context 
*sel_id_ctx);
+uint ED_view3d_select_id_context_offset_for_object_elem(
+    const struct EDSelectID_Context *sel_id_ctx, int base_index, char 
elem_type);
+
+uint ED_view3d_select_id_context_elem_len(const struct EDSelectID_Context 
*sel_id_ctx);
+bool ED_view3d_select_id_elem_get(struct EDSelectID_Context *sel_id_ctx,
+                                  const uint sel_id,
+                                  uint *r_elem,
+                                  uint *r_base_index,
+                                  char *r_elem_type);
+
 float ED_view3d_select_dist_px(void);
 void ED_view3d_viewcontext_init(struct bContext *C, struct ViewContext *vc);
 void ED_view3d_viewcontext_init_object(struct ViewContext *vc, struct Object 
*obact);
diff --git a/source/blender/editors/mesh/CMakeLists.txt 
b/source/blender/editors/mesh/CMakeLists.txt
index 9a779db4812..57bf67e825e 100644
--- a/source/blender/editors/mesh/CMakeLists.txt
+++ b/source/blender/editors/mesh/CMakeLists.txt
@@ -23,7 +23,6 @@ set(INC
   ../../blentranslation
   ../../bmesh
   ../../depsgraph
-  ../../draw
   ../../gpu
   ../../imbuf
   ../../makesdna
diff --git a/source/blender/editors/mesh/editmesh_select.c 
b/source/blender/editors/mesh/editmesh_select.c
index 75d685fb9c6..7b770f055b4 100644
--- a/source/blender/editors/mesh/editmesh_select.c
+++ b/source/blender/editors/mesh/editmesh_select.c
@@ -68,8 +68,6 @@
 #include "DEG_depsgraph.h"
 #include "DEG_depsgraph_query.h"
 
-#include "DRW_engine.h"
-
 #include "mesh_intern.h" /* own include */
 
 /* use bmesh operator flags for a few operators */
@@ -199,177 +197,34 @@ void EDBM_automerge(Scene *scene, Object *obedit, bool 
update, const char hflag)
 /** \name Back-Buffer OpenGL Selection
  * \{ */
 
-struct EDBMBaseOffset {
-  /* For convenience only. */
-  union {
-    uint offset;
-    uint face_start;
-  };
-  union {
-    uint face;
-    uint edge_start;
-  };
-  union {
-    uint edge;
-    uint vert_start;
-  };
-  uint vert;
-};
-
-struct EDBMSelectID_Context {
-  struct EDBMBaseOffset *base_array_index_offsets;
-  /** Borrow from caller (not freed). */
-  struct Base **bases;
-  uint bases_len;
-  /** Total number of items `base_array_index_offsets[bases_len - 1].vert`. */
-  uint base_array_index_len;
-};
-
-static bool check_ob_drawface_dot(short select_mode, const View3D *v3d, char 
dt)
+static BMElem *EDBM_select_id_bm_elem_get(struct EDSelectID_Context 
*sel_id_ctx,
+                                          Base **bases,
+                                          const uint sel_id,
+                                          uint *r_base_index)
 {
-  if (select_mode & SCE_SELECT_FACE) {
-    if ((dt < OB_SOLID) || XRAY_FLAG_ENABLED(v3d)) {
-      return true;
-    }
-    if (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_FACE_DOT) {
-      return true;
-    }
-    if ((v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_EDGES) == 0) {
-      /* Since we can't deduce face selection when edges aren't visible - show 
dots. */
-      return true;
-    }
-  }
-  return false;
-}
-
-static void edbm_select_pick_draw_bases(struct EDBMSelectID_Context 
*sel_id_ctx,
-                                        ViewContext *vc,
-                                        short select_mode)
-{
-  Scene *scene_eval = (Scene *)DEG_get_evaluated_id(vc->depsgraph, 
&vc->scene->id);
-  DRW_framebuffer_select_id_setup(vc->ar, true);
-
-  uint offset = 1;
-  for (uint base_index = 0; base_index < sel_id_ctx->bases_len; base_index++) {
-    Object *ob_eval = DEG_get_evaluated_object(vc->depsgraph,
-                                               
sel_id_ctx->bases[base_index]->object);
-
-    struct EDBMBaseOffset *base_ofs = 
&sel_id_ctx->base_array_index_offsets[base_index];
-    bool draw_facedot = check_ob_drawface_dot(select_mode, vc->v3d, 
ob_eval->dt);
-
-    DRW_draw_select_id_object(scene_eval,
-                              vc->rv3d,
-                              ob_eval,
-                              select_mode,
-                              draw_facedot,
-                              offset,
-                              &base_ofs->vert,
-                              &base_ofs->edge,
-                              &base_ofs->face);
-
-    base_ofs->offset = offset;
-    offset = base_ofs->vert;
-  }
-
-  sel_id_ctx->base_array_index_len = offset;
-
-  DRW_framebuffer_select_id_release(vc->ar);
-}
-
-BMElem *EDBM_select_id_bm_elem_get(struct EDBMSelectID_Context *sel_id_ctx,
-                                   const uint sel_id,
-                                   uint *r_base_index)
-{
-  char elem_type = 0;
   uint elem_id;
-  uint base_index = 0;
-  for (; base_index < sel_id_ctx->bases_len; base_index++) {
-    struct EDBMBaseOffset *base_ofs = 
&sel_id_ctx->base_array_index_offsets[base_index];
-    if (base_ofs->face > sel_id) {
-      elem_id = sel_id - base_ofs->face_start;
-      elem_type = BM_FACE;
-      break;
-    }
-    if (base_ofs->edge > sel_id) {
-      elem_id = sel_id - base_ofs->edge_start;
-      elem_type = BM_EDGE;
-      break;
-    }
-    if (base_ofs->vert > sel_id) {
-      elem_id = sel_id - base_ofs->vert_start;
-      elem_type = BM_VERT;
-      break;
-    }
-  }
-
-  if (base_index >= sel_id_ctx->bases_len) {
-    BLI_assert(0);
-    return NULL;
-  }
-
-  if (r_base_index) {
-    *r_base_index = base_index;
-  }
-
-  Object *obedit = sel_id_ctx->bases[base_index]->object;
-  BMEditMesh *em = BKE_editmesh_from_object(obedit);
+  char elem_type = 0;
+  bool success = ED_view3d_select_id_elem_get(
+      sel_id_ctx, sel_id, &elem_id, r_base_index, &elem_type);
 
-  switch (elem_type) {
-    case BM_FACE:
-      return (BMElem *)BM_face_at_index_find_or_table(em->bm, elem_id);
-    case BM_EDGE:
-      return (BMElem *)BM_edge_at_index_find_or_table(em->bm, elem_id);
-    case BM_VERT:
-      return (BMElem *)BM_vert_at_index_find_or_table(em->bm, elem_id);
-    default:
-      BLI_assert(0);
-      return NULL;
-  }
-}
+  if (success) {
+    Object *obedit = bases[*r_base_index]->object;
+    BMEditMesh *em = BKE_editmesh_from_object(obedit);
 
-uint EDBM_select_id_context_offset_for_object_elem(const struct 
EDBMSelectID_Context *sel_id_ctx,
-                                                   int base_index,
-                                                   char htype)
-{
-  struct EDBMBaseOffset *base_ofs = 
&sel_id_ctx->base_array_index_offsets[base_index];
-  if (htype == BM_VERT) {
-    return base_ofs->vert_start - 1;
-  }
-  if (htype == BM_EDGE) {
-    return base_ofs->edge_start - 1;
-  }
-  if (htype == BM_FACE) {
-    return base_ofs->face_start - 1;
+    switch (elem_type) {
+      case SCE_SELECT_FACE:
+        return (BMElem *)BM_face_at_index_find_or_table(em->bm, elem_id);
+      case SCE_SELECT_EDGE:
+        return (BMElem *)BM_edge_at_index_find_or_table(em->bm, elem_id);
+      case SCE_SELECT_VERTEX:
+        return (BMElem *)BM_vert_at_index_find_or_table(em->bm, elem_id);
+      default:
+        BLI_assert(0);
+        return NULL;
+    }
   }
-  BLI_assert(0);
-  return 0;
-}
 
-uint EDBM_select_id_context_elem_len(const struct EDBMSelectID_Context 
*sel_id_ctx)
-{
-  return sel_id_ctx->base_array_index_len;
-}
-
-struct EDBMSelectID_Context *EDBM_select_id_context_create(ViewContext *vc,
-                                                           Base **bases,
-                                                           const uint 
bases_len,
-                                                           short select_mode)
-{
-  struct EDBMSelectID_Context *sel_id_ctx = MEM_mallocN(sizeof(*sel_id_ctx), 
__func__);
-  sel_id_ctx->base_array_index_offsets = MEM_mallocN(sizeof(struct 
EDBMBaseOffset) * bases_len,
-                                                     __func__);
-  sel_id_ctx->bases = bases;
-  sel_id_ctx->bases_len = bases_len;
-
-  edbm_select_pick_d

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to