[Bf-blender-cvs] [569bbdec769] soc-2021-porting-modifiers-to-nodes-merge-by-distance: Changes based on review by Hans Goudey (HooglyBoogly)

Fabian Schempp noreply at git.blender.org
Thu Sep 30 01:24:27 CEST 2021


Commit: 569bbdec769ed903816401ed0946b3c538b38d99
Author: Fabian Schempp
Date:   Thu Sep 30 01:24:14 2021 +0200
Branches: soc-2021-porting-modifiers-to-nodes-merge-by-distance
https://developer.blender.org/rB569bbdec769ed903816401ed0946b3c538b38d99

Changes based on review by Hans Goudey (HooglyBoogly)

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

M	source/blender/geometry/GEO_mesh_merge_by_distance.hh
M	source/blender/geometry/intern/mesh_merge_by_distance.cc
M	source/blender/modifiers/intern/MOD_weld.cc
M	source/blender/nodes/geometry/nodes/node_geo_merge_by_distance.cc

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

diff --git a/source/blender/geometry/GEO_mesh_merge_by_distance.hh b/source/blender/geometry/GEO_mesh_merge_by_distance.hh
index e38d381edeb..ba4efd69e22 100644
--- a/source/blender/geometry/GEO_mesh_merge_by_distance.hh
+++ b/source/blender/geometry/GEO_mesh_merge_by_distance.hh
@@ -26,15 +26,18 @@ namespace blender::geometry {
 extern "C" {
 #endif
 
-typedef enum weld_mode {
-  WELD_MODE_ALL = 0,
-  WELD_MODE_CONNECTED = 1,
-} weld_mode;
+enum class WeldMode {
+  all = 0,
+  connected = 1,
+};
 
-struct Mesh *GEO_mesh_merge_by_distance(const struct Mesh *mesh,
+WeldMode GEO_weld_mode_from_int(const short type);
+int16_t GEO_weld_mode_to_short(const WeldMode weld_mode);
+
+struct Mesh *GEO_mesh_merge_by_distance(struct Mesh *mesh,
                                         const bool *mask,
                                         const float merge_distance,
-                                        const int weld_mode);
+                                        const WeldMode weld_mode);
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/geometry/intern/mesh_merge_by_distance.cc b/source/blender/geometry/intern/mesh_merge_by_distance.cc
index da7ed622903..c71990d158f 100644
--- a/source/blender/geometry/intern/mesh_merge_by_distance.cc
+++ b/source/blender/geometry/intern/mesh_merge_by_distance.cc
@@ -1541,12 +1541,38 @@ struct WeldVertexCluster {
 };
 
 namespace blender::geometry {
-Mesh *GEO_mesh_merge_by_distance(const Mesh *mesh,
+
+WeldMode GEO_weld_mode_from_int(const short type)
+{
+  switch (static_cast<WeldMode>(type)) {
+    case WeldMode::all:
+      return WeldMode::all;
+    case WeldMode::connected:
+      return WeldMode::connected;
+  }
+  BLI_assert_unreachable();
+  return WeldMode::all;
+}
+
+int16_t GEO_weld_mode_to_short(const WeldMode weld_mode)
+{
+  switch (weld_mode) {
+    case WeldMode::all:
+      return static_cast<int16_t>(WeldMode::all);
+    case WeldMode::connected:
+      return static_cast<int16_t>(WeldMode::connected);
+  }
+
+  BLI_assert_unreachable();
+  return static_cast<int16_t>(WeldMode::all);
+}
+
+Mesh *GEO_mesh_merge_by_distance(Mesh *mesh,
                                  const bool *mask,
                                  const float merge_distance,
-                                 const int weld_mode)
+                                 const WeldMode weld_mode)
 {
-  Mesh *result = BKE_mesh_copy_for_eval(mesh, false);
+  Mesh *result = mesh;
 
   const MVert *mvert;
   const MLoop *mloop;
@@ -1562,7 +1588,7 @@ Mesh *GEO_mesh_merge_by_distance(const Mesh *mesh,
    * This indicates which vert it is or is going to be merged. */
   uint *vert_dest_map = (uint *)MEM_malloc_arrayN(totvert, sizeof(*vert_dest_map), __func__);
   uint vert_kill_len = 0;
-  if (weld_mode == WELD_MODE_ALL)
+  if (weld_mode == WeldMode::all)
 #ifdef USE_BVHTREEKDOP
   {
     /* Get overlap map. */
@@ -1659,7 +1685,7 @@ Mesh *GEO_mesh_merge_by_distance(const Mesh *mesh,
   }
 #endif
   else {
-    BLI_assert(weld_mode == WELD_MODE_CONNECTED);
+    BLI_assert(weld_mode == WeldMode::connected);
 
     MEdge *medge, *me;
 
diff --git a/source/blender/modifiers/intern/MOD_weld.cc b/source/blender/modifiers/intern/MOD_weld.cc
index 6a6db3b98b6..d44482abb84 100644
--- a/source/blender/modifiers/intern/MOD_weld.cc
+++ b/source/blender/modifiers/intern/MOD_weld.cc
@@ -89,7 +89,7 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *UNUSED(ctx)
   }
 
   Mesh *result = blender::geometry::GEO_mesh_merge_by_distance(
-      mesh, mask, wmd->merge_dist, wmd->mode);
+      mesh, mask, wmd->merge_dist, blender::geometry::GEO_weld_mode_from_int(wmd->mode));
   MEM_freeN(mask);
 
   return result;
@@ -128,7 +128,8 @@ static void panel_draw(const bContext *UNUSED(C), Panel *panel)
 
   uiItemR(layout, ptr, "mode", 0, NULL, ICON_NONE);
   uiItemR(layout, ptr, "merge_threshold", 0, IFACE_("Distance"), ICON_NONE);
-  if (weld_mode == blender::geometry::WELD_MODE_CONNECTED) {
+  if (blender::geometry::GEO_weld_mode_from_int(weld_mode) ==
+      blender::geometry::WeldMode::connected) {
     uiItemR(layout, ptr, "loose_edges", 0, NULL, ICON_NONE);
   }
   modifier_vgroup_ui(layout, ptr, &ob_ptr, "vertex_group", "invert_vertex_group", NULL);
diff --git a/source/blender/nodes/geometry/nodes/node_geo_merge_by_distance.cc b/source/blender/nodes/geometry/nodes/node_geo_merge_by_distance.cc
index e1010a59241..63a31853c2d 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_merge_by_distance.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_merge_by_distance.cc
@@ -55,16 +55,16 @@ static void geo_node_merge_by_distance_layout(uiLayout *layout,
 
 static void geo_merge_by_distance_init(bNodeTree *UNUSED(ntree), bNode *node)
 {
-  node->custom1 = geometry::WELD_MODE_ALL;
+  node->custom1 = GEO_weld_mode_to_short(geometry::WeldMode::all);
 }
 
 static void process_mesh(GeoNodeExecParams &params,
-                         const char weld_mode,
+                         const geometry::WeldMode weld_mode,
                          const float distance,
                          GeometrySet &geometry_set)
 {
   MeshComponent &mesh_component = geometry_set.get_component_for_write<MeshComponent>();
-  const Mesh *input_mesh = mesh_component.get_for_read();
+  Mesh *input_mesh = mesh_component.get_for_write();
 
   GeometryComponentFieldContext field_context{mesh_component, ATTR_DOMAIN_POINT};
   const Field<bool> selection_field = params.extract_input<Field<bool>>("Selection");
@@ -102,7 +102,7 @@ static void geo_node_merge_by_distance_exec(GeoNodeExecParams params)
 {
   GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
 
-  const char weld_mode = params.node().custom1;
+  const geometry::WeldMode weld_mode = geometry::GEO_weld_mode_from_int(params.node().custom1);
   const float distance = params.extract_input<float>("Distance");
 
   if (geometry_set.has_instances()) {



More information about the Bf-blender-cvs mailing list