[Bf-blender-cvs] [de29ddebfc9] refactor-mesh-remove-pointers: Merge branch 'master' into refactor-mesh-remove-pointers

Hans Goudey noreply at git.blender.org
Wed Aug 24 19:19:24 CEST 2022


Commit: de29ddebfc972cbf4b5a63eb9b39b2d4a4ff6abe
Author: Hans Goudey
Date:   Wed Aug 24 11:39:52 2022 -0400
Branches: refactor-mesh-remove-pointers
https://developer.blender.org/rBde29ddebfc972cbf4b5a63eb9b39b2d4a4ff6abe

Merge branch 'master' into refactor-mesh-remove-pointers

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



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

diff --cc source/blender/blenkernel/intern/bvhutils.cc
index e70fd8bd577,d0b57b45d35..ca20ca678b1
--- a/source/blender/blenkernel/intern/bvhutils.cc
+++ b/source/blender/blenkernel/intern/bvhutils.cc
@@@ -1322,8 -1284,8 +1322,8 @@@ BVHTree *BKE_bvhtree_from_mesh_get(stru
      case BVHTREE_FROM_LOOPTRI_NO_HIDDEN: {
        blender::bke::AttributeAccessor attributes = blender::bke::mesh_attributes(*mesh);
        mask = looptri_no_hidden_map_get(
-           polygons.data(),
-           attributes.lookup_or_default(".hide_face", ATTR_DOMAIN_FACE, false),
 -          mesh->mpoly,
++          blender::bke::mesh_polygons(*mesh).data(),
+           attributes.lookup_or_default(".hide_poly", ATTR_DOMAIN_FACE, false),
            looptri_len,
            &mask_bits_act_len);
        ATTR_FALLTHROUGH;
diff --cc source/blender/blenkernel/intern/mball_tessellate.c
index 54def0189b1,61f5a5f315f..5e1f5ffb0d2
--- a/source/blender/blenkernel/intern/mball_tessellate.c
+++ b/source/blender/blenkernel/intern/mball_tessellate.c
@@@ -1436,34 -1436,57 +1436,55 @@@ Mesh *BKE_mball_polygonize(Depsgraph *d
    polygonize(&process);
    if (process.curindex == 0) {
      freepolygonize(&process);
-     return;
+     return NULL;
    }
  
-   /* add resulting surface to displist */
+   freepolygonize(&process);
  
-   /* Avoid over-allocation since this is stored in the displist. */
-   if (process.curindex != process.totindex) {
-     process.indices = MEM_reallocN(process.indices, sizeof(int[4]) * process.curindex);
-   }
-   if (process.curvertex != process.totvertex) {
-     process.co = MEM_reallocN(process.co, process.curvertex * sizeof(float[3]));
-     process.no = MEM_reallocN(process.no, process.curvertex * sizeof(float[3]));
-   }
+   Mesh *mesh = (Mesh *)BKE_id_new_nomain(ID_ME, ((ID *)ob->data)->name + 2);
  
-   DispList *dl = MEM_callocN(sizeof(DispList), "mballdisp");
-   BLI_addtail(dispbase, dl);
-   dl->type = DL_INDEX4;
-   dl->nr = (int)process.curvertex;
-   dl->parts = (int)process.curindex;
+   mesh->totvert = (int)process.curvertex;
+   MVert *mvert = CustomData_add_layer(&mesh->vdata, CD_MVERT, CD_DEFAULT, NULL, mesh->totvert);
+   for (int i = 0; i < mesh->totvert; i++) {
+     copy_v3_v3(mvert[i].co, process.co[i]);
+     mvert->bweight = 0;
+     mvert->flag = 0;
+   }
+   MEM_freeN(process.co);
+ 
+   mesh->totpoly = (int)process.curindex;
+   MPoly *mpoly = CustomData_add_layer(&mesh->pdata, CD_MPOLY, CD_DEFAULT, NULL, mesh->totpoly);
+   MLoop *mloop = CustomData_add_layer(&mesh->ldata, CD_MLOOP, CD_DEFAULT, NULL, mesh->totpoly * 4);
+ 
+   int loop_offset = 0;
+   for (int i = 0; i < mesh->totpoly; i++) {
+     const int *indices = process.indices[i];
+ 
+     const int count = indices[2] != indices[3] ? 4 : 3;
+     mpoly[i].loopstart = loop_offset;
+     mpoly[i].totloop = count;
+     mpoly[i].flag = ME_SMOOTH;
+ 
+     mloop[loop_offset].v = (uint32_t)indices[0];
+     mloop[loop_offset + 1].v = (uint32_t)indices[1];
+     mloop[loop_offset + 2].v = (uint32_t)indices[2];
+     if (count == 4) {
+       mloop[loop_offset + 3].v = (uint32_t)indices[3];
+     }
  
-   dl->index = (int *)process.indices;
+     loop_offset += count;
+   }
+   MEM_freeN(process.indices);
  
-   for (uint a = 0; a < process.curvertex; a++) {
-     normalize_v3(process.no[a]);
+   for (int i = 0; i < mesh->totvert; i++) {
+     normalize_v3(process.no[i]);
    }
+   mesh->runtime.vert_normals = process.no;
+   BKE_mesh_vertex_normals_clear_dirty(mesh);
  
-   dl->verts = (float *)process.co;
-   dl->nors = (float *)process.no;
+   mesh->totloop = loop_offset;
  
-   freepolygonize(&process);
 -  BKE_mesh_update_customdata_pointers(mesh, false);
 -
+   BKE_mesh_calc_edges(mesh, false, false);
+ 
+   return mesh;
  }
diff --cc source/blender/blenkernel/intern/mesh.cc
index 976ffc6ee7e,7f2c09f049b..b349770b1e2
--- a/source/blender/blenkernel/intern/mesh.cc
+++ b/source/blender/blenkernel/intern/mesh.cc
@@@ -241,16 -246,19 +242,23 @@@ static void mesh_blend_write(BlendWrite
      memset(&mesh->pdata, 0, sizeof(mesh->pdata));
    }
    else {
-     CustomData_blend_write_prepare(mesh->vdata, vert_layers);
-     CustomData_blend_write_prepare(mesh->edata, edge_layers);
-     CustomData_blend_write_prepare(mesh->ldata, loop_layers);
-     CustomData_blend_write_prepare(mesh->pdata, poly_layers);
+     Set<std::string> names_to_skip;
+     if (!BLO_write_is_undo(writer)) {
+       BKE_mesh_legacy_convert_hide_layers_to_flags(mesh);
+       /* When converting to the old mesh format, don't save redunant attributes. */
+       names_to_skip.add_multiple_new({".hide_vert", ".hide_edge", ".hide_poly"});
+     }
+ 
+     CustomData_blend_write_prepare(mesh->vdata, vert_layers, names_to_skip);
+     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_hide_layers_to_flags(mesh);
 +  }
 +
    BLO_write_id_struct(writer, Mesh, id_address, &mesh->id);
    BKE_id_blend_write(writer, &mesh->id);
  
diff --cc source/blender/blenkernel/intern/mesh_convert.cc
index 6b866be328f,3806ea76cfe..6af41b5dfff
--- a/source/blender/blenkernel/intern/mesh_convert.cc
+++ b/source/blender/blenkernel/intern/mesh_convert.cc
@@@ -135,14 -81,17 +81,17 @@@ static void make_edges_mdata_extend(Mes
    const MPoly *mp;
    int i;
  
-   eh_reserve = max_ii(totedge, BLI_EDGEHASH_SIZE_GUESS_FROM_POLYS(totpoly));
-   eh = BLI_edgehash_new_ex(__func__, eh_reserve);
 -  Span<MPoly> polys(mesh.mpoly, mesh.totpoly);
 -  MutableSpan<MLoop> loops(mesh.mloop, mesh.totloop);
++  Span<MPoly> polys = blender::bke::mesh_polygons(mesh);
++  MutableSpan<MLoop> loops = blender::bke::mesh_loops_for_write(mesh);
+ 
+   const int eh_reserve = max_ii(totedge, BLI_EDGEHASH_SIZE_GUESS_FROM_POLYS(mesh.totpoly));
+   EdgeHash *eh = BLI_edgehash_new_ex(__func__, eh_reserve);
  
-   for (i = 0, mp = mpoly; i < totpoly; i++, mp++) {
-     BKE_mesh_poly_edgehash_insert(eh, mp, mloop + mp->loopstart);
+   for (const MPoly &poly : polys) {
+     BKE_mesh_poly_edgehash_insert(eh, &poly, &loops[poly.loopstart]);
    }
  
-   totedge_new = BLI_edgehash_len(eh);
+   const int totedge_new = BLI_edgehash_len(eh);
  
  #ifdef DEBUG
    /* ensure that there's no overlap! */
@@@ -155,19 -104,15 +104,14 @@@
  #endif
  
    if (totedge_new) {
-     EdgeHashIterator *ehi;
-     MEdge *medge;
-     uint e_index = totedge;
+     CustomData_realloc(&mesh.edata, totedge + totedge_new);
 -    BKE_mesh_update_customdata_pointers(&mesh, false);
  
-     *r_alledge = medge = (MEdge *)(*r_alledge ?
-                                        MEM_reallocN(*r_alledge,
-                                                     sizeof(MEdge) * (totedge + totedge_new)) :
-                                        MEM_calloc_arrayN(totedge_new, sizeof(MEdge), __func__));
-     medge += totedge;
 -    MEdge *medge = mesh.medge + totedge;
++    MEdge *medge = &blender::bke::mesh_edges_for_write(mesh)[totedge];
  
-     totedge += totedge_new;
+     mesh.totedge += totedge_new;
  
-     /* --- */
+     EdgeHashIterator *ehi;
+     uint e_index = totedge;
      for (ehi = BLI_edgehashIterator_new(eh); BLI_edgehashIterator_isDone(ehi) == false;
           BLI_edgehashIterator_step(ehi), ++medge, e_index++) {
        BLI_edgehashIterator_getKey(ehi, &medge->v1, &medge->v2);
@@@ -178,10 -123,8 +122,8 @@@
      }
      BLI_edgehashIterator_free(ehi);
  
-     *r_totedge = totedge;
- 
-     for (i = 0, mp = mpoly; i < totpoly; i++, mp++) {
-       MLoop *l = &mloop[mp->loopstart];
 -    for (i = 0, mp = mesh.mpoly; i < mesh.totpoly; i++, mp++) {
++    for (i = 0, mp = polys.data(); i < mesh.totpoly; i++, mp++) {
+       MLoop *l = &loops[mp->loopstart];
        MLoop *l_prev = (l + (mp->totloop - 1));
        int j;
        for (j = 0; j < mp->totloop; j++, l++) {
@@@ -255,21 -181,21 +180,21 @@@ static Mesh *mesh_nurbs_displist_to_mes
    }
  
    if (totvert == 0) {
-     /* Make Sure you check ob->data is a curve. */
-     // error("can't convert");
-     return -1;
+     return BKE_mesh_new_nomain(0, 0, 0, 0, 0);
    }
  
-   *r_allvert = mvert = (MVert *)MEM_calloc_arrayN(totvert, sizeof(MVert), "nurbs_init mvert");
-   *r_alledge = medge = (MEdge *)MEM_calloc_arrayN(totedge, sizeof(MEdge), "nurbs_init medge");
-   *r_allloop = mloop = (MLoop *)MEM_calloc_arrayN(
-       totpoly, sizeof(MLoop[4]), "nurbs_init mloop"); /* totloop */
-   *r_allpoly = mpoly = (MPoly *)MEM_calloc_arrayN(totpoly, sizeof(MPoly), "nurbs_init mloop");
+   Mesh *mesh = BKE_mesh_new_nomain(totvert, totedge, 0, totloop, totpoly);
 -  MutableSpan<MVert> verts(mesh->mvert, mesh->totvert);
 -  MutableSpan<MEdge> edges(mesh->medge, mesh->totedge);
 -  MutableSpan<MPoly> polys(mesh->mpoly, mesh->totpoly);
 -  MutableSpan<MLoop> loops(mesh->mloop, mesh->totloop);
++  MutableSpan<MVert> verts = blender::bke::mesh_vertices_for_write(*mesh);
++  MutableSpan<MEdge> edges = blender::bke::mesh_edges_for_write(*mesh);
++  MutableSpan<MPoly> polys = blender::bke::mesh_polygons_for_write(*mesh);
++  MutableSpan<MLoop> loops = blender::bke::mesh_loops_for_write(*mesh);
  
-   if (r_alluv) {
-     *r_alluv = mloopuv = (MLoopUV *)MEM_calloc_arrayN(
-         totpoly, sizeof(MLoopUV[4]), "nurbs_init mloopuv");
-   }
+   MVert *mvert = verts.data();
+   MEdge *medge = edges.data();
+   MPoly *mpoly = polys.data();
+   MLoop *mloop = loops.data();
+   MLoopUV *mloopuv = static_cast<MLoopUV *>(CustomData_add_layer_named(
+       &mesh->ldata, CD_MLOOPUV, CD_CALLOC, nullptr, mesh->totloop, "UVMap"));
  
    /* verts and faces */
    vertcount = 0;
diff --cc source/blender/blenkernel/intern/mesh_evaluate.cc
index 38ffae55f54,9dba8eab340..6583436905f
--- a/source/blender/blenkernel/intern/mesh_evaluate.cc
+++ b/source/blender/blenkernel/intern/mesh_evaluate.cc
@@@ -746,8 -748,9 +746,9 @@@ void BKE_mesh_flush_hidden_from_verts(M
      return;
    }
    const VArraySpan<bool> hide_vert_span{hide_vert};
 -  const Span<MEdge> edges(me->medge, me->totedge);
 -  const Span<MPoly>

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list