[Bf-blender-cvs] [33c35c93409] soc-2021-porting-modifiers-to-nodes-extrude-and-move: Geometry Nodes: Mesh Extrude

Fabian Schempp noreply at git.blender.org
Mon Aug 16 07:48:28 CEST 2021


Commit: 33c35c93409d7da02f631fd1703cb25737721f37
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/rB33c35c93409d7da02f631fd1703cb25737721f37

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

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

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. @@



More information about the Bf-blender-cvs mailing list