[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