Commit: 9887dac2fb426a409a78ac39aabbe4c5a4c6a42f Author: Fabian Schempp Date: Sun Aug 15 23:26:31 2021 +0200 Branches: soc-2021-porting-modifiers-to-nodes-extrude-and-move https://developer.blender.org/rB9887dac2fb426a409a78ac39aabbe4c5a4c6a42f
Geometry Nodes: Mesh Extrude Node that extrudes vertices, edges and Faces. Uses the corresponding bmesh operator. I renamed D12108, which was previously named Mesh Extrude to Mesh Inset, because that uses the bmesh inset operators. NOTE: This requires an update of the attribute interpolation to work, that is not yet in master. Part of the GSOC 2021 Differential Revision: https://developer.blender.org/D12224 =================================================================== M release/scripts/startup/nodeitems_builtins.py M source/blender/blenkernel/BKE_node.h M source/blender/blenkernel/intern/node.cc M source/blender/bmesh/intern/bmesh_mesh.c M source/blender/bmesh/intern/bmesh_mesh.h M source/blender/makesrna/intern/rna_nodetree.c M source/blender/nodes/CMakeLists.txt M source/blender/nodes/NOD_geometry.h M source/blender/nodes/NOD_static_types.h A source/blender/nodes/geometry/nodes/node_geo_mesh_extrude.cc D source/blender/nodes/geometry/nodes/node_geo_mesh_inset.cc =================================================================== diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py index 16201d868a6..b7e42ed8a0d 100644 --- a/release/scripts/startup/nodeitems_builtins.py +++ b/release/scripts/startup/nodeitems_builtins.py @@ -553,7 +553,7 @@ geometry_node_categories = [ NodeItem("GeometryNodeEdgeSplit"), NodeItem("GeometryNodeSubdivisionSurface"), NodeItem("GeometryNodeMeshSubdivide"), - NodeItem("GeometryNodeMeshInset"), + NodeItem("GeometryNodeMeshExtrude"), ]), GeometryNodeCategory("GEO_PRIMITIVES_MESH", "Mesh Primitives", items=[ NodeItem("GeometryNodeMeshCircle"), diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index 3b8ab619510..20c5311d944 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -1477,7 +1477,7 @@ int ntreeTexExecTree(struct bNodeTree *ntree, #define GEO_NODE_CURVE_SET_HANDLES 1072 #define GEO_NODE_CURVE_SPLINE_TYPE 1073 #define GEO_NODE_CURVE_SELECT_HANDLES 1074 -#define GEO_NODE_MESH_INSET 1075 +#define GEO_NODE_MESH_EXTRUDE 1075 /** \} */ diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc index 4e58a076419..53c521b75ba 100644 --- a/source/blender/blenkernel/intern/node.cc +++ b/source/blender/blenkernel/intern/node.cc @@ -5157,7 +5157,7 @@ static void registerGeometryNodes() register_node_type_geo_curve_trim(); register_node_type_geo_delete_geometry(); register_node_type_geo_edge_split(); - register_node_type_geo_mesh_inset(); + register_node_type_geo_mesh_extrude(); register_node_type_geo_input_material(); register_node_type_geo_is_viewport(); register_node_type_geo_join_geometry(); diff --git a/source/blender/bmesh/intern/bmesh_mesh.c b/source/blender/bmesh/intern/bmesh_mesh.c index bf123ee23f2..f50f1c08017 100644 --- a/source/blender/bmesh/intern/bmesh_mesh.c +++ b/source/blender/bmesh/intern/bmesh_mesh.c @@ -1485,13 +1485,13 @@ void BM_select_faces(BMesh *bm, const bool *mask) } } -void BM_get_selected_faces(BMesh *bm, bool *selection) +void BM_get_selected_vertices(BMesh *bm, bool *selection) { BMIter iter; - BMFace *f; - int i = 0; - BM_ITER_MESH_INDEX (f, &iter, bm, BM_FACES_OF_MESH, i) { - selection[i] = BM_elem_flag_test(f, BM_ELEM_SELECT); + BMVert *v; + int i; + BM_ITER_MESH_INDEX (v, &iter, bm, BM_VERTS_OF_MESH, i) { + selection[i] = BM_elem_flag_test(v, BM_ELEM_SELECT); } } diff --git a/source/blender/bmesh/intern/bmesh_mesh.h b/source/blender/bmesh/intern/bmesh_mesh.h index f1cb8bf0880..57be300ce5b 100644 --- a/source/blender/bmesh/intern/bmesh_mesh.h +++ b/source/blender/bmesh/intern/bmesh_mesh.h @@ -138,7 +138,7 @@ void BM_mesh_vert_coords_apply_with_mat4(BMesh *bm, void BM_select_vertices(BMesh *bm, const bool *mask); void BM_select_edges(BMesh *bm, const bool *mask); void BM_select_faces(BMesh *bm, const bool *mask); -void BM_get_selected_faces(BMesh *bm, bool *selection); +void BM_get_selected_vertices(BMesh *bm, bool *selection); void BM_tag_vertices(BMesh *bm, const bool *mask); void BM_tag_edges(BMesh *bm, const bool *mask); void BM_tag_faces(BMesh *bm, const bool *mask); diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index 8906b1a6d34..b712690cb32 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -10178,21 +10178,22 @@ static void def_geo_attribute_transfer(StructRNA *srna) RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); } -static void def_geo_mesh_inset(StructRNA *srna) +static void def_geo_mesh_extrude(StructRNA *srna) { PropertyRNA *prop; - prop = RNA_def_property(srna, "distance_mode", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_sdna(prop, NULL, "custom1"); - RNA_def_property_enum_items(prop, rna_node_geometry_attribute_input_type_items_float); - RNA_def_property_ui_text( - prop, "Distance", "Changes the Distance input between Float and Attribute"); - RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update"); + static const EnumPropertyItem rna_node_geometry_extrude_domain_items[] = { + {0, "VERTEX", 0, "Vertex", "Extrude Vertices"}, + {1, "EDGE", 0, "Edge", "Extrude Edges"}, + {2, "FACE", 0, "Face", "Extrude Faces"}, + {0, NULL, 0, NULL, NULL}, + }; - prop = RNA_def_property(srna, "inset_mode", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_sdna(prop, NULL, "custom2"); - RNA_def_property_enum_items(prop, rna_node_geometry_attribute_input_type_items_float); - RNA_def_property_ui_text(prop, "Inset", "Changes the Inset input between Float and Attribute"); + prop = RNA_def_property(srna, "extrude_mode", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "custom1"); + RNA_def_property_enum_items(prop, rna_node_geometry_extrude_domain_items); + RNA_def_property_enum_default(prop, GEO_NODE_POINT_DISTRIBUTE_RANDOM); + RNA_def_property_ui_text(prop, "Extrude Mode", "Select mesh domain to extrude"); RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update"); } diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt index c3b1980648d..81b52ac34d2 100644 --- a/source/blender/nodes/CMakeLists.txt +++ b/source/blender/nodes/CMakeLists.txt @@ -184,7 +184,7 @@ set(SRC geometry/nodes/node_geo_curve_trim.cc geometry/nodes/node_geo_delete_geometry.cc geometry/nodes/node_geo_edge_split.cc - geometry/nodes/node_geo_mesh_inset.cc + geometry/nodes/node_geo_mesh_extrude.cc geometry/nodes/node_geo_input_material.cc geometry/nodes/node_geo_is_viewport.cc geometry/nodes/node_geo_join_geometry.cc diff --git a/source/blender/nodes/NOD_geometry.h b/source/blender/nodes/NOD_geometry.h index c3464aa052b..afbd4084676 100644 --- a/source/blender/nodes/NOD_geometry.h +++ b/source/blender/nodes/NOD_geometry.h @@ -70,7 +70,7 @@ void register_node_type_geo_curve_to_points(void); void register_node_type_geo_curve_trim(void); void register_node_type_geo_delete_geometry(void); void register_node_type_geo_edge_split(void); -void register_node_type_geo_mesh_inset(void); +void register_node_type_geo_mesh_extrude(void); void register_node_type_geo_input_material(void); void register_node_type_geo_is_viewport(void); void register_node_type_geo_join_geometry(void); diff --git a/source/blender/nodes/NOD_static_types.h b/source/blender/nodes/NOD_static_types.h index c5899f3bfc1..1fe2b18e2c0 100644 --- a/source/blender/nodes/NOD_static_types.h +++ b/source/blender/nodes/NOD_static_types.h @@ -311,7 +311,7 @@ DefNode(GeometryNode, GEO_NODE_CURVE_TO_POINTS, def_geo_curve_to_points, "CURVE_ DefNode(GeometryNode, GEO_NODE_CURVE_TRIM, def_geo_curve_trim, "CURVE_TRIM", CurveTrim, "Curve Trim", "") DefNode(GeometryNode, GEO_NODE_DELETE_GEOMETRY, 0, "DELETE_GEOMETRY", DeleteGeometry, "Delete Geometry", "") DefNode(GeometryNode, GEO_NODE_EDGE_SPLIT, 0, "EDGE_SPLIT", EdgeSplit, "Edge Split", "") -DefNode(GeometryNode, GEO_NODE_MESH_INSET, def_geo_mesh_inset, "MESH_INSET", MeshInset, "Mesh Inset", "") +DefNode(GeometryNode, GEO_NODE_MESH_EXTRUDE, def_geo_mesh_extrude, "MESH_EXTRUDE", MeshExtrude, "Mesh Extrude", "") DefNode(GeometryNode, GEO_NODE_INPUT_MATERIAL, def_geo_input_material, "INPUT_MATERIAL", InputMaterial, "Material", "") DefNode(GeometryNode, GEO_NODE_IS_VIEWPORT, 0, "IS_VIEWPORT", IsViewport, "Is Viewport", "") DefNode(GeometryNode, GEO_NODE_JOIN_GEOMETRY, 0, "JOIN_GEOMETRY", JoinGeometry, "Join Geometry", "") diff --git a/source/blender/nodes/geometry/nodes/node_geo_mesh_extrude.cc b/source/blender/nodes/geometry/nodes/node_geo_mesh_extrude.cc new file mode 100644 index 00000000000..40169228f23 --- /dev/null +++ b/source/blender/nodes/geometry/nodes/node_geo_mesh_extrude.cc @@ -0,0 +1,253 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" + +#include "BKE_mesh.h" +#include "BKE_node.h" + +#include "UI_interface.h" +#include "UI_resources.h" + +#include "bmesh.h" + +#include "node_geometry_util.hh" + +static bNodeSocketTemplate geo_node_mesh_extrude_in[] = { + {SOCK_GEOMETRY, N_("Geometry")}, + {SOCK_VECTOR, N_("Offset"), 0.0f, 0.0f, 1.0f, 0.0f, -FLT_MAX, FLT_MAX, PROP_TRANSLATION}, + {SOCK_STRING, N_("Selection")}, + {SOCK_STRING, N_("Out Selection")}, + + {-1, ""}, +}; + +static bNodeSocketTemplate geo_node_mesh_extrude_out[] = { + {SOCK_GEOMETRY, N_("Geometry")}, + {-1, ""}, +}; + +static void geo_node_mesh_extrude_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiItemR(layout, ptr, "extrude_mode", 0, "", ICON_NONE); +} + +static void geo_node_mesh_extrude_init(bNodeTree *UNUSED(ntree), bNode *node) +{ + node->custom1 = 0; +} + +namespace blender::nodes { + +static void SetOutputSelection(const std::string &selection_out_attribute_name, + BMesh *bm, + Mesh *result) +{ + MeshComponent component; + component.replace(result, GeometryOwnershipType::Editable); + + if (!selection_out_attribute_name.empty()) { + bke::OutputAttribute_Typed<bool> attribute = component.attribute_try_get_for_output_only<bool>( + selection_out_attribute_name, ATTR_DOMAIN_POINT); + BM_get_selected_vertices(bm, attribute.as_span().data()); + attribute.save(); + } +} + +static Mesh *extrude_vertices(const Me @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list [email protected] List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs
