[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 ¶ms,
- 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