[Bf-blender-cvs] [61de7565de4] refactor-mesh-sharp-face-generic: Various fixes and cleanups

Hans Goudey noreply at git.blender.org
Sun Jan 22 17:16:52 CET 2023


Commit: 61de7565de49b63432047ce6363471c6ac642258
Author: Hans Goudey
Date:   Sun Jan 22 10:16:41 2023 -0600
Branches: refactor-mesh-sharp-face-generic
https://developer.blender.org/rB61de7565de49b63432047ce6363471c6ac642258

Various fixes and cleanups

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

M	intern/cycles/blender/mesh.cpp
M	source/blender/blenkernel/BKE_mesh.h
M	source/blender/blenkernel/intern/fluid.cc
M	source/blender/blenkernel/intern/mesh_convert.cc
M	source/blender/blenkernel/intern/mesh_legacy_convert.cc
M	source/blender/blenkernel/intern/mesh_normals.cc
M	source/blender/blenkernel/intern/mesh_tangent.cc
M	source/blender/bmesh/intern/bmesh_mesh_convert.cc
M	source/blender/draw/intern/draw_cache_impl_subdivision.cc
M	source/blender/editors/mesh/mesh_data.cc
M	source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.cc
M	source/blender/io/collada/MeshImporter.cpp
M	source/blender/io/wavefront_obj/exporter/obj_export_mesh.hh
M	source/blender/io/wavefront_obj/importer/obj_import_mesh.cc
M	source/blender/makesrna/intern/rna_mesh.c
M	source/blender/modifiers/intern/MOD_normal_edit.cc
M	source/blender/modifiers/intern/MOD_remesh.cc
M	source/blender/nodes/geometry/nodes/node_geo_convex_hull.cc
M	source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_circle.cc
M	source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cone.cc
M	source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_grid.cc
M	source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_uv_sphere.cc
M	source/blender/nodes/geometry/nodes/node_geo_set_shade_smooth.cc

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

diff --git a/intern/cycles/blender/mesh.cpp b/intern/cycles/blender/mesh.cpp
index e242a184f2f..847c7358f7a 100644
--- a/intern/cycles/blender/mesh.cpp
+++ b/intern/cycles/blender/mesh.cpp
@@ -1005,7 +1005,7 @@ static void create_mesh(Scene *scene,
     if (sharp_faces) {
       return sharp_faces->data[poly_index].value();
     }
-    return 0;
+    return false;
   };
 
   /* create faces */
diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h
index 11f22fd9e2a..28ae1d82aa4 100644
--- a/source/blender/blenkernel/BKE_mesh.h
+++ b/source/blender/blenkernel/BKE_mesh.h
@@ -473,7 +473,7 @@ void BKE_mesh_ensure_normals_for_display(struct Mesh *mesh);
  * Used when defining an empty custom loop normals data layer,
  * to keep same shading as with auto-smooth!
  *
- * \param sharp_faces: Optional array used to mark specific faces as sharp.
+ * \param sharp_faces: Optional array used to mark specific faces for sharp shading.
  */
 void BKE_edges_sharp_from_angle_set(int numEdges,
                                     const struct MLoop *mloops,
@@ -596,7 +596,7 @@ void BKE_lnor_space_custom_normal_to_data(const MLoopNorSpace *lnor_space,
  * (splitting edges).
  *
  * \param loop_to_poly_map: Optional pre-created map from loops to their polygon.
- * \param sharp_faces: Optional array used to mark specific faces as sharp.
+ * \param sharp_faces: Optional array used to mark specific faces for sharp shading.
  * \param sharp_edges: Optional array of sharp edge tags, used to split the evaluated normals on
  * each side of the edge.
  */
diff --git a/source/blender/blenkernel/intern/fluid.cc b/source/blender/blenkernel/intern/fluid.cc
index 81e7840e91c..e467d3ef6c9 100644
--- a/source/blender/blenkernel/intern/fluid.cc
+++ b/source/blender/blenkernel/intern/fluid.cc
@@ -3246,6 +3246,10 @@ static Mesh *create_liquid_geometry(FluidDomainSettings *fds,
   mpolys = BKE_mesh_polys_for_write(me);
   mloops = BKE_mesh_loops_for_write(me);
 
+  const bool is_sharp = orgmesh->attributes().lookup_or_default<bool>(
+      "sharp_face", ATTR_DOMAIN_FACE, false)[0];
+  BKE_mesh_smooth_flag_set(me, !is_sharp);
+
   /* Get size (dimension) but considering scaling. */
   copy_v3_v3(cell_size_scaled, fds->cell_size);
   mul_v3_v3(cell_size_scaled, ob->scale);
diff --git a/source/blender/blenkernel/intern/mesh_convert.cc b/source/blender/blenkernel/intern/mesh_convert.cc
index 0d3cce58736..9ac2da547ca 100644
--- a/source/blender/blenkernel/intern/mesh_convert.cc
+++ b/source/blender/blenkernel/intern/mesh_convert.cc
@@ -286,9 +286,7 @@ static Mesh *mesh_nurbs_displist_to_mesh(const Curve *cu, const ListBase *dispba
           }
         }
 
-        if (!is_smooth) {
-          sharp_faces.span[dst_poly] = true;
-        }
+        sharp_faces.span[dst_poly] = !is_smooth;
         dst_poly++;
         dst_loop += 3;
         index += 3;
@@ -371,9 +369,7 @@ static Mesh *mesh_nurbs_displist_to_mesh(const Curve *cu, const ListBase *dispba
             }
           }
 
-          if (!is_smooth) {
-            sharp_faces.span[dst_poly] = true;
-          }
+          sharp_faces.span[dst_poly] = !is_smooth;
           dst_poly++;
           dst_loop += 4;
 
@@ -390,6 +386,14 @@ static Mesh *mesh_nurbs_displist_to_mesh(const Curve *cu, const ListBase *dispba
     make_edges_mdata_extend(*mesh);
   }
 
+  int sharp_faces_count = 0;
+  for (const bool value : sharp_faces.span) {
+    if (value) {
+      sharp_faces_count++;
+    }
+  }
+  std::cout << "Number of sharp faces: " << sharp_faces_count << '\n';
+
   material_indices.finish();
   sharp_faces.finish();
 
diff --git a/source/blender/blenkernel/intern/mesh_legacy_convert.cc b/source/blender/blenkernel/intern/mesh_legacy_convert.cc
index 0e97b334aec..d5da9fbfdd2 100644
--- a/source/blender/blenkernel/intern/mesh_legacy_convert.cc
+++ b/source/blender/blenkernel/intern/mesh_legacy_convert.cc
@@ -1855,7 +1855,7 @@ void BKE_mesh_legacy_convert_flags_to_selection_layers(Mesh *mesh)
         ".select_poly", ATTR_DOMAIN_FACE);
     threading::parallel_for(polys.index_range(), 4096, [&](IndexRange range) {
       for (const int i : range) {
-        select_poly.span[i] = (polys[i].flag_legacy & ME_FACE_SEL) != 0;
+        select_poly.span[i] = polys[i].flag_legacy & ME_FACE_SEL;
       }
     });
     select_poly.finish();
diff --git a/source/blender/blenkernel/intern/mesh_normals.cc b/source/blender/blenkernel/intern/mesh_normals.cc
index 8a939de01ac..077e5bad42c 100644
--- a/source/blender/blenkernel/intern/mesh_normals.cc
+++ b/source/blender/blenkernel/intern/mesh_normals.cc
@@ -802,7 +802,7 @@ static void mesh_edges_sharp_tag(const Span<MPoly> polys,
 {
   using namespace blender;
   const float split_angle_cos = check_angle ? cosf(split_angle) : -1.0f;
-  auto face_is_smooth = [&](const int poly_i) {
+  auto poly_is_smooth = [&](const int poly_i) {
     return sharp_faces.is_empty() || !sharp_faces[poly_i];
   };
 
@@ -819,7 +819,7 @@ static void mesh_edges_sharp_tag(const Span<MPoly> polys,
         /* 'Empty' edge until now, set e2l[0] (and e2l[1] to INDEX_UNSET to tag it as unset). */
         e2l[0] = loop_index;
         /* We have to check this here too, else we might miss some flat faces!!! */
-        e2l[1] = (face_is_smooth(poly_i)) ? INDEX_UNSET : INDEX_INVALID;
+        e2l[1] = (poly_is_smooth(poly_i)) ? INDEX_UNSET : INDEX_INVALID;
       }
       else if (e2l[1] == INDEX_UNSET) {
         const bool is_angle_sharp = (check_angle &&
@@ -831,7 +831,7 @@ static void mesh_edges_sharp_tag(const Span<MPoly> polys,
          * or both poly have opposed (flipped) normals, i.e. both loops on the same edge share the
          * same vertex, or angle between both its polys' normals is above split_angle value.
          */
-        if (!face_is_smooth(poly_i) || (!sharp_edges.is_empty() && sharp_edges[edge_i]) ||
+        if (!poly_is_smooth(poly_i) || (!sharp_edges.is_empty() && sharp_edges[edge_i]) ||
             vert_i == loops[e2l[0]].v || is_angle_sharp) {
           /* NOTE: we are sure that loop != 0 here ;). */
           e2l[1] = INDEX_INVALID;
@@ -1944,7 +1944,8 @@ static void mesh_set_custom_normals(Mesh *mesh, float (*r_custom_nors)[3], const
   MutableAttributeAccessor attributes = mesh->attributes_for_write();
   SpanAttributeWriter<bool> sharp_edges = attributes.lookup_or_add_for_write_span<bool>(
       "sharp_edge", ATTR_DOMAIN_EDGE);
-
+  const bool *sharp_faces = static_cast<const bool *>(
+      CustomData_get_layer_named(&mesh->pdata, CD_PROP_BOOL, "sharp_face"));
   mesh_normals_loop_custom_set(reinterpret_cast<const float(*)[3]>(positions.data()),
                                BKE_mesh_vertex_normals_ensure(mesh),
                                positions.size(),
@@ -1955,8 +1956,7 @@ static void mesh_set_custom_normals(Mesh *mesh, float (*r_custom_nors)[3], const
                                loops.size(),
                                polys.data(),
                                BKE_mesh_poly_normals_ensure(mesh),
-                               static_cast<const bool *>(CustomData_get_layer_named(
-                                   &mesh->pdata, CD_PROP_BOOL, "sharp_face")),
+                               sharp_faces,
                                polys.size(),
                                sharp_edges.span,
                                clnors,
diff --git a/source/blender/blenkernel/intern/mesh_tangent.cc b/source/blender/blenkernel/intern/mesh_tangent.cc
index f8992262add..39188238640 100644
--- a/source/blender/blenkernel/intern/mesh_tangent.cc
+++ b/source/blender/blenkernel/intern/mesh_tangent.cc
@@ -278,15 +278,14 @@ struct SGLSLMeshToTangent {
   const float (*precomputedFaceNormals)[3];
   const float (*precomputedLoopNormals)[3];
   const MLoopTri *looptri;
-  const float2 *mloopuv; /* texture coordinates */
-  const MPoly *mpoly;    /* indices */
-  const MLoop *mloop;    /* indices */
-  const MVert *mvert;    /* vertex coordinates */
-  const bool *sharp_faces;
+  const float2 *mloopuv;       /* texture coordinates */
+  const MPoly *mpoly;          /* indices */
+  const MLoop *mloop;          /* indices */
   const float (*positions)[3]; /* vertex coordinates */
   const float (*vert_normals)[3];
   const float (*orco)[3];
   float (*tangent)[4]; /* destination */
+  const bool *sharp_faces;
   int numTessFaces;
 
 #ifdef USE_LOOPTRI_DETECT_QUADS
diff --git a/source/blender/bmesh/intern/bmesh_mesh_convert.cc b/source/blender/bmesh/intern/bmesh_mesh_convert.cc
index 49f2cc35878..40021a4e0ab 100644
--- a/source/blender/bmesh/intern/bmesh_mesh_convert.cc
+++ b/source/blender/bmesh/intern/bmesh_mesh_convert.cc
@@ -437,12 +437,12 @@ void BM_mesh_bm_from_me(BMesh *bm, const Mesh *me, const struct BMeshFromMeshPar
     BM_elem_index_set(f, bm->totface - 1); /* set_ok */
 
     /* Transfer flag. */
-    if (hide_poly && hide_poly[i]) {
-      BM_elem_flag_enable(f, BM_ELEM_HIDDEN);
-    }
     if (!(sharp_faces && sharp_faces[i])) {
       BM_elem_flag_enable(f, BM_ELEM_SMOOTH);
     }
+    if (hide_poly && hide_poly[i]) {
+      BM_elem_flag_enable(f, BM_ELEM_HIDDEN);
+    }
     if (select_poly && select_poly[i]) {
       BM_face_select_set(bm, f, true);
     }
@@ -1174,13 +1174,6 @@ void BM_mesh_bm_to_me(Main *bmain, BMesh *bm, Mesh *me, const struct BMeshToMesh
                                ATTR_DOMAIN_FACE,
                                [&](const int i) { return int(BM_face_at_index(bm, i)->mat_nr); });
   }
-  if (need_sharp_face) {
-    BM_mesh_elem_table_ensure(bm, BM_FACE);
-    write_fn_to_attribute<bool>(
-        me->attributes_for_write(), "sharp_face", ATTR_DOMAIN_FACE, [&](const int i) {
-          return !BM_elem_flag_test(BM_face_at_index(bm, i), BM_ELEM_SMOOTH);
-        });
-  }
   if (need_sharp_edge) {
     BM_mesh_elem_table_ensure(bm, BM_EDGE);
     write_fn_to_attribute<bool>(
@@ -1188,6 +1181,13 @@ void BM_mesh_bm_to_me(Main *bmain, BMesh *bm, Mesh *me, const struct BMeshToMesh
           return !BM_elem_flag_test(BM_edge_at_index(bm, i), BM_ELEM_SMOOTH);
         });
   }
+  if (need_sharp_face) {
+    BM_mesh_elem_table_ensure(bm, BM_FACE);
+    write_fn_to_attribute<bool>(
+        me->attributes_for_write()

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list