[Bf-blender-cvs] [2c6aeb62400] soc-2021-porting-modifiers-to-nodes-merge-by-distance: - copied point cloud support from D10888 to this patch - added support for selection with point cloud mode

Fabian Schempp noreply at git.blender.org
Sat Jul 24 22:48:13 CEST 2021


Commit: 2c6aeb62400a2239e2f461ab4a2e31fd1615ed9e
Author: Fabian Schempp
Date:   Sat Jul 24 22:47:58 2021 +0200
Branches: soc-2021-porting-modifiers-to-nodes-merge-by-distance
https://developer.blender.org/rB2c6aeb62400a2239e2f461ab4a2e31fd1615ed9e

- copied point cloud support from D10888 to this patch
- added support for selection with point cloud mode

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

M	release/scripts/startup/nodeitems_builtins.py
M	source/blender/editors/asset/ED_asset_temp_id_consumer.h
M	source/blender/geometry/CMakeLists.txt
R094	source/blender/geometry/GEO_weld.h	source/blender/geometry/GEO_mesh_merge_by_distance.h
R099	source/blender/geometry/intern/weld.c	source/blender/geometry/intern/mesh_merge_by_distance.c
M	source/blender/modifiers/intern/MOD_weld.c
M	source/blender/nodes/NOD_geometry.h
M	source/blender/nodes/geometry/nodes/node_geo_merge_by_distance.cc

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

diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py
index 287ad561870..95365a1aece 100644
--- a/release/scripts/startup/nodeitems_builtins.py
+++ b/release/scripts/startup/nodeitems_builtins.py
@@ -529,6 +529,7 @@ geometry_node_categories = [
         NodeItem("GeometryNodeJoinGeometry"),
         NodeItem("GeometryNodeSeparateComponents"),
         NodeItem("GeometryNodeRaycast"),
+        NodeItem("GeometryNodeMergeByDistance"),
     ]),
     GeometryNodeCategory("GEO_INPUT", "Input", items=[
         NodeItem("GeometryNodeObjectInfo"),
@@ -551,7 +552,6 @@ geometry_node_categories = [
         NodeItem("GeometryNodeEdgeSplit"),
         NodeItem("GeometryNodeSubdivisionSurface"),
         NodeItem("GeometryNodeMeshSubdivide"),
-        NodeItem("GeometryNodeMergeByDistance"),
     ]),
     GeometryNodeCategory("GEO_PRIMITIVES_MESH", "Mesh Primitives", items=[
         NodeItem("GeometryNodeMeshCircle"),
diff --git a/source/blender/editors/asset/ED_asset_temp_id_consumer.h b/source/blender/editors/asset/ED_asset_temp_id_consumer.h
index 8aa53f9ea3b..9af08c5c52b 100644
--- a/source/blender/editors/asset/ED_asset_temp_id_consumer.h
+++ b/source/blender/editors/asset/ED_asset_temp_id_consumer.h
@@ -36,12 +36,13 @@ struct ReportList;
 
 AssetTempIDConsumer *ED_asset_temp_id_consumer_create(const struct AssetHandle *handle);
 void ED_asset_temp_id_consumer_free(AssetTempIDConsumer **consumer);
-struct ID *ED_asset_temp_id_consumer_ensure_local_id(AssetTempIDConsumer *consumer,
-                                                     const struct bContext *C,
-                                                     const struct AssetLibraryReference *asset_library,
-                                                     ID_Type id_type,
-                                                     struct Main *bmain,
-                                                     struct ReportList *reports);
+struct ID *ED_asset_temp_id_consumer_ensure_local_id(
+    AssetTempIDConsumer *consumer,
+    const struct bContext *C,
+    const struct AssetLibraryReference *asset_library,
+    ID_Type id_type,
+    struct Main *bmain,
+    struct ReportList *reports);
 
 #ifdef __cplusplus
 }
diff --git a/source/blender/geometry/CMakeLists.txt b/source/blender/geometry/CMakeLists.txt
index 282a041dd7b..e3e78b6128a 100644
--- a/source/blender/geometry/CMakeLists.txt
+++ b/source/blender/geometry/CMakeLists.txt
@@ -32,8 +32,8 @@
          )
 
  set(SRC
-         intern/weld.c
-         GEO_weld.h
+         intern/mesh_merge_by_distance.c
+         GEO_mesh_merge_by_distance.h
          )
 
  set(LIB
diff --git a/source/blender/geometry/GEO_weld.h b/source/blender/geometry/GEO_mesh_merge_by_distance.h
similarity index 94%
rename from source/blender/geometry/GEO_weld.h
rename to source/blender/geometry/GEO_mesh_merge_by_distance.h
index 23395828f7e..5cf34e41084 100644
--- a/source/blender/geometry/GEO_weld.h
+++ b/source/blender/geometry/GEO_mesh_merge_by_distance.h
@@ -31,7 +31,7 @@ enum {
   WELD_MODE_CONNECTED = 1,
 };
 
-Mesh *GEO_weld(const Mesh *mesh,
+struct Mesh *GEO_mesh_merge_by_distance(const struct Mesh *mesh,
                const bool *mask,
                const float merge_distance,
                const int weld_mode);
diff --git a/source/blender/geometry/intern/weld.c b/source/blender/geometry/intern/mesh_merge_by_distance.c
similarity index 99%
rename from source/blender/geometry/intern/weld.c
rename to source/blender/geometry/intern/mesh_merge_by_distance.c
index 2490ba7d932..244289063e4 100644
--- a/source/blender/geometry/intern/weld.c
+++ b/source/blender/geometry/intern/mesh_merge_by_distance.c
@@ -21,7 +21,7 @@
 #include "BKE_mesh.h"
 #include "BKE_modifier.h"
 
-#include "GEO_weld.h"  // Own include.
+#include "GEO_mesh_merge_by_distance.h"  // Own include.
 
 /* Indicates when the element was not computed. */
 #define OUT_OF_CONTEXT (uint)(-1)
@@ -1499,10 +1499,6 @@ static void customdata_weld(
 
 /** \} */
 
-/* -------------------------------------------------------------------- */
-/** \name Weld Modifier Main
- * \{ */
-
 #ifdef USE_BVHTREEKDOP
 struct WeldOverlapData {
   const MVert *mvert;
@@ -1527,7 +1523,7 @@ struct WeldVertexCluster {
   uint merged_verts;
 };
 
-Mesh *GEO_weld(const Mesh *mesh, const bool *mask, const float merge_distance, const int weld_mode)
+Mesh *GEO_mesh_merge_by_distance(const Mesh *mesh, const bool *mask, const float merge_distance, const int weld_mode)
 {
   Mesh *result = mesh;
 
diff --git a/source/blender/modifiers/intern/MOD_weld.c b/source/blender/modifiers/intern/MOD_weld.c
index fde0b0f83dc..4d50d9ea243 100644
--- a/source/blender/modifiers/intern/MOD_weld.c
+++ b/source/blender/modifiers/intern/MOD_weld.c
@@ -54,7 +54,7 @@
 #include "BKE_modifier.h"
 #include "BKE_screen.h"
 
-#include "GEO_weld.h"
+#include "GEO_mesh_merge_by_distance.h"
 
 #include "UI_interface.h"
 #include "UI_resources.h"
@@ -93,7 +93,7 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *UNUSED(ctx)
     }
   }
 
-  Mesh *result = GEO_weld(mesh, mask, wmd->merge_dist, wmd->mode);
+  Mesh *result = GEO_mesh_merge_by_distance(mesh, mask, wmd->merge_dist, wmd->mode);
   MEM_freeN(mask);
 
   return result;
@@ -132,7 +132,7 @@ 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 == MOD_WELD_MODE_CONNECTED) {
+  if (weld_mode == WELD_MODE_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/NOD_geometry.h b/source/blender/nodes/NOD_geometry.h
index 363d2fa061f..3ec5a06f7bb 100644
--- a/source/blender/nodes/NOD_geometry.h
+++ b/source/blender/nodes/NOD_geometry.h
@@ -74,6 +74,7 @@ void register_node_type_geo_is_viewport(void);
 void register_node_type_geo_join_geometry(void);
 void register_node_type_geo_material_assign(void);
 void register_node_type_geo_material_replace(void);
+void register_node_type_geo_merge_by_distance(void);
 void register_node_type_geo_mesh_primitive_circle(void);
 void register_node_type_geo_mesh_primitive_cone(void);
 void register_node_type_geo_mesh_primitive_cube(void);
@@ -93,7 +94,6 @@ void register_node_type_geo_point_separate(void);
 void register_node_type_geo_point_translate(void);
 void register_node_type_geo_points_to_volume(void);
 void register_node_type_geo_raycast(void);
-void register_node_type_geo_merge_by_distance(void);
 void register_node_type_geo_sample_texture(void);
 void register_node_type_geo_select_by_material(void);
 void register_node_type_geo_separate_components(void);
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 f72b1b33ed3..903e90723ab 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
@@ -14,15 +14,29 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
-#include "BKE_mesh_remesh_voxel.h"
+#include "BKE_pointcloud.h"
 
-#include "GEO_weld.h"
+#include "BLI_float3.hh"
+#include "BLI_kdtree.h"
+#include "BLI_span.hh"
+
+#include "DNA_pointcloud_types.h"
+
+#include "GEO_mesh_merge_by_distance.h"
 
 #include "UI_interface.h"
 #include "UI_resources.h"
 
 #include "node_geometry_util.hh"
 
+#include "FN_generic_span.hh"
+
+#include "node_geometry_util.hh"
+
+using blender::float3;
+using blender::Span;
+using blender::Vector;
+
 static bNodeSocketTemplate geo_node_merge_by_distance_in[] = {
     {SOCK_GEOMETRY, N_("Geometry")},
     {SOCK_FLOAT, N_("Distance"), 0.0f, 0, 0, 0, 0, 10000.0f, PROP_DISTANCE},
@@ -47,12 +61,100 @@ static void geo_merge_by_distance_init(bNodeTree *UNUSED(ntree), bNode *node)
   node->custom1 = WELD_MODE_ALL;
 }
 
+static KDTree_3d *build_kdtree(Span<float3> positions)
+{
+  KDTree_3d *kdtree = BLI_kdtree_3d_new(positions.size());
+
+  int i_point = 0;
+  for (const float3 position : positions) {
+    BLI_kdtree_3d_insert(kdtree, i_point, position);
+    i_point++;
+  }
+  BLI_kdtree_3d_balance(kdtree);
+  return kdtree;
+}
+
+static void build_merge_map(Vector<float3> &positions,
+                            Vector<int> &merge_map,
+                            int &total_merge_operations,
+                            const float merge_threshold,
+                            Span<bool> &selection)
+{
+  KDTree_3d *kdtree = build_kdtree(positions.as_span());
+
+  for (int i : positions.index_range()) {
+    struct CallbackData {
+      int index;
+      int &total_merge_operations;
+      Vector<int> &merge_map;
+      Span<bool> &selection;
+    } callback_data = {i, total_merge_operations, merge_map, selection};
+
+    BLI_kdtree_3d_range_search_cb(
+        kdtree,
+        positions[i],
+        merge_threshold,
+        [](void *user_data,
+           int source_vertex_index,
+           const float *UNUSED(co),
+           float UNUSED(distance_squared)) {
+          CallbackData &callback_data = *static_cast<CallbackData *>(user_data);
+          int target_vertex_index = callback_data.index;
+          if (source_vertex_index != target_vertex_index &&
+              callback_data.merge_map[source_vertex_index] == -1 &&
+              callback_data.merge_map[target_vertex_index] == -1 &&
+              callback_data.selection[source_vertex_index] &&
+              callback_data.selection[target_vertex_index]) {
+            callback_data.merge_map[source_vertex_index] = target_vertex_index;
+            callback_data.total_merge_operations++;
+          }
+          return true;
+        },
+        &callback_data);
+  }
+
+  BLI_kdtree_3d_free(kdtree);
+}
+
+static PointCloud *merge_by_distance_pointcloud(const PointCloud *point_cloud,
+                                                const float merge_threshold,
+                                                Vector<int> &merge_map,
+                                                Span<bool> &selection

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list