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

Hans Goudey noreply at git.blender.org
Sun Aug 14 04:16:29 CEST 2022


Commit: 6d041a7d510b43a128b3be393a69c2b45ae4885c
Author: Hans Goudey
Date:   Sat Aug 13 21:50:06 2022 -0400
Branches: refactor-mesh-bevel-weight-generic
https://developer.blender.org/rB6d041a7d510b43a128b3be393a69c2b45ae4885c

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

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



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

diff --cc source/blender/blenkernel/BKE_mesh_legacy_convert.h
index 208f0877e11,bbc61d5af5e..7dcfc8379ef
--- a/source/blender/blenkernel/BKE_mesh_legacy_convert.h
+++ b/source/blender/blenkernel/BKE_mesh_legacy_convert.h
@@@ -18,13 -18,14 +18,24 @@@ struct Mesh
  struct MFace;
  
  /**
++<<<<<<< HEAD
 + * Copy bevel weights from separate layers into vertices and edges.
 + */
 +void BKE_mesh_legacy_bevel_weight_from_layers(struct Mesh *mesh);
 +/**
 + * Copy bevel weights from vertices and edges to separate layers.
 + */
 +void BKE_mesh_legacy_bevel_weight_to_layers(struct Mesh *mesh);
++=======
+  * Convert the hidden element attributes to the old flag format for writing.
+  */
+ void BKE_mesh_legacy_convert_hide_layers_to_flags(struct Mesh *mesh);
+ /**
+  * Convert the old hide flags (#ME_HIDE) to the hidden element attribute for reading.
+  * Only add the attributes when there are any elements in each domain hidden.
+  */
+ void BKE_mesh_legacy_convert_flags_to_hide_layers(struct Mesh *mesh);
++>>>>>>> master
  
  /**
   * Recreate #MFace Tessellation.
diff --cc source/blender/blenkernel/intern/mesh.cc
index 5775d29479e,abf47acd5cc..c7a32fd7b03
--- a/source/blender/blenkernel/intern/mesh.cc
+++ b/source/blender/blenkernel/intern/mesh.cc
@@@ -65,8 -64,8 +66,13 @@@
  #include "BLO_read_write.h"
  
  using blender::float3;
++<<<<<<< HEAD
 +using blender::IndexRange;
 +using blender::MutableSpan;
++=======
+ using blender::MutableSpan;
+ using blender::VArray;
++>>>>>>> master
  using blender::Vector;
  
  static void mesh_clear_geometry(Mesh *mesh);
@@@ -246,16 -245,16 +252,20 @@@ 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);
+     if (!BLO_write_is_undo(writer)) {
+       BKE_mesh_legacy_convert_hide_layers_to_flags(mesh);
+     }
+ 
+     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);
+     CustomData_blend_write_prepare(mesh->pdata, poly_layers, {".hide_poly"});
    }
  
 +  if (!BLO_write_is_undo(writer)) {
 +    BKE_mesh_legacy_bevel_weight_from_layers(mesh);
 +  }
 +
    BLO_write_id_struct(writer, Mesh, id_address, &mesh->id);
    BKE_id_blend_write(writer, &mesh->id);
  
@@@ -333,7 -332,7 +343,11 @@@ static void mesh_blend_read_data(BlendD
    }
  
    if (!BLO_read_data_is_undo(reader)) {
++<<<<<<< HEAD
 +    BKE_mesh_legacy_bevel_weight_to_layers(mesh);
++=======
+     BKE_mesh_legacy_convert_flags_to_hide_layers(mesh);
++>>>>>>> master
    }
  
    /* We don't expect to load normals from files, since they are derived data. */
diff --cc source/blender/blenkernel/intern/mesh_legacy_convert.cc
index 16fd9cf9de9,cc96a5e8c60..00c6e3f2806
--- a/source/blender/blenkernel/intern/mesh_legacy_convert.cc
+++ b/source/blender/blenkernel/intern/mesh_legacy_convert.cc
@@@ -876,59 -878,86 +878,142 @@@ void BKE_mesh_add_mface_layers(CustomDa
  /** \} */
  
  /* -------------------------------------------------------------------- */
++<<<<<<< HEAD
 +/** \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)) {
 +    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)) {
 +    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());
 +    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());
 +    for (const int i : edges.index_range()) {
 +      weights[i] = edges[i].bweight / 255.0f;
 +    }
++=======
+ /** \name Hide Attribute and Legacy Flag Conversion
+  * \{ */
+ 
+ void BKE_mesh_legacy_convert_hide_layers_to_flags(Mesh *mesh)
+ {
+   using namespace blender;
+   using namespace blender::bke;
+   const AttributeAccessor attributes = mesh_attributes(*mesh);
+ 
+   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) {
+     for (const int i : range) {
+       SET_FLAG_FROM_TEST(verts[i].flag, hide_vert[i], ME_HIDE);
+     }
+   });
+ 
+   MutableSpan<MEdge> edges(mesh->medge, mesh->totedge);
+   const VArray<bool> hide_edge = attributes.lookup_or_default<bool>(
+       ".hide_edge", ATTR_DOMAIN_EDGE, false);
+   threading::parallel_for(edges.index_range(), 4096, [&](IndexRange range) {
+     for (const int i : range) {
+       SET_FLAG_FROM_TEST(edges[i].flag, hide_edge[i], ME_HIDE);
+     }
+   });
+ 
+   MutableSpan<MPoly> polys(mesh->mpoly, mesh->totpoly);
+   const VArray<bool> hide_poly = attributes.lookup_or_default<bool>(
+       ".hide_poly", ATTR_DOMAIN_FACE, false);
+   threading::parallel_for(polys.index_range(), 4096, [&](IndexRange range) {
+     for (const int i : range) {
+       SET_FLAG_FROM_TEST(polys[i].flag, hide_poly[i], ME_HIDE);
+     }
+   });
+ }
+ 
+ void BKE_mesh_legacy_convert_flags_to_hide_layers(Mesh *mesh)
+ {
+   using namespace blender;
+   using namespace blender::bke;
+   MutableAttributeAccessor attributes = mesh_attributes_for_write(*mesh);
+ 
+   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>(
+         ".hide_vert", ATTR_DOMAIN_POINT);
+     threading::parallel_for(verts.index_range(), 4096, [&](IndexRange range) {
+       for (const int i : range) {
+         hide_vert.span[i] = verts[i].flag & ME_HIDE;
+       }
+     });
+     hide_vert.finish();
+   }
+ 
+   const Span<MEdge> edges(mesh->medge, mesh->totedge);
+   if (std::any_of(
+           edges.begin(), edges.end(), [](const MEdge &edge) { return edge.flag & ME_HIDE; })) {
+     SpanAttributeWriter<bool> hide_edge = attributes.lookup_or_add_for_write_only_span<bool>(
+         ".hide_edge", ATTR_DOMAIN_EDGE);
+     threading::parallel_for(edges.index_range(), 4096, [&](IndexRange range) {
+       for (const int i : range) {
+         hide_edge.span[i] = edges[i].flag & ME_HIDE;
+       }
+     });
+     hide_edge.finish();
+   }
+ 
+   const Span<MPoly> polys(mesh->mpoly, mesh->totpoly);
+   if (std::any_of(
+           polys.begin(), polys.end(), [](const MPoly &poly) { return poly.flag & ME_HIDE; })) {
+     SpanAttributeWriter<bool> hide_poly = attributes.lookup_or_add_for_write_only_span<bool>(
+         ".hide_poly", ATTR_DOMAIN_FACE);
+     threading::parallel_for(polys.index_range(), 4096, [&](IndexRange range) {
+       for (const int i : range) {
+         hide_poly.span[i] = polys[i].flag & ME_HIDE;
+       }
+     });
+     hide_poly.finish();
++>>>>>>> master
    }
  }
  
diff --cc source/blender/bmesh/intern/bmesh_mesh_convert.cc
index 739e474c59a,b9c004b5392..eadf87d7ebd
--- a/source/blender/bmesh/intern/bmesh_mesh_convert.cc
+++ b/source/blender/bmesh/intern/bmesh_mesh_convert.cc
@@@ -1156,8 -1300,14 +1250,12 @@@ void BM_mesh_bm_to_me_for_eval(BMesh *b
    MPoly *mpoly = me->mpoly;
    unsigned int i, j;
  
 -  const int cd_vert_bweight_offset = CustomData_get_offset(&bm->vdata, CD_BWEIGHT);
 -  const int cd_edge_bweight_offset = CustomData_get_offset(&bm->edata, CD_BWEIGHT);
    const int cd_edge_crease_offset = CustomData_get_offset(&bm->edata, CD_CREASE);
  
+   bool need_hide_vert = false;
+   bool need_hide_edge = false;
+   bool need_hide_poly = false;
+ 
    /* Clear normals on the mesh completely, since the original vertex and polygon count might be
     * different than the BMesh's. */
    BKE_mesh_clear_derived_normals(me);
@@@ -1172,7 -1322,18 +1270,14 @@@
      BM_elem_index_set(eve, i); /* set_inline */
  
      mv->flag = BM_vert_flag_to_mflag(eve);
+     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);
 -    }
 -
      CustomData_from_bmesh_block(&bm->vdata, &me->vdata, eve->head.data, i);
    }
    bm->elem_index_dirty &= ~BM_VERT;
diff --cc source/blender/makesrna/intern/rna_mesh.c
index 22a43f1df8f,9580c1178ec..63d8d572c5f
--- a/source/blender/makesrna/intern/rna_mesh.c
+++ b/source/blender/makesrna/intern/rna_mesh.c
@@@ -352,8 -344,55 +352,60 @@@ static voi

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list