[Bf-blender-cvs] [0d81fdc9132] refactor-mesh-hide-generic: Always save with legacy mesh format

Hans Goudey noreply at git.blender.org
Wed Jul 20 19:26:15 CEST 2022


Commit: 0d81fdc91321c3b69b32307c40217a449b7b6c72
Author: Hans Goudey
Date:   Wed Jul 20 12:26:08 2022 -0500
Branches: refactor-mesh-hide-generic
https://developer.blender.org/rB0d81fdc91321c3b69b32307c40217a449b7b6c72

Always save with legacy mesh format

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

M	source/blender/blenkernel/BKE_mesh_legacy_convert.h
M	source/blender/blenkernel/intern/mesh.cc
M	source/blender/blenkernel/intern/mesh_evaluate.cc
M	source/blender/blenkernel/intern/mesh_legacy_convert.cc
M	source/blender/blenloader/BLO_read_write.h
M	source/blender/blenloader/BLO_writefile.h
M	source/blender/blenloader/intern/writefile.c
M	source/blender/editors/mesh/editface.cc
M	source/blender/windowmanager/intern/wm_files.c

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

diff --git a/source/blender/blenkernel/BKE_mesh_legacy_convert.h b/source/blender/blenkernel/BKE_mesh_legacy_convert.h
index 6b625e8a6b5..276b3146b06 100644
--- a/source/blender/blenkernel/BKE_mesh_legacy_convert.h
+++ b/source/blender/blenkernel/BKE_mesh_legacy_convert.h
@@ -17,7 +17,15 @@ struct CustomData;
 struct Mesh;
 struct MFace;
 
+/**
+ * Convert the new hidden element attributes to the old flag format for writing.
+ */
 void BKE_mesh_legacy_convert_hide_layers_to_flags(struct Mesh *mesh);
+/**
+ * Convert the old hide flags (#ME_HIDE) to the new hidden element attribute for reading.
+ * Only add the attributes when there are any elements in each domain hidden.
+ */
+void BKE_mesh_legacy_convert_flags_to_hide_layers(struct Mesh *mesh);
 
 /**
  * Recreate #MFace Tessellation.
diff --git a/source/blender/blenkernel/intern/mesh.cc b/source/blender/blenkernel/intern/mesh.cc
index ae5d2f179a1..bc9f29572bd 100644
--- a/source/blender/blenkernel/intern/mesh.cc
+++ b/source/blender/blenkernel/intern/mesh.cc
@@ -251,9 +251,7 @@ static void mesh_blend_write(BlendWriter *writer, ID *id, const void *id_address
     CustomData_blend_write_prepare(mesh->pdata, poly_layers);
   }
 
-  if (BLO_write_use_legacy_mesh_format(writer)) {
-    BKE_mesh_legacy_convert_hide_layers_to_flags(mesh);
-  }
+  BKE_mesh_legacy_convert_hide_layers_to_flags(mesh);
 
   BLO_write_id_struct(writer, Mesh, id_address, &mesh->id);
   BKE_id_blend_write(writer, &mesh->id);
@@ -331,6 +329,8 @@ static void mesh_blend_read_data(BlendDataReader *reader, ID *id)
     }
   }
 
+  BKE_mesh_legacy_convert_flags_to_hide_layers(mesh);
+
   /* We don't expect to load normals from files, since they are derived data. */
   BKE_mesh_normals_tag_dirty(mesh);
   BKE_mesh_assert_normals_dirty_or_calculated(mesh);
diff --git a/source/blender/blenkernel/intern/mesh_evaluate.cc b/source/blender/blenkernel/intern/mesh_evaluate.cc
index 5f55213e259..65fdd3235c4 100644
--- a/source/blender/blenkernel/intern/mesh_evaluate.cc
+++ b/source/blender/blenkernel/intern/mesh_evaluate.cc
@@ -903,8 +903,7 @@ static void mesh_flush_select_from_verts(const Span<MVert> verts,
 
 void BKE_mesh_flush_select_from_verts(Mesh *me)
 {
-  blender::bke::AttributeAccessor attributes = blender::bke::mesh_attributes(*me);
-
+  const blender::bke::AttributeAccessor attributes = blender::bke::mesh_attributes(*me);
   mesh_flush_select_from_verts(
       {me->mvert, me->totvert},
       {me->mloop, me->totloop},
diff --git a/source/blender/blenkernel/intern/mesh_legacy_convert.cc b/source/blender/blenkernel/intern/mesh_legacy_convert.cc
index e30db1f445f..f67bb81f3d0 100644
--- a/source/blender/blenkernel/intern/mesh_legacy_convert.cc
+++ b/source/blender/blenkernel/intern/mesh_legacy_convert.cc
@@ -877,7 +877,7 @@ void BKE_mesh_add_mface_layers(CustomData *fdata, CustomData *ldata, int total)
 /** \} */
 
 /* -------------------------------------------------------------------- */
-/** \name Conversion to Legacy Hidden Flags
+/** \name Hide Attribute and Legacy Flag Conversion
  * \{ */
 
 void BKE_mesh_legacy_convert_hide_layers_to_flags(Mesh *mesh)
@@ -908,4 +908,41 @@ void BKE_mesh_legacy_convert_hide_layers_to_flags(Mesh *mesh)
   }
 }
 
+void BKE_mesh_legacy_convert_flags_to_hide_layers(Mesh *mesh)
+{
+  using namespace blender;
+  using namespace blender::bke;
+  MutableAttributeAccessor attributes = mesh_attributes_for_write(*mesh);
+
+  const Span<MVert> verts(mesh->mvert, mesh->totvert);
+  if (std::any_of(
+          verts.begin(), verts.end(), [](const MVert &vert) { return vert.flag & ME_HIDE; })) {
+    SpanAttributeWriter<bool> hide_vert = attributes.lookup_or_add_for_write_only_span<bool>(
+        ".hide_vert", ATTR_DOMAIN_POINT);
+    for (const int i : verts.index_range()) {
+      hide_vert.span[i] = verts[i].flag & ME_HIDE;
+    }
+  }
+
+  const Span<MEdge> edges(mesh->medge, mesh->totedge);
+  if (std::any_of(
+          edges.begin(), edges.end(), [](const MEdge &edge) { return edge.flag & ME_HIDE; })) {
+    SpanAttributeWriter<bool> hide_edge = attributes.lookup_or_add_for_write_only_span<bool>(
+        ".hide_edge", ATTR_DOMAIN_EDGE);
+    for (const int i : edges.index_range()) {
+      hide_edge.span[i] = edges[i].flag & ME_HIDE;
+    }
+  }
+
+  const Span<MPoly> polys(mesh->mpoly, mesh->totpoly);
+  if (std::any_of(
+          polys.begin(), polys.end(), [](const MPoly &poly) { return poly.flag & ME_HIDE; })) {
+    SpanAttributeWriter<bool> hide_face = attributes.lookup_or_add_for_write_only_span<bool>(
+        ".hide_face", ATTR_DOMAIN_FACE);
+    for (const int i : polys.index_range()) {
+      hide_face.span[i] = polys[i].flag & ME_HIDE;
+    }
+  }
+}
+
 /** \} */
diff --git a/source/blender/blenloader/BLO_read_write.h b/source/blender/blenloader/BLO_read_write.h
index 5d0bb8231d1..536c3989aff 100644
--- a/source/blender/blenloader/BLO_read_write.h
+++ b/source/blender/blenloader/BLO_read_write.h
@@ -181,8 +181,6 @@ void BLO_write_string(BlendWriter *writer, const char *data_ptr);
  */
 bool BLO_write_is_undo(BlendWriter *writer);
 
-bool BLO_write_use_legacy_mesh_format(const BlendWriter *writer);
-
 /** \} */
 
 /* -------------------------------------------------------------------- */
diff --git a/source/blender/blenloader/BLO_writefile.h b/source/blender/blenloader/BLO_writefile.h
index a2c2c036f5a..93f1ea5090f 100644
--- a/source/blender/blenloader/BLO_writefile.h
+++ b/source/blender/blenloader/BLO_writefile.h
@@ -44,7 +44,6 @@ struct BlendFileWriteParams {
   uint use_save_versions : 1;
   /** On write, restore paths after editing them (see #BLO_WRITE_PATH_REMAP_RELATIVE). */
   uint use_save_as_copy : 1;
-  uint use_legacy_mesh_format : 1;
   uint use_userdef : 1;
   const struct BlendThumbnail *thumb;
 };
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index e34abbd32ec..68171f26a66 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -422,8 +422,6 @@ typedef struct {
   /** When true, write to #WriteData.current, could also call 'is_undo'. */
   bool use_memfile;
 
-  bool use_legacy_mesh_format;
-
   /**
    * Wrap writing, so we can use zstd or
    * other compression types later, see: G_FILE_COMPRESS
@@ -1085,7 +1083,6 @@ static bool write_file_handle(Main *mainvar,
                               MemFile *current,
                               int write_flags,
                               bool use_userdef,
-                              const bool use_legacy_mesh_format,
                               const BlendThumbnail *thumb)
 {
   BHead bhead;
@@ -1096,7 +1093,6 @@ static bool write_file_handle(Main *mainvar,
   blo_split_main(&mainlist, mainvar);
 
   wd = mywrite_begin(ww, compare, current);
-  wd->use_legacy_mesh_format = use_legacy_mesh_format;
   BlendWriter writer = {wd};
 
   sprintf(buf,
@@ -1436,8 +1432,7 @@ bool BLO_write_file(Main *mainvar,
   }
 
   /* actual file writing */
-  const bool err = write_file_handle(
-      mainvar, &ww, NULL, NULL, write_flags, use_userdef, params->use_legacy_mesh_format, thumb);
+  const bool err = write_file_handle(mainvar, &ww, NULL, NULL, write_flags, use_userdef, thumb);
 
   ww.close(&ww);
 
@@ -1481,7 +1476,7 @@ bool BLO_write_file_mem(Main *mainvar, MemFile *compare, MemFile *current, int w
   bool use_userdef = false;
 
   const bool err = write_file_handle(
-      mainvar, NULL, compare, current, write_flags, use_userdef, false, NULL);
+      mainvar, NULL, compare, current, write_flags, use_userdef, NULL);
 
   return (err == 0);
 }
@@ -1610,9 +1605,4 @@ bool BLO_write_is_undo(BlendWriter *writer)
   return writer->wd->use_memfile;
 }
 
-bool BLO_write_use_legacy_mesh_format(const BlendWriter *writer)
-{
-  return writer->wd->use_legacy_mesh_format;
-}
-
 /** \} */
diff --git a/source/blender/editors/mesh/editface.cc b/source/blender/editors/mesh/editface.cc
index aadc9155bfd..35aa729d7a5 100644
--- a/source/blender/editors/mesh/editface.cc
+++ b/source/blender/editors/mesh/editface.cc
@@ -624,23 +624,27 @@ void paintvert_select_ungrouped(Object *ob, bool extend, bool flush_flags)
 
 void paintvert_hide(bContext *C, Object *ob, const bool unselected)
 {
-  Mesh *const me = BKE_mesh_from_object(ob);
-
+  using namespace blender;
+  Mesh *me = BKE_mesh_from_object(ob);
   if (me == NULL || me->totvert == 0) {
     return;
   }
 
-  for (int i = 0; i < me->totvert; i++) {
-    MVert *const mvert = &me->mvert[i];
-
-    if ((mvert->flag & ME_HIDE) == 0) {
-      if (((mvert->flag & SELECT) == 0) == unselected) {
-        mvert->flag |= ME_HIDE;
+  bke::MutableAttributeAccessor attributes = bke::mesh_attributes_for_write(*me);
+  bke::SpanAttributeWriter<bool> hide_vert = attributes.lookup_or_add_for_write_span<bool>(
+      ".hide_vert", ATTR_DOMAIN_POINT);
+  MutableSpan<MVert> vertices(me->mvert, me->totvert);
+
+  for (const int i : vertices.index_range()) {
+    MVert &vert = vertices[i];
+    if (!hide_vert.span[i]) {
+      if (((vert.flag & SELECT) == 0) == unselected) {
+        hide_vert.span[i] = true;
       }
     }
 
-    if (mvert->flag & ME_HIDE) {
-      mvert->flag &= ~SELECT;
+    if (hide_vert.span[i]) {
+      vert.flag &= ~SELECT;
     }
   }
 
@@ -652,21 +656,27 @@ void paintvert_hide(bContext *C, Object *ob, const bool unselected)
 
 void paintvert_reveal(bContext *C, Object *ob, const bool select)
 {
-  Mesh *const me = BKE_mesh_from_object(ob);
-
+  using namespace blender;
+  Mesh *me = BKE_mesh_from_object(ob);
   if (me == NULL || me->totvert == 0) {
     return;
   }
 
-  for (int i = 0; i < me->totvert; i++) {
-    MVert *const mvert = &me->mvert[i];
+  bke::MutableAttributeAccessor attributes = bke::mesh_attributes_for_write(*me);
+  const VArray<bool> hide_vert = attributes.lookup_or_default<bool>(
+      ".hide_vert", ATTR_DOMAIN_POINT, false);
+  MutableSpan<MVert> vertices(me->mvert, me->totvert);
 
-    if (mvert->flag & ME_HIDE) {
-      SET_FLAG_FROM_TEST(mvert->flag, select, SELECT);
-      mvert->flag &= ~ME_HIDE;
+  for (const int i : vertices.index_range()) {
+    MVert &vert = vertices[i];
+    if (hide_vert[i]) {
+      SET_FLAG_FROM_TEST(vert.flag, select, 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list