[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