[Bf-blender-cvs] [9b2338f686d] refactor-mesh-bevel-weight-generic: Merge branch 'master' into refactor-mesh-bevel-weight-generic

Hans Goudey noreply at git.blender.org
Sat Aug 27 04:02:23 CEST 2022


Commit: 9b2338f686d47e0a04e4903d1345ded1332cd4ab
Author: Hans Goudey
Date:   Fri Aug 26 20:41:14 2022 -0500
Branches: refactor-mesh-bevel-weight-generic
https://developer.blender.org/rB9b2338f686d47e0a04e4903d1345ded1332cd4ab

Merge branch 'master' into refactor-mesh-bevel-weight-generic

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



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

diff --cc source/blender/blenkernel/intern/customdata.cc
index 6c6160ac0f1,1f70ab587bf..bcecfc1b289
--- a/source/blender/blenkernel/intern/customdata.cc
+++ b/source/blender/blenkernel/intern/customdata.cc
@@@ -5133,7 -5136,7 +5136,7 @@@ void CustomData_data_transfer(const Mes
    else {
      const LayerTypeInfo *type_info = layerType_getInfo(data_type);
  
-     /* NOTE: we can use 'fake' CDLayers, like e.g. for crease :/. */
 -    /* NOTE: we can use 'fake' CDLayers, like e.g. for crease, bweight, etc. :/. */
++    /* NOTE: we can use 'fake' CDLayers for crease :/. */
      data_size = (size_t)type_info->size;
      data_step = laymap->elem_size ? laymap->elem_size : data_size;
      data_offset = laymap->data_offset;
diff --cc source/blender/blenkernel/intern/mball_tessellate.c
index 54def0189b1,61f5a5f315f..1ca4f120bc2
--- a/source/blender/blenkernel/intern/mball_tessellate.c
+++ b/source/blender/blenkernel/intern/mball_tessellate.c
@@@ -1436,34 -1436,57 +1436,56 @@@ Mesh *BKE_mball_polygonize(Depsgraph *d
    polygonize(&process);
    if (process.curindex == 0) {
      freepolygonize(&process);
-     return;
+     return NULL;
    }
  
-   /* add resulting surface to displist */
+   freepolygonize(&process);
+ 
+   Mesh *mesh = (Mesh *)BKE_id_new_nomain(ID_ME, ((ID *)ob->data)->name + 2);
  
-   /* 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);
+   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;
    }
-   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]));
+   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];
+     }
+ 
+     loop_offset += count;
    }
+   MEM_freeN(process.indices);
  
-   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;
+   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->index = (int *)process.indices;
+   mesh->totloop = loop_offset;
  
-   for (uint a = 0; a < process.curvertex; a++) {
-     normalize_v3(process.no[a]);
-   }
+   BKE_mesh_update_customdata_pointers(mesh, false);
  
-   dl->verts = (float *)process.co;
-   dl->nors = (float *)process.no;
+   BKE_mesh_calc_edges(mesh, false, false);
  
-   freepolygonize(&process);
+   return mesh;
  }
diff --cc source/blender/blenkernel/intern/mesh.cc
index 3ec3c0ef3b4,272dd922caa..cd076b370f1
--- a/source/blender/blenkernel/intern/mesh.cc
+++ b/source/blender/blenkernel/intern/mesh.cc
@@@ -245,15 -246,17 +246,18 @@@ static void mesh_blend_write(BlendWrite
      memset(&mesh->pdata, 0, sizeof(mesh->pdata));
    }
    else {
+     Set<std::string> names_to_skip;
      if (!BLO_write_is_undo(writer)) {
        BKE_mesh_legacy_convert_hide_layers_to_flags(mesh);
 +      BKE_mesh_legacy_bevel_weight_from_layers(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"});
      }
  
-     CustomData_blend_write_prepare(mesh->vdata, vert_layers, {".hide_vert"});
-     CustomData_blend_write_prepare(mesh->edata, edge_layers, {".hide_edge"});
-     CustomData_blend_write_prepare(mesh->ldata, loop_layers);
-     CustomData_blend_write_prepare(mesh->pdata, poly_layers, {".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);
    }
  
    BLO_write_id_struct(writer, Mesh, id_address, &mesh->id);
diff --cc source/blender/blenkernel/intern/mesh_legacy_convert.cc
index f6c2a8066fb,cc96a5e8c60..19594282b3f
--- a/source/blender/blenkernel/intern/mesh_legacy_convert.cc
+++ b/source/blender/blenkernel/intern/mesh_legacy_convert.cc
@@@ -877,65 -877,6 +877,67 @@@ void BKE_mesh_add_mface_layers(CustomDa
  
  /** \} */
  
 +/* -------------------------------------------------------------------- */
 +/** \name Bevel Weight Conversion
 + * \{ */
 +
 +void BKE_mesh_legacy_bevel_weight_from_layers(Mesh *mesh)
 +{
 +  using namespace blender;
 +  MutableSpan<MVert> vertices(mesh->mvert, mesh->totvert);
-   if (const float *weights = (const float *)CustomData_get_layer(&mesh->vdata, CD_BWEIGHT)) {
++  if (const float *weights = static_cast<const float *>(
++          CustomData_get_layer(&mesh->vdata, CD_BWEIGHT))) {
 +    mesh->cd_flag |= ME_CDFLAG_VERT_BWEIGHT;
 +    for (const int i : vertices.index_range()) {
 +      vertices[i].bweight = std::clamp(weights[i], 0.0f, 1.0f) * 255.0f;
 +    }
 +  }
 +  else {
 +    mesh->cd_flag &= ~ME_CDFLAG_VERT_BWEIGHT;
 +    for (const int i : vertices.index_range()) {
 +      vertices[i].bweight = 0;
 +    }
 +  }
 +  MutableSpan<MEdge> edges(mesh->medge, mesh->totedge);
-   if (const float *weights = (const float *)CustomData_get_layer(&mesh->edata, CD_BWEIGHT)) {
++  if (const float *weights = static_cast<const float *>(
++          CustomData_get_layer(&mesh->edata, CD_BWEIGHT))) {
 +    mesh->cd_flag |= ME_CDFLAG_EDGE_BWEIGHT;
 +    for (const int i : edges.index_range()) {
 +      edges[i].bweight = std::clamp(weights[i], 0.0f, 1.0f) * 255.0f;
 +    }
 +  }
 +  else {
 +    mesh->cd_flag &= ~ME_CDFLAG_EDGE_BWEIGHT;
 +    for (const int i : edges.index_range()) {
 +      edges[i].bweight = 0;
 +    }
 +  }
 +}
 +
 +void BKE_mesh_legacy_bevel_weight_to_layers(Mesh *mesh)
 +{
 +  using namespace blender;
 +  const Span<MVert> vertices(mesh->mvert, mesh->totvert);
 +  if (mesh->cd_flag & ME_CDFLAG_VERT_BWEIGHT) {
-     float *weights = (float *)CustomData_add_layer(
-         &mesh->vdata, CD_BWEIGHT, CD_DEFAULT, nullptr, vertices.size());
++    float *weights = static_cast<float *>(
++        CustomData_add_layer(&mesh->vdata, CD_BWEIGHT, CD_DEFAULT, nullptr, vertices.size()));
 +    for (const int i : vertices.index_range()) {
 +      weights[i] = vertices[i].bweight / 255.0f;
 +    }
 +  }
 +
 +  const Span<MEdge> edges(mesh->medge, mesh->totedge);
 +  if (mesh->cd_flag & ME_CDFLAG_EDGE_BWEIGHT) {
-     float *weights = (float *)CustomData_add_layer(
-         &mesh->edata, CD_BWEIGHT, CD_DEFAULT, nullptr, edges.size());
++    float *weights = static_cast<float *>(
++        CustomData_add_layer(&mesh->edata, CD_BWEIGHT, CD_DEFAULT, nullptr, edges.size()));
 +    for (const int i : edges.index_range()) {
 +      weights[i] = edges[i].bweight / 255.0f;
 +    }
 +  }
 +}
 +
 +/** \} */
 +
  /* -------------------------------------------------------------------- */
  /** \name Hide Attribute and Legacy Flag Conversion
   * \{ */
diff --cc source/blender/blenkernel/intern/subdiv_mesh.cc
index 22479f70433,e026a013498..fe6fd5f6052
--- a/source/blender/blenkernel/intern/subdiv_mesh.cc
+++ b/source/blender/blenkernel/intern/subdiv_mesh.cc
@@@ -773,8 -779,9 +779,8 @@@ static void subdiv_copy_edge_data(Subdi
                                    const MEdge *coarse_edge)
  {
    const int subdiv_edge_index = subdiv_edge - ctx->subdiv_mesh->medge;
-   if (coarse_edge == NULL) {
+   if (coarse_edge == nullptr) {
      subdiv_edge->crease = 0;
 -    subdiv_edge->bweight = 0;
      subdiv_edge->flag = 0;
      if (!ctx->settings->use_optimal_display) {
        subdiv_edge->flag |= ME_EDGERENDER;
diff --cc source/blender/bmesh/intern/bmesh_mesh_convert.cc
index eadf87d7ebd,b9c004b5392..f9efbdd74d3
--- a/source/blender/bmesh/intern/bmesh_mesh_convert.cc
+++ b/source/blender/bmesh/intern/bmesh_mesh_convert.cc
@@@ -1273,11 -1325,15 +1273,7 @@@ void BM_mesh_bm_to_me_for_eval(BMesh *b
      if (BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
        need_hide_vert = true;
      }
- 
-     if (cd_vert_bweight_offset != -1) {
-       mv->bweight = BM_ELEM_CD_GET_FLOAT_AS_UCHAR(eve, cd_vert_bweight_offset);
-     }
  
 -    if (cd_vert_bweight_offset != -1) {
 -      mv->bweight = BM_ELEM_CD_GET_FLOAT_AS_UCHAR(eve, cd_vert_bweight_offset);
 -    }
 -
 -    if (cd_vert_bweight_offset != -1) {
 -      mv->bweight = BM_ELEM_CD_GET_FLOAT_AS_UCHAR(eve, cd_vert_bweight_offset);
 -    }
 -
      CustomData_from_bmesh_block(&bm->vdata, &me->vdata, eve->head.data, i);
    }
    bm->elem_index_dirty &= ~BM_VERT;



More information about the Bf-blender-cvs mailing list