[Bf-blender-cvs] [698766cb923] refactor-mesh-position-generic: Fix legacy conversion

Hans Goudey noreply at git.blender.org
Thu Sep 15 18:44:14 CEST 2022


Commit: 698766cb923b779fb43961a1a5cf859f33112972
Author: Hans Goudey
Date:   Thu Sep 15 09:50:09 2022 -0500
Branches: refactor-mesh-position-generic
https://developer.blender.org/rB698766cb923b779fb43961a1a5cf859f33112972

Fix legacy conversion

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

M	source/blender/blenkernel/BKE_mesh_legacy_convert.h
M	source/blender/blenkernel/intern/mesh.cc
M	source/blender/blenkernel/intern/mesh_legacy_convert.cc

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

diff --git a/source/blender/blenkernel/BKE_mesh_legacy_convert.h b/source/blender/blenkernel/BKE_mesh_legacy_convert.h
index 3ee7d91415d..b7122585caf 100644
--- a/source/blender/blenkernel/BKE_mesh_legacy_convert.h
+++ b/source/blender/blenkernel/BKE_mesh_legacy_convert.h
@@ -64,7 +64,7 @@ void BKE_mesh_legacy_convert_material_indices_to_mpoly(struct Mesh *mesh);
 void BKE_mesh_legacy_convert_mpoly_to_material_indices(struct Mesh *mesh);
 
 #ifdef __cplusplus
-void BKE_mesh_legacy_convert_positions_to_verts(
+struct MVert *BKE_mesh_legacy_convert_positions_to_verts(
     Mesh *mesh,
     blender::ResourceScope &temp_arrays_for_convert,
     blender::Vector<CustomDataLayer, 16> &vert_layers_to_write);
diff --git a/source/blender/blenkernel/intern/mesh.cc b/source/blender/blenkernel/intern/mesh.cc
index 0a8f717f7d3..2a968567d2a 100644
--- a/source/blender/blenkernel/intern/mesh.cc
+++ b/source/blender/blenkernel/intern/mesh.cc
@@ -254,7 +254,8 @@ static void mesh_blend_write(BlendWriter *writer, ID *id, const void *id_address
     Set<std::string> names_to_skip;
     if (!BLO_write_is_undo(writer)) {
       /* When converting to the old mesh format, don't save redundant attributes. */
-      names_to_skip.add_multiple_new({".hide_vert",
+      names_to_skip.add_multiple_new({"position",
+                                      ".hide_vert",
                                       ".hide_edge",
                                       ".hide_poly",
                                       "material_index",
@@ -262,8 +263,13 @@ static void mesh_blend_write(BlendWriter *writer, ID *id, const void *id_address
                                       ".selection_edge",
                                       ".selection_poly"});
 
+      mesh->mvert = BKE_mesh_legacy_convert_positions_to_verts(
+          mesh, temp_arrays_for_legacy_format, vert_layers);
+      BKE_mesh_legacy_convert_hide_layers_to_flags(mesh);
+      BKE_mesh_legacy_convert_material_indices_to_mpoly(mesh);
+      BKE_mesh_legacy_bevel_weight_from_layers(mesh);
+
       /* Set deprecated mesh data pointers for forward compatibility. */
-      mesh->mvert = static_cast<MVert *>(CustomData_get_layer(&mesh->vdata, CD_MVERT));
       mesh->medge = const_cast<MEdge *>(mesh->edges().data());
       mesh->mpoly = const_cast<MPoly *>(mesh->polys().data());
       mesh->mloop = const_cast<MLoop *>(mesh->loops().data());
@@ -274,13 +280,6 @@ static void mesh_blend_write(BlendWriter *writer, ID *id, const void *id_address
     CustomData_blend_write_prepare(mesh->edata, edge_layers, names_to_skip);
     CustomData_blend_write_prepare(mesh->ldata, loop_layers, names_to_skip);
     CustomData_blend_write_prepare(mesh->pdata, poly_layers, names_to_skip);
-
-    if (!BLO_write_is_undo(writer)) {
-      BKE_mesh_legacy_convert_positions_to_verts(mesh, temp_arrays_for_legacy_format, vert_layers);
-      BKE_mesh_legacy_convert_hide_layers_to_flags(mesh);
-      BKE_mesh_legacy_convert_material_indices_to_mpoly(mesh);
-      BKE_mesh_legacy_bevel_weight_from_layers(mesh);
-    }
   }
 
   BLO_write_id_struct(writer, Mesh, id_address, &mesh->id);
diff --git a/source/blender/blenkernel/intern/mesh_legacy_convert.cc b/source/blender/blenkernel/intern/mesh_legacy_convert.cc
index aee8d1251ad..3b44a2050eb 100644
--- a/source/blender/blenkernel/intern/mesh_legacy_convert.cc
+++ b/source/blender/blenkernel/intern/mesh_legacy_convert.cc
@@ -930,8 +930,7 @@ void BKE_mesh_add_mface_layers(CustomData *fdata, CustomData *ldata, int total)
 void BKE_mesh_legacy_bevel_weight_from_layers(Mesh *mesh)
 {
   using namespace blender;
-  MutableSpan<MVert> verts(static_cast<MVert *>(CustomData_get_layer(&mesh->vdata, CD_MVERT)),
-                           mesh->totvert);
+  MutableSpan<MVert> verts(mesh->mvert, mesh->totvert);
   if (const float *weights = static_cast<const float *>(
           CustomData_get_layer(&mesh->vdata, CD_BWEIGHT))) {
     mesh->cd_flag |= ME_CDFLAG_VERT_BWEIGHT;
@@ -964,8 +963,7 @@ void BKE_mesh_legacy_bevel_weight_from_layers(Mesh *mesh)
 void BKE_mesh_legacy_bevel_weight_to_layers(Mesh *mesh)
 {
   using namespace blender;
-  const Span<MVert> verts(static_cast<MVert *>(CustomData_get_layer(&mesh->vdata, CD_MVERT)),
-                          mesh->totvert);
+  const Span<MVert> verts(mesh->mvert, mesh->totvert);
   if (mesh->cd_flag & ME_CDFLAG_VERT_BWEIGHT) {
     float *weights = static_cast<float *>(
         CustomData_add_layer(&mesh->vdata, CD_BWEIGHT, CD_CONSTRUCT, nullptr, verts.size()));
@@ -996,8 +994,7 @@ void BKE_mesh_legacy_convert_hide_layers_to_flags(Mesh *mesh)
   using namespace blender::bke;
   const AttributeAccessor attributes = mesh->attributes();
 
-  MutableSpan<MVert> verts(static_cast<MVert *>(CustomData_get_layer(&mesh->vdata, CD_MVERT)),
-                           mesh->totvert);
+  MutableSpan<MVert> verts(mesh->mvert, mesh->totvert);
   const VArray<bool> hide_vert = attributes.lookup_or_default<bool>(
       ".hide_vert", ATTR_DOMAIN_POINT, false);
   threading::parallel_for(verts.index_range(), 4096, [&](IndexRange range) {
@@ -1031,8 +1028,7 @@ void BKE_mesh_legacy_convert_flags_to_hide_layers(Mesh *mesh)
   using namespace blender::bke;
   MutableAttributeAccessor attributes = mesh->attributes_for_write();
 
-  const Span<MVert> verts(static_cast<MVert *>(CustomData_get_layer(&mesh->vdata, CD_MVERT)),
-                          mesh->totvert);
+  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>(
@@ -1124,8 +1120,7 @@ void BKE_mesh_legacy_convert_selection_layers_to_flags(Mesh *mesh)
   using namespace blender::bke;
   const AttributeAccessor attributes = mesh->attributes();
 
-  MutableSpan<MVert> verts(static_cast<MVert *>(CustomData_get_layer(&mesh->vdata, CD_MVERT)),
-                           mesh->totvert);
+  MutableSpan<MVert> verts(mesh->mvert, mesh->totvert);
   const VArray<bool> selection_vert = attributes.lookup_or_default<bool>(
       ".selection_vert", ATTR_DOMAIN_POINT, false);
   threading::parallel_for(verts.index_range(), 4096, [&](IndexRange range) {
@@ -1159,8 +1154,7 @@ void BKE_mesh_legacy_convert_flags_to_selection_layers(Mesh *mesh)
   using namespace blender::bke;
   MutableAttributeAccessor attributes = mesh->attributes_for_write();
 
-  const Span<MVert> verts(static_cast<MVert *>(CustomData_get_layer(&mesh->vdata, CD_MVERT)),
-                          mesh->totvert);
+  const Span<MVert> verts(mesh->mvert, mesh->totvert);
   if (std::any_of(
           verts.begin(), verts.end(), [](const MVert &vert) { return vert.flag & SELECT; })) {
     SpanAttributeWriter<bool> selection_vert = attributes.lookup_or_add_for_write_only_span<bool>(
@@ -1206,36 +1200,28 @@ void BKE_mesh_legacy_convert_flags_to_selection_layers(Mesh *mesh)
 /** \name Vertex and Position Conversion
  * \{ */
 
-void BKE_mesh_legacy_convert_positions_to_verts(
+MVert *BKE_mesh_legacy_convert_positions_to_verts(
     Mesh *mesh,
     blender::ResourceScope &temp_arrays_for_convert,
     blender::Vector<CustomDataLayer, 16> &vert_layers_to_write)
 {
   using namespace blender;
-  Vector<CustomDataLayer, 16> new_layer_to_write;
 
-  for (const CustomDataLayer &layer : vert_layers_to_write) {
-    if (layer.type != CD_PROP_FLOAT2) {
-      new_layer_to_write.append(layer);
-      continue;
-    }
-    const Span<float3> positions{static_cast<const float3 *>(layer.data), mesh->totvert};
-    CustomDataLayer mvert_layer = layer;
-    mvert_layer.type = CD_MVERT;
-    MutableSpan<MVert> verts = temp_arrays_for_convert.construct<Array<MVert>>(mesh->totvert);
-    mvert_layer.data = verts.data();
+  const Span<float3> positions = mesh->positions();
 
-    threading::parallel_for(verts.index_range(), 2048, [&](IndexRange range) {
-      for (const int i : range) {
-        copy_v3_v3(verts[i].co, positions[i]);
-      }
-    });
-    new_layer_to_write.append(mvert_layer);
-  }
+  CustomDataLayer mvert_layer{};
+  mvert_layer.type = CD_MVERT;
+  MutableSpan<MVert> verts = temp_arrays_for_convert.construct<Array<MVert>>(mesh->totvert);
+  mvert_layer.data = verts.data();
+
+  threading::parallel_for(verts.index_range(), 2048, [&](IndexRange range) {
+    for (const int i : range) {
+      copy_v3_v3(verts[i].co, positions[i]);
+    }
+  });
 
-  vert_layers_to_write = new_layer_to_write;
-  mesh->ldata.totlayer = new_layer_to_write.size();
-  mesh->ldata.maxlayer = mesh->ldata.totlayer;
+  vert_layers_to_write.append(mvert_layer);
+  return verts.data();
 }
 
 void BKE_mesh_legacy_convert_verts_to_positions(Mesh *mesh)



More information about the Bf-blender-cvs mailing list