[Bf-blender-cvs] [b247588dc0f] master: Cleanup: some refactoring in mapped mesh extraction

Brecht Van Lommel noreply at git.blender.org
Tue Aug 16 18:09:59 CEST 2022


Commit: b247588dc0f48f2fb713f6571ef0129a38760b00
Author: Brecht Van Lommel
Date:   Tue Aug 16 17:34:40 2022 +0200
Branches: master
https://developer.blender.org/rBb247588dc0f48f2fb713f6571ef0129a38760b00

Cleanup: some refactoring in mapped mesh extraction

* Flip the logic to first detect if we are dealing with an unmodified mesh
  in editmode. And then if not, detect if we need a mapping or not.
* runtime.is_original is only valid for the bmesh wrapper. Rename it to clarify
  that and only check it when the mesh is a bmesh wrapper.
* Remove MR_EXTRACT_MAPPED and instead check only for the existence of the
  origindex arrays. Previously it would sometimes access those arrays without
  MR_EXTRACT_MAPPED set, which according to a comment means they are invalid.

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

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

M	source/blender/blenkernel/intern/mesh.cc
M	source/blender/blenkernel/intern/mesh_debug.cc
M	source/blender/blenkernel/intern/mesh_wrapper.cc
M	source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc
M	source/blender/draw/intern/draw_cache_impl_mesh.cc
M	source/blender/draw/intern/draw_cache_impl_subdivision.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh.hh
M	source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines_paint_mask.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_points.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edituv_stretch_angle.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edituv_stretch_area.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_fdots_nor.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_lnor.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_pos_nor.cc
M	source/blender/makesdna/DNA_mesh_types.h
M	source/blender/modifiers/intern/MOD_datatransfer.c
M	source/blender/modifiers/intern/MOD_normal_edit.c
M	source/blender/modifiers/intern/MOD_uvproject.c
M	source/blender/modifiers/intern/MOD_uvwarp.c
M	source/blender/modifiers/intern/MOD_weighted_normal.c
M	source/blender/modifiers/intern/MOD_weightvgedit.c
M	source/blender/modifiers/intern/MOD_weightvgmix.c
M	source/blender/modifiers/intern/MOD_weightvgproximity.c

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

diff --git a/source/blender/blenkernel/intern/mesh.cc b/source/blender/blenkernel/intern/mesh.cc
index abf47acd5cc..1b8d094e9d3 100644
--- a/source/blender/blenkernel/intern/mesh.cc
+++ b/source/blender/blenkernel/intern/mesh.cc
@@ -113,7 +113,7 @@ static void mesh_copy_data(Main *bmain, ID *id_dst, const ID *id_src, const int
    *
    * While this could be the callers responsibility, keep here since it's
    * highly unlikely we want to create a duplicate and not use it for drawing. */
-  mesh_dst->runtime.is_original = false;
+  mesh_dst->runtime.is_original_bmesh = false;
 
   /* Only do tessface if we have no polys. */
   const bool do_tessface = ((mesh_src->totface != 0) && (mesh_src->totpoly == 0));
diff --git a/source/blender/blenkernel/intern/mesh_debug.cc b/source/blender/blenkernel/intern/mesh_debug.cc
index 6f12726d364..1826a77d6f4 100644
--- a/source/blender/blenkernel/intern/mesh_debug.cc
+++ b/source/blender/blenkernel/intern/mesh_debug.cc
@@ -58,7 +58,8 @@ char *BKE_mesh_debug_info(const Mesh *me)
   BLI_dynstr_appendf(dynstr, "    'totpoly': %d,\n", me->totpoly);
 
   BLI_dynstr_appendf(dynstr, "    'runtime.deformed_only': %d,\n", me->runtime.deformed_only);
-  BLI_dynstr_appendf(dynstr, "    'runtime.is_original': %d,\n", me->runtime.is_original);
+  BLI_dynstr_appendf(
+      dynstr, "    'runtime.is_original_bmesh': %d,\n", me->runtime.is_original_bmesh);
 
   BLI_dynstr_append(dynstr, "    'vert_layers': (\n");
   CustomData_debug_info_from_layers(&me->vdata, indent8, dynstr);
diff --git a/source/blender/blenkernel/intern/mesh_wrapper.cc b/source/blender/blenkernel/intern/mesh_wrapper.cc
index 0b61b876abe..989cd5f1df1 100644
--- a/source/blender/blenkernel/intern/mesh_wrapper.cc
+++ b/source/blender/blenkernel/intern/mesh_wrapper.cc
@@ -61,7 +61,7 @@ Mesh *BKE_mesh_wrapper_from_editmesh_with_coords(BMEditMesh *em,
   }
 
   /* Use edit-mesh directly where possible. */
-  me->runtime.is_original = true;
+  me->runtime.is_original_bmesh = true;
 
   me->edit_mesh = static_cast<BMEditMesh *>(MEM_dupallocN(em));
   me->edit_mesh->is_shallow_copy = true;
@@ -133,7 +133,7 @@ void BKE_mesh_wrapper_ensure_mdata(Mesh *me)
         EditMeshData *edit_data = me->runtime.edit_data;
         if (edit_data->vertexCos) {
           BKE_mesh_vert_coords_apply(me, edit_data->vertexCos);
-          me->runtime.is_original = false;
+          me->runtime.is_original_bmesh = false;
         }
         break;
       }
diff --git a/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc b/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc
index 0159c9fc86e..86b20a5cb7c 100644
--- a/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc
+++ b/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc
@@ -494,17 +494,6 @@ MeshRenderData *mesh_render_data_create(Object *object,
       mr->bm_poly_centers = mr->edit_data->polyCos;
     }
 
-    /* A subdivision wrapper may be created in edit mode when X-ray is turned on to ensure that the
-     * topology seen by the user matches the one used for the selection routines. This wrapper
-     * seemingly takes precedence over the MDATA one, however the mesh we use for rendering is not
-     * the subdivided one, but the one where the MDATA wrapper would have been added. So consider
-     * the subdivision wrapper as well for the `has_mdata` case. */
-    bool has_mdata = is_mode_active && ELEM(mr->me->runtime.wrapper_type,
-                                            ME_WRAPPER_TYPE_MDATA,
-                                            ME_WRAPPER_TYPE_SUBD);
-    bool use_mapped = is_mode_active &&
-                      (has_mdata && !do_uvedit && mr->me && !mr->me->runtime.is_original);
-
     int bm_ensure_types = BM_VERT | BM_EDGE | BM_LOOP | BM_FACE;
 
     BM_mesh_elem_index_ensure(mr->bm, bm_ensure_types);
@@ -523,43 +512,51 @@ MeshRenderData *mesh_render_data_create(Object *object,
     mr->freestyle_face_ofs = CustomData_get_offset(&mr->bm->pdata, CD_FREESTYLE_FACE);
 #endif
 
-    if (use_mapped) {
-      mr->v_origindex = static_cast<const int *>(
-          CustomData_get_layer(&mr->me->vdata, CD_ORIGINDEX));
-      mr->e_origindex = static_cast<const int *>(
-          CustomData_get_layer(&mr->me->edata, CD_ORIGINDEX));
-      mr->p_origindex = static_cast<const int *>(
-          CustomData_get_layer(&mr->me->pdata, CD_ORIGINDEX));
-
-      use_mapped = (mr->v_origindex || mr->e_origindex || mr->p_origindex);
+    /* Use bmesh directly when the object is in edit mode unchanged by any modifiers.
+     * For non-final UVs, always use original bmesh since the UV editor does not support
+     * using the cage mesh with deformed coordinates. */
+    if ((is_mode_active && mr->me->runtime.is_original_bmesh &&
+         mr->me->runtime.wrapper_type == ME_WRAPPER_TYPE_BMESH) ||
+        (do_uvedit && !do_final)) {
+      mr->extract_type = MR_EXTRACT_BMESH;
     }
-
-    mr->extract_type = use_mapped ? MR_EXTRACT_MAPPED : MR_EXTRACT_BMESH;
-
-    /* Seems like the mesh_eval_final do not have the right origin indices.
-     * Force not mapped in this case. */
-    if (has_mdata && do_final && editmesh_eval_final != editmesh_eval_cage) {
-      // mr->edit_bmesh = NULL;
+    else {
       mr->extract_type = MR_EXTRACT_MESH;
+
+      /* Use mapping from final to original mesh when the object is in edit mode. */
+      if (is_mode_active && do_final) {
+        mr->v_origindex = static_cast<const int *>(
+            CustomData_get_layer(&mr->me->vdata, CD_ORIGINDEX));
+        mr->e_origindex = static_cast<const int *>(
+            CustomData_get_layer(&mr->me->edata, CD_ORIGINDEX));
+        mr->p_origindex = static_cast<const int *>(
+            CustomData_get_layer(&mr->me->pdata, CD_ORIGINDEX));
+      }
+      else {
+        mr->v_origindex = nullptr;
+        mr->e_origindex = nullptr;
+        mr->p_origindex = nullptr;
+      }
     }
   }
   else {
     mr->me = me;
     mr->edit_bmesh = nullptr;
+    mr->extract_type = MR_EXTRACT_MESH;
 
-    bool use_mapped = is_paint_mode && mr->me && !mr->me->runtime.is_original;
-    if (use_mapped) {
+    if (is_paint_mode && mr->me) {
       mr->v_origindex = static_cast<const int *>(
           CustomData_get_layer(&mr->me->vdata, CD_ORIGINDEX));
       mr->e_origindex = static_cast<const int *>(
           CustomData_get_layer(&mr->me->edata, CD_ORIGINDEX));
       mr->p_origindex = static_cast<const int *>(
           CustomData_get_layer(&mr->me->pdata, CD_ORIGINDEX));
-
-      use_mapped = (mr->v_origindex || mr->e_origindex || mr->p_origindex);
     }
-
-    mr->extract_type = use_mapped ? MR_EXTRACT_MAPPED : MR_EXTRACT_MESH;
+    else {
+      mr->v_origindex = nullptr;
+      mr->e_origindex = nullptr;
+      mr->p_origindex = nullptr;
+    }
   }
 
   if (mr->extract_type != MR_EXTRACT_BMESH) {
diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.cc b/source/blender/draw/intern/draw_cache_impl_mesh.cc
index 3e2fd225e8e..e60689f0237 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.cc
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.cc
@@ -1514,7 +1514,7 @@ void DRW_mesh_batch_cache_create_requested(struct TaskGraph *task_graph,
     Mesh *editmesh_eval_cage = BKE_object_get_editmesh_eval_cage(ob);
 
     do_cage = editmesh_eval_final != editmesh_eval_cage;
-    do_uvcage = !(editmesh_eval_final->runtime.is_original &&
+    do_uvcage = !(editmesh_eval_final->runtime.is_original_bmesh &&
                   editmesh_eval_final->runtime.wrapper_type == ME_WRAPPER_TYPE_BMESH);
   }
 
diff --git a/source/blender/draw/intern/draw_cache_impl_subdivision.cc b/source/blender/draw/intern/draw_cache_impl_subdivision.cc
index 075e08eb49f..e86e342fea0 100644
--- a/source/blender/draw/intern/draw_cache_impl_subdivision.cc
+++ b/source/blender/draw/intern/draw_cache_impl_subdivision.cc
@@ -724,7 +724,7 @@ static void draw_subdiv_cache_update_extra_coarse_face_data(DRWSubdivCache *cach
   if (mr->extract_type == MR_EXTRACT_BMESH) {
     draw_subdiv_cache_extra_coarse_face_data_bm(cache->bm, mr->efa_act, flags_data);
   }
-  else if (mr->extract_type == MR_EXTRACT_MAPPED) {
+  else if (mr->p_origindex != NULL) {
     draw_subdiv_cache_extra_coarse_face_data_mapped(mesh, cache->bm, mr, flags_data);
   }
   else {
diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh.hh b/source/blender/draw/intern/mesh_extractors/extract_mesh.hh
index 57abf088c16..5d55af904e8 100644
--- a/source/blender/draw/intern/mesh_extractors/extract_mesh.hh
+++ b/source/blender/draw/intern/mesh_extractors/extract_mesh.hh
@@ -29,7 +29,6 @@ struct DRWSubdivCache;
 
 enum eMRExtractType {
   MR_EXTRACT_BMESH,
-  MR_EXTRACT_MAPPED,
   MR_EXTRACT_MESH,
 };
 
diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines.cc
index 6d989c3fe03..9c564c2cdda 100644
--- a/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines.cc
+++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines.cc
@@ -58,14 +58,13 @@ static void extract_lines_iter_poly_mesh(const MeshRenderData *mr,
   GPUIndexBufBuilder *elb = static_cast<GPUIndexBufBuilder *>(data);
   /* Using poly & loop iterator would complicate accessing the adjacent loop. */
   const MLoop *mloop = mr->mloop;
-  if (mr->use_hide || (mr->extract_type == MR_EXTRACT_MAPPED) || (mr->e_origindex != nullptr)) {
+  if (mr->use_hide || (mr->e_origindex != nullptr)) {
     const int ml_index_last = mp->loopstart + (mp->totloop - 1);
     int ml_index = ml_index_last, ml_index_next = mp->loopstart;
     do {
       const MLoop *ml = &mloop[ml_index];
       if (!((mr->use_hide && mr->hide_edge && mr->hide_edge[ml->e]) ||
-            ((mr->extract_type == MR_EXTRACT_MAPPED) && (mr->e_origindex) &&
-             (mr->e_origindex[ml->e] == ORIGINDEX_NONE)))) {
+            ((mr->e_origindex) && (mr->e_origindex[ml->e] == ORIGINDEX_NONE)))) {
         GPU_indexbuf_set_line_verts(elb, ml->e, ml_index, ml_index_next);
       }
       else {
@@ -110,8 +109,7 @@ static void extract_lines_iter_ledge_mesh(const MeshRenderData *mr,
   const int l_index_offset = mr->edge_len + l

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list