[Bf-blender-cvs] [1153d0a4a3b] temp-geometry-nodes-extrude-mesh: Fix shade smooth interpolation in individual mode

Hans Goudey noreply at git.blender.org
Thu Jan 6 01:58:59 CET 2022


Commit: 1153d0a4a3b36782426003fefb4bf8412fe9f5c2
Author: Hans Goudey
Date:   Wed Jan 5 16:11:38 2022 -0600
Branches: temp-geometry-nodes-extrude-mesh
https://developer.blender.org/rB1153d0a4a3b36782426003fefb4bf8412fe9f5c2

Fix shade smooth interpolation in individual mode

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

M	source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc

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

diff --git a/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc b/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc
index 69ce553352b..1287dd4ec85 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc
@@ -977,6 +977,61 @@ static void extrude_individual_mesh_faces(MeshComponent &component,
   MutableSpan<MPoly> new_polys = polys.slice(side_poly_range);
   MutableSpan<MLoop> loops{mesh.mloop, mesh.totloop};
 
+  /* For every selected polygon, build the faces that form the sides of the extrusion. Note that
+   * filling some of this data like the new edges or polygons could be easily split into separate
+   * loops, which may or may not be faster, and would involve more duplication. */
+  threading::parallel_for(poly_selection.index_range(), 256, [&](const IndexRange range) {
+    for (const int i_selection : range) {
+      const IndexRange poly_corner_range = selected_corner_range(index_offsets, i_selection);
+
+      const MPoly &poly = polys[poly_selection[i_selection]];
+      Span<MLoop> poly_loops = loops.slice(poly.loopstart, poly.totloop);
+
+      for (const int i : IndexRange(poly.totloop)) {
+        const int i_next = (i == poly.totloop - 1) ? 0 : i + 1;
+        const MLoop &orig_loop = poly_loops[i];
+        const MLoop &orig_loop_next = poly_loops[i_next];
+
+        const int i_extrude = poly_corner_range[i];
+        const int i_extrude_next = poly_corner_range[i_next];
+
+        const int i_duplicate_edge = duplicate_edge_range[i_extrude];
+        const int new_vert = new_vert_range[i_extrude];
+        const int new_vert_next = new_vert_range[i_extrude_next];
+
+        const int orig_edge = orig_loop.e;
+
+        const int orig_vert = orig_loop.v;
+        const int orig_vert_next = orig_loop_next.v;
+
+        MEdge &duplicate_edge = duplicate_edges[i_extrude];
+        duplicate_edge.v1 = new_vert_range[i_extrude];
+        duplicate_edge.v2 = new_vert_range[i_extrude_next];
+        duplicate_edge.flag = (ME_EDGEDRAW | ME_EDGERENDER);
+
+        MPoly &side_poly = new_polys[i_extrude];
+        side_poly.loopstart = side_loop_range[i_extrude * 4];
+        side_poly.totloop = 4;
+        side_poly.flag = 0;
+
+        MutableSpan<MLoop> side_loops = loops.slice(side_loop_range[i_extrude * 4], 4);
+        side_loops[0].v = new_vert_next;
+        side_loops[0].e = i_duplicate_edge;
+        side_loops[1].v = new_vert;
+        side_loops[1].e = connect_edge_range[i_extrude];
+        side_loops[2].v = orig_vert;
+        side_loops[2].e = orig_edge;
+        side_loops[3].v = orig_vert_next;
+        side_loops[3].e = connect_edge_range[i_extrude_next];
+
+        MEdge &connect_edge = connect_edges[i_extrude];
+        connect_edge.v1 = orig_vert;
+        connect_edge.v2 = new_vert;
+        connect_edge.flag = (ME_EDGEDRAW | ME_EDGERENDER);
+      }
+    }
+  });
+
   component.attribute_foreach([&](const AttributeIDRef &id, const AttributeMetaData meta_data) {
     OutputAttribute attribute = component.attribute_try_get_for_output(
         id, meta_data.domain, meta_data.data_type);
@@ -1086,9 +1141,19 @@ static void extrude_individual_mesh_faces(MeshComponent &component,
     return true;
   });
 
-  /* For every selected polygons, build the faces that form the sides of the extrusion. Note that
-   * filling some of this data like teh new edges or polygons could be easily split into separate
-   * loops, which may or may not be faster, and would involve more duplication. */
+  /* Offset the new vertices. */
+  threading::parallel_for(poly_selection.index_range(), 1024, [&](const IndexRange range) {
+    for (const int i_selection : range) {
+      const IndexRange poly_corner_range = selected_corner_range(index_offsets, i_selection);
+      for (MVert &vert : new_verts.slice(poly_corner_range)) {
+        add_v3_v3(vert.co, poly_offset[poly_selection[i_selection]]);
+      }
+    }
+  });
+
+  /* Finally update each extruded polygon's loops to point to the new edges and vertices.
+   * This must be done last, because they were used to find original indices for attribute
+   * interpolation before. Alternatively an original index array could be built for each domain. */
   threading::parallel_for(poly_selection.index_range(), 256, [&](const IndexRange range) {
     for (const int i_selection : range) {
       const IndexRange poly_corner_range = selected_corner_range(index_offsets, i_selection);
@@ -1096,51 +1161,6 @@ static void extrude_individual_mesh_faces(MeshComponent &component,
       const MPoly &poly = polys[poly_selection[i_selection]];
       MutableSpan<MLoop> poly_loops = loops.slice(poly.loopstart, poly.totloop);
 
-      for (const int i : IndexRange(poly.totloop)) {
-        const int i_next = (i == poly.totloop - 1) ? 0 : i + 1;
-        const MLoop &loop = poly_loops[i];
-        const MLoop &loop_next = poly_loops[i_next];
-
-        const int i_extrude = poly_corner_range[i];
-        const int i_extrude_next = poly_corner_range[i_next];
-
-        const int i_duplicate_edge = duplicate_edge_range[i_extrude];
-        const int new_vert = new_vert_range[i_extrude];
-        const int new_vert_next = new_vert_range[i_extrude_next];
-
-        const int orig_edge = loop.e;
-
-        const int orig_vert = loop.v;
-        const int orig_vert_next = loop_next.v;
-
-        MEdge &duplicate_edge = duplicate_edges[i_extrude];
-        duplicate_edge.v1 = new_vert_range[i_extrude];
-        duplicate_edge.v2 = new_vert_range[i_extrude_next];
-        duplicate_edge.flag = (ME_EDGEDRAW | ME_EDGERENDER);
-
-        MPoly &side_poly = new_polys[i_extrude];
-        side_poly.loopstart = side_loop_range[i_extrude * 4];
-        side_poly.totloop = 4;
-        side_poly.flag = 0;
-
-        MutableSpan<MLoop> side_loops = loops.slice(side_loop_range[i_extrude * 4], 4);
-        side_loops[0].v = new_vert_next;
-        side_loops[0].e = i_duplicate_edge;
-        side_loops[1].v = new_vert;
-        side_loops[1].e = connect_edge_range[i_extrude];
-        side_loops[2].v = orig_vert;
-        side_loops[2].e = orig_edge;
-        side_loops[3].v = orig_vert_next;
-        side_loops[3].e = connect_edge_range[i_extrude_next];
-
-        MEdge &connect_edge = connect_edges[i_extrude];
-        connect_edge.v1 = orig_vert;
-        connect_edge.v2 = new_vert;
-        connect_edge.flag = (ME_EDGEDRAW | ME_EDGERENDER);
-      }
-
-      /* Finally updated the extruded polygon's loops to point to the new edges and vertices.
-       * This must be done last, because they were used as original indices before. */
       for (const int i : IndexRange(poly.totloop)) {
         MLoop &loop = poly_loops[i];
         loop.v = new_vert_range[poly_corner_range[i]];
@@ -1149,15 +1169,6 @@ static void extrude_individual_mesh_faces(MeshComponent &component,
     }
   });
 
-  threading::parallel_for(poly_selection.index_range(), 1024, [&](const IndexRange range) {
-    for (const int i_selection : range) {
-      const IndexRange poly_corner_range = selected_corner_range(index_offsets, i_selection);
-      for (MVert &vert : new_verts.slice(poly_corner_range)) {
-        add_v3_v3(vert.co, poly_offset[poly_selection[i_selection]]);
-      }
-    }
-  });
-
   BKE_mesh_runtime_clear_cache(&mesh);
   BKE_mesh_normals_tag_dirty(&mesh);



More information about the Bf-blender-cvs mailing list