[Bf-blender-cvs] [fd395c9a0a2] refactor-mesh-position-generic: Merge branch 'master' into refactor-mesh-position-generic

Hans Goudey noreply at git.blender.org
Fri Dec 16 01:04:06 CET 2022


Commit: fd395c9a0a2b5cc874e38c6d1236e9ba7e982d30
Author: Hans Goudey
Date:   Thu Dec 15 17:47:51 2022 -0600
Branches: refactor-mesh-position-generic
https://developer.blender.org/rBfd395c9a0a2b5cc874e38c6d1236e9ba7e982d30

Merge branch 'master' into refactor-mesh-position-generic

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



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

diff --cc source/blender/blenkernel/BKE_mesh_legacy_convert.h
index 97234ccd139,65804e9ac24..a561cf9e8fd
--- a/source/blender/blenkernel/BKE_mesh_legacy_convert.h
+++ b/source/blender/blenkernel/BKE_mesh_legacy_convert.h
@@@ -89,13 -85,9 +87,16 @@@ void BKE_mesh_legacy_convert_mpoly_to_m
  /** Convert from runtime loose edge cache to legacy edge flag. */
  void BKE_mesh_legacy_convert_loose_edges_to_flag(struct Mesh *mesh);
  
+ void BKE_mesh_legacy_attribute_flags_to_strings(struct Mesh *mesh);
+ void BKE_mesh_legacy_attribute_strings_to_flags(struct Mesh *mesh);
+ 
 +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);
 +
 +void BKE_mesh_legacy_convert_verts_to_positions(Mesh *mesh);
 +
  #endif
  
  /**
diff --cc source/blender/blenkernel/intern/mesh.cc
index 7672223bd83,6ec171c4bcc..4e783ad428c
--- a/source/blender/blenkernel/intern/mesh.cc
+++ b/source/blender/blenkernel/intern/mesh.cc
@@@ -268,9 -257,21 +272,12 @@@ static void mesh_blend_write(BlendWrite
        BKE_mesh_legacy_bevel_weight_from_layers(mesh);
        BKE_mesh_legacy_face_set_from_generic(mesh, poly_layers);
        BKE_mesh_legacy_edge_crease_from_layers(mesh);
+       BKE_mesh_legacy_attribute_strings_to_flags(mesh);
+       mesh->active_color_attribute = nullptr;
+       mesh->default_color_attribute = nullptr;
        BKE_mesh_legacy_convert_loose_edges_to_flag(mesh);
 -      /* When converting to the old mesh format, don't save redundant attributes. */
 -      names_to_skip.add_multiple_new({".hide_vert",
 -                                      ".hide_edge",
 -                                      ".hide_poly",
 -                                      "material_index",
 -                                      ".select_vert",
 -                                      ".select_edge",
 -                                      ".select_poly"});
  
        /* Set deprecated mesh data pointers for forward compatibility. */
 -      mesh->mvert = const_cast<MVert *>(mesh->verts().data());
        mesh->medge = const_cast<MEdge *>(mesh->edges().data());
        mesh->mpoly = const_cast<MPoly *>(mesh->polys().data());
        mesh->mloop = const_cast<MLoop *>(mesh->loops().data());
diff --cc source/blender/blenkernel/intern/mesh_convert.cc
index f66d7c2b69b,7a4c3c0834b..f0442d4b8bf
--- a/source/blender/blenkernel/intern/mesh_convert.cc
+++ b/source/blender/blenkernel/intern/mesh_convert.cc
@@@ -1080,143 -1102,7 +1080,6 @@@ Mesh *BKE_mesh_new_from_object_to_bmain
    return mesh_in_bmain;
  }
  
- static void add_shapekey_layers(Mesh *mesh_dest, Mesh *mesh_src)
- {
-   KeyBlock *kb;
-   Key *key = mesh_src->key;
-   int i;
- 
-   if (!mesh_src->key) {
-     return;
-   }
- 
-   /* ensure we can use mesh vertex count for derived mesh custom data */
-   if (mesh_src->totvert != mesh_dest->totvert) {
-     CLOG_ERROR(&LOG,
-                "vertex size mismatch (mesh/dm) '%s' (%d != %d)",
-                mesh_src->id.name + 2,
-                mesh_src->totvert,
-                mesh_dest->totvert);
-     return;
-   }
- 
-   for (i = 0, kb = (KeyBlock *)key->block.first; kb; kb = kb->next, i++) {
-     int ci;
-     float *array;
- 
-     if (mesh_src->totvert != kb->totelem) {
-       CLOG_ERROR(&LOG,
-                  "vertex size mismatch (Mesh '%s':%d != KeyBlock '%s':%d)",
-                  mesh_src->id.name + 2,
-                  mesh_src->totvert,
-                  kb->name,
-                  kb->totelem);
-       array = (float *)MEM_calloc_arrayN(size_t(mesh_src->totvert), sizeof(float[3]), __func__);
-     }
-     else {
-       array = (float *)MEM_malloc_arrayN(size_t(mesh_src->totvert), sizeof(float[3]), __func__);
-       memcpy(array, kb->data, sizeof(float[3]) * size_t(mesh_src->totvert));
-     }
- 
-     CustomData_add_layer_named(
-         &mesh_dest->vdata, CD_SHAPEKEY, CD_ASSIGN, array, mesh_dest->totvert, kb->name);
-     ci = CustomData_get_layer_index_n(&mesh_dest->vdata, CD_SHAPEKEY, i);
- 
-     mesh_dest->vdata.layers[ci].uid = kb->uid;
-   }
- }
- 
- Mesh *BKE_mesh_create_derived_for_modifier(struct Depsgraph *depsgraph,
-                                            Scene *scene,
-                                            Object *ob_eval,
-                                            ModifierData *md_eval,
-                                            const bool use_virtual_modifiers,
-                                            const bool build_shapekey_layers)
- {
-   Mesh *me = ob_eval->runtime.data_orig ? (Mesh *)ob_eval->runtime.data_orig :
-                                           (Mesh *)ob_eval->data;
-   const ModifierTypeInfo *mti = BKE_modifier_get_info((ModifierType)md_eval->type);
-   Mesh *result = nullptr;
-   KeyBlock *kb;
-   ModifierEvalContext mectx = {depsgraph, ob_eval, MOD_APPLY_TO_BASE_MESH};
- 
-   if (!(md_eval->mode & eModifierMode_Realtime)) {
-     return result;
-   }
- 
-   if (mti->isDisabled && mti->isDisabled(scene, md_eval, false)) {
-     return result;
-   }
- 
-   if (build_shapekey_layers && me->key &&
-       (kb = (KeyBlock *)BLI_findlink(&me->key->block, ob_eval->shapenr - 1))) {
-     MutableSpan<float3> verts = me->positions_for_write();
-     BKE_keyblock_convert_to_mesh(kb, reinterpret_cast<float(*)[3]>(verts.data()), me->totvert);
-   }
- 
-   Mesh *mesh_temp = (Mesh *)BKE_id_copy_ex(nullptr, &me->id, nullptr, LIB_ID_COPY_LOCALIZE);
-   int numVerts = 0;
-   float(*deformedVerts)[3] = nullptr;
- 
-   if (use_virtual_modifiers) {
-     VirtualModifierData virtualModifierData;
-     for (ModifierData *md_eval_virt =
-              BKE_modifiers_get_virtual_modifierlist(ob_eval, &virtualModifierData);
-          md_eval_virt && (md_eval_virt != ob_eval->modifiers.first);
-          md_eval_virt = md_eval_virt->next) {
-       if (!BKE_modifier_is_enabled(scene, md_eval_virt, eModifierMode_Realtime)) {
-         continue;
-       }
-       /* All virtual modifiers are deform modifiers. */
-       const ModifierTypeInfo *mti_virt = BKE_modifier_get_info((ModifierType)md_eval_virt->type);
-       BLI_assert(mti_virt->type == eModifierTypeType_OnlyDeform);
-       if (mti_virt->type != eModifierTypeType_OnlyDeform) {
-         continue;
-       }
- 
-       if (deformedVerts == nullptr) {
-         deformedVerts = BKE_mesh_vert_coords_alloc(me, &numVerts);
-       }
-       mti_virt->deformVerts(md_eval_virt, &mectx, mesh_temp, deformedVerts, numVerts);
-     }
-   }
- 
-   if (mti->type == eModifierTypeType_OnlyDeform) {
-     if (deformedVerts == nullptr) {
-       deformedVerts = BKE_mesh_vert_coords_alloc(me, &numVerts);
-     }
-     result = mesh_temp;
-     mti->deformVerts(md_eval, &mectx, result, deformedVerts, numVerts);
-     BKE_mesh_vert_coords_apply(result, deformedVerts);
- 
-     if (build_shapekey_layers) {
-       add_shapekey_layers(result, me);
-     }
-   }
-   else {
-     if (deformedVerts != nullptr) {
-       BKE_mesh_vert_coords_apply(mesh_temp, deformedVerts);
-     }
- 
-     if (build_shapekey_layers) {
-       add_shapekey_layers(mesh_temp, me);
-     }
- 
-     result = mti->modifyMesh(md_eval, &mectx, mesh_temp);
-     ASSERT_IS_VALID_MESH(result);
- 
-     if (mesh_temp != result) {
-       BKE_id_free(nullptr, mesh_temp);
-     }
-   }
- 
-   if (deformedVerts != nullptr) {
-     MEM_freeN(deformedVerts);
-   }
- 
-   return result;
- }
--
  static KeyBlock *keyblock_ensure_from_uid(Key &key, const int uid, const StringRefNull name)
  {
    if (KeyBlock *kb = BKE_keyblock_find_uid(&key, uid)) {
diff --cc source/blender/blenkernel/intern/mesh_legacy_convert.cc
index d3e93484784,a53b0e66924..f106a89c55c
--- a/source/blender/blenkernel/intern/mesh_legacy_convert.cc
+++ b/source/blender/blenkernel/intern/mesh_legacy_convert.cc
@@@ -938,10 -931,11 +938,11 @@@ int BKE_mesh_mface_index_validate(MFac
    return nr;
  }
  
- static int mesh_tessface_calc(CustomData *fdata,
+ static int mesh_tessface_calc(Mesh &mesh,
+                               CustomData *fdata,
                                CustomData *ldata,
                                CustomData *pdata,
 -                              MVert *mvert,
 +                              float (*positions)[3],
                                int totface,
                                int totloop,
                                int totpoly)
@@@ -1185,10 -1179,11 +1186,11 @@@
  
  void BKE_mesh_tessface_calc(Mesh *mesh)
  {
-   mesh->totface = mesh_tessface_calc(&mesh->fdata,
+   mesh->totface = mesh_tessface_calc(*mesh,
+                                      &mesh->fdata,
                                       &mesh->ldata,
                                       &mesh->pdata,
 -                                     BKE_mesh_verts_for_write(mesh),
 +                                     BKE_mesh_positions_for_write(mesh),
                                       mesh->totface,
                                       mesh->totloop,
                                       mesh->totpoly);
@@@ -1575,52 -1570,122 +1577,172 @@@ void BKE_mesh_legacy_convert_loose_edge
  
  /** \} */
  
 +/* -------------------------------------------------------------------- */
 +/** \name Vertex and Position Conversion
 + * \{ */
 +
 +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;
 +
 +  const Span<float3> positions = mesh->positions();
 +
 +  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_legacy, positions[i]);
 +    }
 +  });
 +
 +  vert_layers_to_write.append(mvert_layer);
 +  return verts.data();
 +}
 +
 +void BKE_mesh_legacy_convert_verts_to_positions(Mesh *mesh)
 +{
 +  using namespace blender;
 +  using namespace blender::bke;
 +
 +  const Span<MVer

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list