[Bf-blender-cvs] [6beb1333159] soc-2021-porting-modifiers-to-nodes-decimate: Changes based on review by Jacques Lucke (JacquesLucke)

Fabian Schempp noreply at git.blender.org
Wed Jul 14 23:56:51 CEST 2021


Commit: 6beb13331598604fe5ac8abe5d2f519f19f72467
Author: Fabian Schempp
Date:   Wed Jul 14 23:54:25 2021 +0200
Branches: soc-2021-porting-modifiers-to-nodes-decimate
https://developer.blender.org/rB6beb13331598604fe5ac8abe5d2f519f19f72467

Changes based on review by Jacques Lucke (JacquesLucke)

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

M	source/blender/bmesh/intern/bmesh_mesh.c
M	source/blender/makesdna/DNA_node_types.h
M	source/blender/nodes/NOD_geometry.h
M	source/blender/nodes/geometry/nodes/node_geo_collapse.cc
M	source/blender/nodes/geometry/nodes/node_geo_dissolve.cc
M	source/blender/nodes/geometry/nodes/node_geo_unsubdivide.cc

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

diff --git a/source/blender/bmesh/intern/bmesh_mesh.c b/source/blender/bmesh/intern/bmesh_mesh.c
index 23847a29c30..1ad9adf86a0 100644
--- a/source/blender/bmesh/intern/bmesh_mesh.c
+++ b/source/blender/bmesh/intern/bmesh_mesh.c
@@ -1458,6 +1458,9 @@ void BM_temporary_tag_vertices(BMesh *bm, const bool *mask)
     if (mask[i]) {
       BM_elem_flag_enable(v, BM_ELEM_TAG);
     }
+    else {
+      BM_elem_flag_disable(v, BM_ELEM_TAG);
+    }
     i++;
   }
 }
@@ -1495,6 +1498,9 @@ void BM_temporary_tag_faces(BMesh *bm, const bool *mask)
     if (mask[i]) {
       BM_elem_flag_enable(f, BM_ELEM_TAG);
     }
+    else {
+      BM_elem_flag_disable(f, BM_ELEM_TAG);
+    }
     i++;
   }
 }
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index db2e6120ca5..3a6f3ed0909 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -1972,7 +1972,7 @@ typedef enum GeometryNodeCollapseSymmetryAxis {
 } GeometryNodeCollapseSymmetryAxis;
 
 typedef enum GeometryNodeDissolveDelimiter {
-  /* Keep in sync with BMO_Delimit*/
+  /* Keep bits in sync with BMO_Delimit. */
   GEO_NODE_DISSOLVE_DELIMITTER_SELECTION = 1 << 5,
   GEO_NODE_DISSOLVE_DELIMITTER_SELECTION_BORDER = 1 << 6,
 } GeometryNodeDissolveDelimiter;
diff --git a/source/blender/nodes/NOD_geometry.h b/source/blender/nodes/NOD_geometry.h
index 21a2d5d556d..ec7482bd89b 100644
--- a/source/blender/nodes/NOD_geometry.h
+++ b/source/blender/nodes/NOD_geometry.h
@@ -67,7 +67,6 @@ void register_node_type_geo_curve_subdivide(void);
 void register_node_type_geo_curve_to_mesh(void);
 void register_node_type_geo_curve_to_points(void);
 void register_node_type_geo_delete_geometry(void);
-void register_node_type_geo_decimate(void);
 void register_node_type_geo_dissolve(void);
 void register_node_type_geo_edge_split(void);
 void register_node_type_geo_input_material(void);
diff --git a/source/blender/nodes/geometry/nodes/node_geo_collapse.cc b/source/blender/nodes/geometry/nodes/node_geo_collapse.cc
index 50185c31bbc..c96d0dc8e02 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_collapse.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_collapse.cc
@@ -29,7 +29,7 @@
 
 static bNodeSocketTemplate geo_node_collapse_in[] = {
     {SOCK_GEOMETRY, N_("Geometry")},
-    {SOCK_FLOAT, N_("Factor"), 0.5f, 0.0f, 0.0f, 0.0f, 0, 1.0f, PROP_FACTOR},
+    {SOCK_FLOAT, N_("Factor"), 1.0f, 0.0f, 0.0f, 0.0f, 0, 1.0f, PROP_FACTOR},
     {SOCK_BOOLEAN, N_("Triangulate"), false},
     {SOCK_STRING, N_("Selection")},
     {-1, ""},
@@ -42,6 +42,8 @@ static bNodeSocketTemplate geo_node_collapse_out[] = {
 
 static void geo_node_collapse_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
 {
+  uiLayoutSetPropSep(layout, true);
+  uiLayoutSetPropDecorate(layout, false);
   uiItemR(layout, ptr, "symmetry_axis", 0, nullptr, ICON_NONE);
 }
 
@@ -57,27 +59,21 @@ static void geo_node_collapse_init(bNodeTree *UNUSED(tree), bNode *node)
 namespace blender::nodes {
 
 static Mesh *collapse_mesh(const float factor,
-                           const GVArrayPtr &selection,
+                           const VArray_Span<float> &selection,
                            const bool triangulate,
                            const int symmetry_axis,
-                           Mesh *mesh)
+                           const Mesh *mesh)
 {
-  if (factor == 1.0f) {
-    return mesh;
-  }
-
-  const GVArray_Typed<float> selection_as_typed = selection->typed<float>();
-  Array<float> mask(mesh->totvert);
-  for (const int i : selection_as_typed.index_range()) {
-    mask[i] = selection_as_typed[i];
-  }
-
   const BMeshCreateParams bmesh_create_params = {0};
   const BMeshFromMeshParams bmesh_from_mesh_params = {
       true, 0, 0, 0, {CD_MASK_ORIGINDEX, CD_MASK_ORIGINDEX, CD_MASK_ORIGINDEX}};
   BMesh *bm = BKE_mesh_to_bmesh_ex(mesh, &bmesh_create_params, &bmesh_from_mesh_params);
 
   const float symmetry_eps = 0.00002f;
+  Array<float> mask(selection.size());
+  for (const int i : selection.index_range()) {
+    mask[i] = selection[i];
+  }
   BM_mesh_decimate_collapse(
       bm, factor, mask.data(), 1.0f, triangulate, symmetry_axis, symmetry_eps);
   Mesh *result = BKE_mesh_from_bmesh_for_eval_nomain(bm, NULL, mesh);
@@ -92,22 +88,14 @@ static void geo_node_collapse_exec(GeoNodeExecParams params)
   GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
   const float factor = params.extract_input<float>("Factor");
 
-  if (geometry_set.has_mesh()) {
+  if (factor < 1.0f && geometry_set.has_mesh()) {
     MeshComponent &mesh_component = geometry_set.get_component_for_write<MeshComponent>();
 
     const float default_factor = 1.0f;
-    const GVArrayPtr selection = params.get_input_attribute(
-        "Selection", mesh_component, ATTR_DOMAIN_POINT, CD_PROP_FLOAT, &default_factor);
-    if (!selection) {
-      return;
-    }
-
-    Mesh *input_mesh = mesh_component.get_for_write();
-
-    if (input_mesh->totvert <= 3) {
-      params.error_message_add(NodeWarningType::Error,
-                               TIP_("Node requires mesh with more than 3 input faces"));
-    }
+    GVArray_Typed<float> selection_attribute = params.get_input_attribute<float>(
+        "Selection", mesh_component, ATTR_DOMAIN_POINT, default_factor);
+    VArray_Span<float> selection{selection_attribute};
+    const Mesh *input_mesh = mesh_component.get_for_read();
 
     const bool triangulate = params.extract_input<bool>("Triangulate");
     const bNode &node = params.node();
@@ -132,5 +120,6 @@ void register_node_type_geo_collapse()
   node_type_init(&ntype, geo_node_collapse_init);
   ntype.geometry_node_execute = blender::nodes::geo_node_collapse_exec;
   ntype.draw_buttons = geo_node_collapse_layout;
+  ntype.width = 180;
   nodeRegisterType(&ntype);
 }
diff --git a/source/blender/nodes/geometry/nodes/node_geo_dissolve.cc b/source/blender/nodes/geometry/nodes/node_geo_dissolve.cc
index d2a7764f7c6..2cea7ac220d 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_dissolve.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_dissolve.cc
@@ -29,9 +29,9 @@
 
 static bNodeSocketTemplate geo_node_dissolve_in[] = {
     {SOCK_GEOMETRY, N_("Geometry")},
-    {SOCK_FLOAT, N_("Angle"), M_PI * 0.25, 0.0f, 0.0f, 1.0f, 0.0f, M_PI, PROP_ANGLE},
-    {SOCK_STRING, N_("Delimiter")},
+    {SOCK_FLOAT, N_("Angle"), 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, M_PI, PROP_ANGLE},
     {SOCK_BOOLEAN, N_("All Boundaries"), false},
+    {SOCK_STRING, N_("Delimiter")},
     {-1, ""},
 };
 
@@ -60,8 +60,8 @@ namespace blender::nodes {
 static Mesh *dissolve_mesh(const float angle,
                            const bool all_boundaries,
                            const int delimiter_type,
-                           const Array<bool> &delimiter,
-                           Mesh *mesh)
+                           const Span<bool> &delimiter,
+                           const Mesh *mesh)
 {
   const BMeshCreateParams bmesh_create_params = {0};
   const BMeshFromMeshParams bmesh_from_mesh_params = {
@@ -86,15 +86,9 @@ static void geo_node_dissolve_exec(GeoNodeExecParams params)
   GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
   const float angle = params.extract_input<float>("Angle");
 
-  if (geometry_set.has_mesh()) {
-    MeshComponent &mesh_component = geometry_set.get_component_for_write<MeshComponent>();
-
-    Mesh *input_mesh = mesh_component.get_for_write();
-
-    if (input_mesh->totvert <= 3) {
-      params.error_message_add(NodeWarningType::Error,
-                               TIP_("Node requires mesh with more than 3 input faces"));
-    }
+  if (angle > 0.0f && geometry_set.has_mesh()) {
+    const MeshComponent &mesh_component = geometry_set.get_component_for_write<MeshComponent>();
+    const Mesh *input_mesh = mesh_component.get_for_read();
 
     const bool all_boundaries = params.extract_input<bool>("All Boundaries");
     const bNode &node = params.node();
@@ -102,24 +96,17 @@ static void geo_node_dissolve_exec(GeoNodeExecParams params)
 
     const bool default_delimiter = false;
     AttributeDomain delimiter_domain = ATTR_DOMAIN_FACE;
-    int delimiter_domain_size = input_mesh->totpoly;
+
     if (node_storage.delimiter & GEO_NODE_DISSOLVE_DELIMITTER_SELECTION) {
       delimiter_domain = ATTR_DOMAIN_EDGE;
-      delimiter_domain_size = input_mesh->totedge;
     };
 
-    const GVArrayPtr delimiter = params.get_input_attribute(
-        "Delimiter", mesh_component, delimiter_domain, CD_PROP_BOOL, &default_delimiter);
-    if (!delimiter) {
-      return;
-    }
-    const GVArray_Typed<bool> delimiter_as_typed = delimiter->typed<bool>();
-    Array<bool> mask(delimiter_domain_size);
-    for (const int i : delimiter_as_typed.index_range()) {
-      mask[i] = delimiter_as_typed[i];
-    }
-
-    Mesh *result = dissolve_mesh(angle, all_boundaries, node_storage.delimiter, mask, input_mesh);
+    GVArray_Typed<bool> delimiter_attribute = params.get_input_attribute<bool>(
+        "Delimiter", mesh_component, delimiter_domain, default_delimiter);
+    VArray_Span<bool> delimiter{delimiter_attribute};
+
+    Mesh *result = dissolve_mesh(
+        angle, all_boundaries, node_storage.delimiter, delimiter, input_mesh);
     geometry_set.replace_mesh(result);
   }
 
@@ -138,5 +125,6 @@ void register_node_type_geo_dissolve()
   node_type_init(&ntype, geo_node_dissolve_init);
   ntype.geometry_node_execute = blender::nodes::geo_node_dissolve_exec;
   ntype.draw_buttons = geo_node_dissolve_layout;
+  ntype.width = 165;
   nodeRegisterType(&ntype);
 }
diff --git a/source/blender/nodes/geometry/nodes/node_geo_unsubdivide.cc b/source/blender/nodes/geometry/nodes/node_geo_unsubdivide.cc
index 74f6faa5bf7..4a12114e323 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_unsubdivide.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_unsubdivide.cc
@@ -37,12 +37,8 @@ static bNodeSocketTemplate geo_node_unsubdivide_out[] = {
 
 namespace blender::nodes {
 
-static Mesh *unsubdivide_mesh(const uint iterations, const Array<bool> &selection, Mesh *mesh)
+static Mesh *unsubdivide_mesh(const int iterations, const Array<bool> &selection, const Mes

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list