[Bf-blender-cvs] [cfe35802aaa] refactor-mesh-uv-map-generic: Merge branch 'master' into refactor-mesh-uv-map-generic

Hans Goudey noreply at git.blender.org
Tue Sep 6 04:51:22 CEST 2022


Commit: cfe35802aaa22b6aaf78b840c8b7410e8bef0376
Author: Hans Goudey
Date:   Mon Sep 5 21:17:28 2022 -0500
Branches: refactor-mesh-uv-map-generic
https://developer.blender.org/rBcfe35802aaa22b6aaf78b840c8b7410e8bef0376

Merge branch 'master' into refactor-mesh-uv-map-generic

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



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

diff --cc release/scripts/startup/bl_ui/properties_data_mesh.py
index 5b3c4101d59,686d455b6b4..91a3dec8ac8
--- a/release/scripts/startup/bl_ui/properties_data_mesh.py
+++ b/release/scripts/startup/bl_ui/properties_data_mesh.py
@@@ -580,8 -580,9 +580,8 @@@ class DATA_PT_mesh_attributes(MeshButto
          colliding_names = []
          for collection in (
                  # Built-in names.
-                 {"position": None, "material_index": None, "shade_smooth": None, "normal": None, "crease": None},
+                 {"position": None, "shade_smooth": None, "normal": None, "crease": None},
                  mesh.attributes,
 -                mesh.uv_layers,
                  ob.vertex_groups,
          ):
              for name in collection.keys():
diff --cc source/blender/blenkernel/BKE_mesh_legacy_convert.h
index 841d7f113aa,11ee86c62a7..cf39132481d
--- a/source/blender/blenkernel/BKE_mesh_legacy_convert.h
+++ b/source/blender/blenkernel/BKE_mesh_legacy_convert.h
@@@ -44,12 -27,16 +44,22 @@@ void BKE_mesh_legacy_convert_hide_layer
   */
  void BKE_mesh_legacy_convert_flags_to_hide_layers(struct Mesh *mesh);
  
 +#endif
 +
 +#ifdef __cplusplus
 +extern "C" {
 +#endif
 +
+ /**
+  * Move material indices from a generic attribute to #MPoly.
+  */
+ void BKE_mesh_legacy_convert_material_indices_to_mpoly(struct Mesh *mesh);
+ /**
+  * Move material indices from the #MPoly struct to a generic attributes.
+  * Only add the attribute when the indices are not all zero.
+  */
+ void BKE_mesh_legacy_convert_mpoly_to_material_indices(struct Mesh *mesh);
+ 
  /**
   * Recreate #MFace Tessellation.
   *
diff --cc source/blender/blenkernel/intern/fluid.c
index 12d7acd4e88,24c61a792eb..b982f70965a
--- a/source/blender/blenkernel/intern/fluid.c
+++ b/source/blender/blenkernel/intern/fluid.c
@@@ -2081,18 -2073,13 +2073,14 @@@ static void emit_from_mesh
      Mesh *me = BKE_mesh_copy_for_eval(ffs->mesh, true);
  
      /* Duplicate vertices to modify. */
-     if (me->mvert) {
-       me->mvert = MEM_dupallocN(me->mvert);
-       CustomData_set_layer(&me->vdata, CD_MVERT, me->mvert);
-     }
+     MVert *verts = MEM_dupallocN(BKE_mesh_vertices(me));
  
-     MVert *mvert = me->mvert;
-     const MLoop *mloop = me->mloop;
+     const MLoop *mloop = BKE_mesh_loops(me);
      const MLoopTri *mlooptri = BKE_mesh_runtime_looptri_ensure(me);
      const int numverts = me->totvert;
-     const MDeformVert *dvert = CustomData_get_layer(&me->vdata, CD_MDEFORMVERT);
+     const MDeformVert *dvert = BKE_mesh_deform_verts(me);
 -    const MLoopUV *mloopuv = CustomData_get_layer_named(&me->ldata, CD_MLOOPUV, ffs->uvlayer_name);
 +    const float(*mloopuv)[2] = CustomData_get_layer_named(
 +        &me->ldata, CD_PROP_FLOAT2, ffs->uvlayer_name);
  
      if (ffs->flags & FLUID_FLOW_INITVELOCITY) {
        vert_vel = MEM_callocN(sizeof(float[3]) * numverts, "manta_flow_velocity");
diff --cc source/blender/blenkernel/intern/mesh.cc
index 2f32e09e25b,c0379c50de4..3a7a098535a
--- a/source/blender/blenkernel/intern/mesh.cc
+++ b/source/blender/blenkernel/intern/mesh.cc
@@@ -346,7 -344,7 +349,8 @@@ static void mesh_blend_read_data(BlendD
  
    if (!BLO_read_data_is_undo(reader)) {
      BKE_mesh_legacy_convert_flags_to_hide_layers(mesh);
 +    BKE_mesh_legacy_convert_uvs_to_generic(mesh);
+     BKE_mesh_legacy_convert_mpoly_to_material_indices(mesh);
    }
  
    /* We don't expect to load normals from files, since they are derived data. */
@@@ -467,8 -465,12 +471,10 @@@ static int customdata_compare
    CustomDataLayer *l1, *l2;
    int layer_count1 = 0, layer_count2 = 0, j;
    const uint64_t cd_mask_non_generic = CD_MASK_MVERT | CD_MASK_MEDGE | CD_MASK_MPOLY |
 -                                       CD_MASK_MLOOPUV | CD_MASK_PROP_BYTE_COLOR |
 -                                       CD_MASK_MDEFORMVERT;
 +                                       CD_MASK_PROP_BYTE_COLOR | CD_MASK_MDEFORMVERT;
    const uint64_t cd_mask_all_attr = CD_MASK_PROP_ALL | cd_mask_non_generic;
+   const Span<MLoop> loops_1 = m1->loops();
+   const Span<MLoop> loops_2 = m2->loops();
  
    for (int i = 0; i < c1->totlayer; i++) {
      l1 = &c1->layers[i];
diff --cc source/blender/blenkernel/intern/mesh_convert.cc
index 6c1ae6a9c7a,e56c248e81a..5aff587deec
--- a/source/blender/blenkernel/intern/mesh_convert.cc
+++ b/source/blender/blenkernel/intern/mesh_convert.cc
@@@ -194,8 -193,11 +193,11 @@@ static Mesh *mesh_nurbs_displist_to_mes
    MEdge *medge = edges.data();
    MPoly *mpoly = polys.data();
    MLoop *mloop = loops.data();
+   MutableAttributeAccessor attributes = mesh_attributes_for_write(*mesh);
+   SpanAttributeWriter<int> material_indices = attributes.lookup_or_add_for_write_only_span<int>(
+       "material_index", ATTR_DOMAIN_FACE);
 -  MLoopUV *mloopuv = static_cast<MLoopUV *>(CustomData_add_layer_named(
 -      &mesh->ldata, CD_MLOOPUV, CD_SET_DEFAULT, nullptr, mesh->totloop, "UVMap"));
 +  blender::float2 *mloopuv = static_cast<blender::float2 *>(CustomData_add_layer_named(
 +      &mesh->ldata, CD_PROP_FLOAT2, CD_SET_DEFAULT, nullptr, mesh->totloop, "UVMap"));
  
    /* verts and faces */
    vertcount = 0;
diff --cc source/blender/blenkernel/intern/mesh_legacy_convert.cc
index 170489e9d9f,c2a4b0176c6..af3c51758b9
--- a/source/blender/blenkernel/intern/mesh_legacy_convert.cc
+++ b/source/blender/blenkernel/intern/mesh_legacy_convert.cc
@@@ -965,177 -1001,43 +1004,215 @@@ void BKE_mesh_legacy_convert_flags_to_h
    }
  }
  
+ /** \} */
+ /* -------------------------------------------------------------------- */
+ /** \name Material Index Conversion
+  * \{ */
+ 
+ void BKE_mesh_legacy_convert_material_indices_to_mpoly(Mesh *mesh)
+ {
+   using namespace blender;
+   using namespace blender::bke;
+   const AttributeAccessor attributes = mesh_attributes(*mesh);
+   MutableSpan<MPoly> polys = mesh->polygons_for_write();
+   const VArray<int> material_indices = attributes.lookup_or_default<int>(
+       "material_index", ATTR_DOMAIN_FACE, 0);
+   threading::parallel_for(polys.index_range(), 4096, [&](IndexRange range) {
+     for (const int i : range) {
+       polys[i].mat_nr = material_indices[i];
+     }
+   });
+ }
+ 
+ void BKE_mesh_legacy_convert_mpoly_to_material_indices(Mesh *mesh)
+ {
+   using namespace blender;
+   using namespace blender::bke;
+   MutableAttributeAccessor attributes = mesh_attributes_for_write(*mesh);
+   const Span<MPoly> polys = mesh->polygons();
+   if (std::any_of(
+           polys.begin(), polys.end(), [](const MPoly &poly) { return poly.mat_nr != 0; })) {
+     SpanAttributeWriter<int> material_indices = attributes.lookup_or_add_for_write_only_span<int>(
+         "material_index", ATTR_DOMAIN_FACE);
+     threading::parallel_for(polys.index_range(), 4096, [&](IndexRange range) {
+       for (const int i : range) {
+         material_indices.span[i] = polys[i].mat_nr;
+       }
+     });
+     material_indices.finish();
+   }
+ }
+ 
  /** \} */
 +
 +/* -------------------------------------------------------------------- */
 +/** \name Generic UV Map Conversion
 + * \{ */
 +
 +void BKE_mesh_legacy_convert_uvs_to_struct(
 +    Mesh *mesh,
 +    blender::ResourceScope &temp_mloopuv_for_convert,
 +    blender::Vector<CustomDataLayer, 16> &face_corner_layers_to_write)
 +{
 +  using namespace blender;
 +  using namespace blender::bke;
 +  const AttributeAccessor attributes = mesh_attributes(*mesh);
 +
 +  Vector<CustomDataLayer, 16> new_layer_to_write;
 +
 +  /* Don't write the boolean UV map sublayers which will be written in the legacy #MLoopUV type. */
 +  Set<std::string> uv_sublayers_to_skip;
 +  for (const CustomDataLayer &layer : face_corner_layers_to_write) {
 +    uv_sublayers_to_skip.add_multiple_new({get_uv_map_vert_selection_name(layer.name),
 +                                           get_uv_map_edge_selection_name(layer.name),
 +                                           get_uv_map_pin_name(layer.name)});
 +  }
 +
 +  for (const CustomDataLayer &layer : face_corner_layers_to_write) {
 +    if (uv_sublayers_to_skip.contains_as(layer.name)) {
 +      continue;
 +    }
 +    if (layer.type != CD_PROP_FLOAT2) {
 +      new_layer_to_write.append(layer);
 +      continue;
 +    }
 +    const Span<float2> coords{static_cast<const float2 *>(layer.data), mesh->totloop};
 +    CustomDataLayer mloopuv_layer = layer;
 +    mloopuv_layer.type = CD_MLOOPUV;
 +    MutableSpan<MLoopUV> mloopuv = temp_mloopuv_for_convert.construct<Array<MLoopUV>>(
 +        mesh->totloop);
 +    mloopuv_layer.data = mloopuv.data();
 +
 +    const VArray<bool> vert_selection = attributes.lookup_or_default<bool>(
 +        get_uv_map_vert_selection_name(layer.name), ATTR_DOMAIN_CORNER, false);
 +    const VArray<bool> edge_selection = attributes.lookup_or_default<bool>(
 +        get_uv_map_edge_selection_name(layer.name), ATTR_DOMAIN_CORNER, false);
 +    const VArray<bool> pin = attributes.lookup_or_default<bool>(
 +        get_uv_map_pin_name(layer.name), ATTR_DOMAIN_CORNER, false);
 +
 +    threading::parallel_for(mloopuv.index_range(), 2048, [&](IndexRange range) {
 +      for (const int i : range) {
 +        copy_v2_v2(mloopuv[i].uv, coords[i]);
 +        SET_FLAG_FROM_TEST(mloopuv[i].flag, vert_selection[i], MLOOPUV_VERTSEL);
 +        SET_FLAG_FROM_TEST(mloopuv[i].flag, edge_selection[i], MLOOPUV_EDGESEL);
 +        SET_FLAG_FROM_TEST(mloopuv[i].flag, pin[i], MLOOPUV_PINNED);
 +      }
 +    });
 +    new_layer_to_write.append(mloopuv_layer);
 +  }
 +
 +  face_corner_layers_to_write = new_layer_to_write;
 +  mesh->ldata.totlayer = new_layer_to_write.size();
 +  mesh->ldata.maxlayer = mesh->ldata.totlayer;
 +}
 +
 +void BKE_mesh_legacy_convert_uvs_to_generic(Mesh *mesh)
 +{
 +  using namespace blender;
 +  using namespace blender::bke;
 +
 +  /* Store layer names since they will be removed, used to set the active status of new layers.
 +   * Use intermediate #StringRef because the names can be null. */
 +  const std::string active_uv = StringRef(
 +      CustomData_get_active_layer_name(&mesh->ldata, CD_MLOOPUV));
 +  const std::string default_uv = StringRef(
 +      CustomData_get_render_layer_name(&mesh->ldata, CD_MLOOPUV));
 +
 +  Set<std::string> uv_layers_to_convert

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list