[Bf-blender-cvs] [780d67a1338] refactor-mesh-selection-generic: Progress

Hans Goudey noreply at git.blender.org
Wed Aug 17 02:47:50 CEST 2022


Commit: 780d67a133874914b54c3cee59366aa46ee3b52a
Author: Hans Goudey
Date:   Mon Aug 15 11:08:07 2022 -0400
Branches: refactor-mesh-selection-generic
https://developer.blender.org/rB780d67a133874914b54c3cee59366aa46ee3b52a

Progress

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

M	source/blender/blenkernel/intern/customdata.cc
M	source/blender/blenkernel/intern/mesh.cc
M	source/blender/blenkernel/intern/mesh_calc_edges.cc
M	source/blender/bmesh/intern/bmesh_construct.c
M	source/blender/bmesh/intern/bmesh_construct.h
M	source/blender/bmesh/intern/bmesh_mesh_convert.cc
M	source/blender/draw/intern/draw_cache_impl_subdivision.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_pos_nor.cc
M	source/blender/editors/sculpt_paint/paint_image_proj.c
M	source/blender/io/collada/MeshImporter.cpp
M	source/blender/makesrna/intern/rna_mesh.c

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

diff --git a/source/blender/blenkernel/intern/customdata.cc b/source/blender/blenkernel/intern/customdata.cc
index 69825031795..95ba347bef8 100644
--- a/source/blender/blenkernel/intern/customdata.cc
+++ b/source/blender/blenkernel/intern/customdata.cc
@@ -2346,7 +2346,13 @@ bool CustomData_merge(const CustomData *source,
 
 static bool attribute_stored_in_bmesh_flag(const StringRef name)
 {
-  return ELEM(name, ".hide_vert", ".hide_edge", ".hide_poly");
+  return ELEM(name,
+              ".hide_vert",
+              ".hide_edge",
+              ".hide_poly",
+              ".selection_vert",
+              ".selection_edge",
+              ".selection_poly");
 }
 
 static CustomData shallow_copy_remove_non_bmesh_attributes(const CustomData &src)
diff --git a/source/blender/blenkernel/intern/mesh.cc b/source/blender/blenkernel/intern/mesh.cc
index abf47acd5cc..6fbb2e1628a 100644
--- a/source/blender/blenkernel/intern/mesh.cc
+++ b/source/blender/blenkernel/intern/mesh.cc
@@ -1708,6 +1708,8 @@ void BKE_mesh_mselect_clear(Mesh *me)
 
 void BKE_mesh_mselect_validate(Mesh *me)
 {
+  using namespace blender;
+  using namespace blender::bke;
   MSelect *mselect_src, *mselect_dst;
   int i_src, i_dst;
 
@@ -1719,25 +1721,33 @@ void BKE_mesh_mselect_validate(Mesh *me)
   mselect_dst = (MSelect *)MEM_malloc_arrayN(
       (me->totselect), sizeof(MSelect), "Mesh selection history");
 
+  const AttributeAccessor attributes = mesh_attributes(*me);
+  const VArray<bool> selection_vert = attributes.lookup_or_default<bool>(
+      ".selection_vert", ATTR_DOMAIN_POINT, false);
+  const VArray<bool> selection_edge = attributes.lookup_or_default<bool>(
+      ".selection_edge", ATTR_DOMAIN_EDGE, false);
+  const VArray<bool> selection_poly = attributes.lookup_or_default<bool>(
+      ".selection_poly", ATTR_DOMAIN_FACE, false);
+
   for (i_src = 0, i_dst = 0; i_src < me->totselect; i_src++) {
     int index = mselect_src[i_src].index;
     switch (mselect_src[i_src].type) {
       case ME_VSEL: {
-        if (me->mvert[index].flag & SELECT) {
+        if (selection_vert[index]) {
           mselect_dst[i_dst] = mselect_src[i_src];
           i_dst++;
         }
         break;
       }
       case ME_ESEL: {
-        if (me->medge[index].flag & SELECT) {
+        if (selection_edge[index]) {
           mselect_dst[i_dst] = mselect_src[i_src];
           i_dst++;
         }
         break;
       }
       case ME_FSEL: {
-        if (me->mpoly[index].flag & SELECT) {
+        if (selection_poly[index]) {
           mselect_dst[i_dst] = mselect_src[i_src];
           i_dst++;
         }
diff --git a/source/blender/blenkernel/intern/mesh_calc_edges.cc b/source/blender/blenkernel/intern/mesh_calc_edges.cc
index 31e20750cf2..7b8dbdded2e 100644
--- a/source/blender/blenkernel/intern/mesh_calc_edges.cc
+++ b/source/blender/blenkernel/intern/mesh_calc_edges.cc
@@ -13,6 +13,7 @@
 #include "BLI_threads.h"
 #include "BLI_timeit.hh"
 
+#include "BKE_attribute.hh"
 #include "BKE_customdata.h"
 #include "BKE_mesh.h"
 
@@ -117,9 +118,10 @@ static void add_polygon_edges_to_hash_maps(Mesh *mesh,
   });
 }
 
-static void serialize_and_initialize_deduplicated_edges(MutableSpan<EdgeMap> edge_maps,
+static void serialize_and_initialize_deduplicated_edges(Mesh &mesh,
+                                                        MutableSpan<EdgeMap> edge_maps,
                                                         MutableSpan<MEdge> new_edges,
-                                                        short new_edge_flag)
+                                                        const bool select_new_edges)
 {
   /* All edges are distributed in the hash tables now. They have to be serialized into a single
    * array below. To be able to parallelize this, we have to compute edge index offsets for each
@@ -145,12 +147,29 @@ static void serialize_and_initialize_deduplicated_edges(MutableSpan<EdgeMap> edg
         /* Initialize new edge. */
         new_edge.v1 = item.key.v_low;
         new_edge.v2 = item.key.v_high;
-        new_edge.flag = new_edge_flag;
+        new_edge.flag = (ME_EDGEDRAW | ME_EDGERENDER);
       }
       item.value.index = new_edge_index;
       new_edge_index++;
     }
   });
+
+  if (select_new_edges) {
+    SpanAttributeWriter<bool> selection_edge =
+        mesh_attributes_for_write(mesh).lookup_or_add_for_write_span<bool>(".selection_edge",
+                                                                           ATTR_DOMAIN_EDGE);
+    threading::parallel_for_each(edge_maps, [&](EdgeMap &edge_map) {
+      const int task_index = &edge_map - edge_maps.data();
+      int new_edge_index = edge_index_offsets[task_index];
+      for (EdgeMap::MutableItem item : edge_map.items()) {
+        if (item.value.original_edge == nullptr) {
+          selection_edge.span[new_edge_index] = true;
+        }
+        new_edge_index++;
+      }
+    });
+    selection_edge.finish();
+  }
 }
 
 static void update_edge_indices_in_poly_loops(Mesh *mesh,
@@ -233,8 +252,8 @@ void BKE_mesh_calc_edges(Mesh *mesh, bool keep_existing_edges, const bool select
   /* Create new edges. */
   MutableSpan<MEdge> new_edges{
       static_cast<MEdge *>(MEM_calloc_arrayN(new_totedge, sizeof(MEdge), __func__)), new_totedge};
-  const short new_edge_flag = (ME_EDGEDRAW | ME_EDGERENDER) | (select_new_edges ? SELECT : 0);
-  calc_edges::serialize_and_initialize_deduplicated_edges(edge_maps, new_edges, new_edge_flag);
+  calc_edges::serialize_and_initialize_deduplicated_edges(
+      *mesh, edge_maps, new_edges, select_new_edges);
   calc_edges::update_edge_indices_in_poly_loops(mesh, edge_maps, parallel_mask);
 
   /* Free old CustomData and assign new one. */
diff --git a/source/blender/bmesh/intern/bmesh_construct.c b/source/blender/bmesh/intern/bmesh_construct.c
index 0ee5545527b..0e043475817 100644
--- a/source/blender/bmesh/intern/bmesh_construct.c
+++ b/source/blender/bmesh/intern/bmesh_construct.c
@@ -21,8 +21,6 @@
 #include "bmesh.h"
 #include "intern/bmesh_private.h"
 
-#define SELECT 1
-
 bool BM_verts_from_edges(BMVert **vert_arr, BMEdge **edge_arr, const int len)
 {
   int i, i_prev = len - 1;
@@ -720,35 +718,22 @@ BMesh *BM_mesh_copy(BMesh *bm_old)
   return bm_new;
 }
 
-char BM_vert_flag_from_mflag(const char mflag)
-{
-  return ((mflag & SELECT) ? BM_ELEM_SELECT : 0);
-}
 char BM_edge_flag_from_mflag(const short mflag)
 {
-  return (((mflag & SELECT) ? BM_ELEM_SELECT : 0) | ((mflag & ME_SEAM) ? BM_ELEM_SEAM : 0) |
+  return ((((mflag & ME_SEAM) ? BM_ELEM_SEAM : 0) |
           ((mflag & ME_EDGEDRAW) ? BM_ELEM_DRAW : 0) |
           ((mflag & ME_SHARP) == 0 ? BM_ELEM_SMOOTH : 0));
 }
 char BM_face_flag_from_mflag(const char mflag)
 {
-  return (((mflag & ME_FACE_SEL) ? BM_ELEM_SELECT : 0) |
-          ((mflag & ME_SMOOTH) ? BM_ELEM_SMOOTH : 0));
-}
-
-char BM_vert_flag_to_mflag(BMVert *v)
-{
-  const char hflag = v->head.hflag;
-
-  return (((hflag & BM_ELEM_SELECT) ? SELECT : 0));
+  return ((mflag & ME_SMOOTH) ? BM_ELEM_SMOOTH : 0);
 }
 
 short BM_edge_flag_to_mflag(BMEdge *e)
 {
   const char hflag = e->head.hflag;
 
-  return (((hflag & BM_ELEM_SELECT) ? SELECT : 0) | ((hflag & BM_ELEM_SEAM) ? ME_SEAM : 0) |
-          ((hflag & BM_ELEM_DRAW) ? ME_EDGEDRAW : 0) |
+  return (((hflag & BM_ELEM_SEAM) ? ME_SEAM : 0) | ((hflag & BM_ELEM_DRAW) ? ME_EDGEDRAW : 0) |
           ((hflag & BM_ELEM_SMOOTH) == 0 ? ME_SHARP : 0) |
           (BM_edge_is_wire(e) ? ME_LOOSEEDGE : 0) | /* not typical */
           ME_EDGERENDER);
@@ -757,6 +742,5 @@ char BM_face_flag_to_mflag(BMFace *f)
 {
   const char hflag = f->head.hflag;
 
-  return (((hflag & BM_ELEM_SELECT) ? ME_FACE_SEL : 0) |
-          ((hflag & BM_ELEM_SMOOTH) ? ME_SMOOTH : 0));
+  return ((hflag & BM_ELEM_SMOOTH) ? ME_SMOOTH : 0);
 }
diff --git a/source/blender/bmesh/intern/bmesh_construct.h b/source/blender/bmesh/intern/bmesh_construct.h
index 1851cf58d4e..225e15c90e9 100644
--- a/source/blender/bmesh/intern/bmesh_construct.h
+++ b/source/blender/bmesh/intern/bmesh_construct.h
@@ -169,8 +169,5 @@ BMesh *BM_mesh_copy(BMesh *bm_old);
 char BM_face_flag_from_mflag(char mflag);
 char BM_edge_flag_from_mflag(short mflag);
 /* ME -> BM */
-char BM_vert_flag_from_mflag(char mflag);
 char BM_face_flag_to_mflag(BMFace *f);
 short BM_edge_flag_to_mflag(BMEdge *e);
-/* BM -> ME */
-char BM_vert_flag_to_mflag(BMVert *v);
diff --git a/source/blender/bmesh/intern/bmesh_mesh_convert.cc b/source/blender/bmesh/intern/bmesh_mesh_convert.cc
index b9c004b5392..cef41aef3ea 100644
--- a/source/blender/bmesh/intern/bmesh_mesh_convert.cc
+++ b/source/blender/bmesh/intern/bmesh_mesh_convert.cc
@@ -364,6 +364,13 @@ void BM_mesh_bm_from_me(BMesh *bm, const Mesh *me, const struct BMeshFromMeshPar
   const bool *hide_poly = (const bool *)CustomData_get_layer_named(
       &me->pdata, CD_PROP_BOOL, ".hide_poly");
 
+  const bool *selection_vert = (const bool *)CustomData_get_layer_named(
+      &me->vdata, CD_PROP_BOOL, ".selection_vert");
+  const bool *selection_edge = (const bool *)CustomData_get_layer_named(
+      &me->edata, CD_PROP_BOOL, ".selection_edge");
+  const bool *selection_poly = (const bool *)CustomData_get_layer_named(
+      &me->pdata, CD_PROP_BOOL, ".selection_poly");
+
   Span<MVert> mvert{me->mvert, me->totvert};
   Array<BMVert *> vtable(me->totvert);
   for (const int i : mvert.index_range()) {
@@ -371,14 +378,10 @@ void BM_mesh_bm_from_me(BMesh *bm, const Mesh *me, const struct BMeshFromMeshPar
         bm, keyco ? keyco[i] : mvert[i].co, nullptr, BM_CREATE_SKIP_CD);
     BM_elem_index_set(v, i); /* set_ok */
 
-    /* Transfer flag. */
-    v->head.hflag = BM_vert_flag_from_mflag(mvert[i].flag & ~SELECT);
     if (hide_vert && hide_vert[i]) {
       BM_elem_flag_enable(v, BM_ELEM_HIDDEN);
     }
-
-    /* This is necessary for selection counts to work properly. */
-    if (mvert[i].flag & SELECT) {
+    if (selection_vert && selection_vert[i]) {
       BM_vert_select_set(bm, v, true);
     }
 
@@ -418,13 +421,11 @@ void BM_mesh_bm_from_me(BMesh *bm, const Mesh *me, const struct BMeshFromMeshPar
     BM_elem_index_set(e, i); /* set_ok */
 
     /* Transfer flags. */
-    e->head.hflag = BM_edge_flag_from_mflag(medge[i].flag & ~SELECT);
+  

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list