[Bf-blender-cvs] [fafed6234b2] geometry-nodes: Geometry Nodes: Add edge split node functionality

Hans Goudey noreply at git.blender.org
Thu Oct 22 20:49:03 CEST 2020


Commit: fafed6234b2d1d7a3ab897fb128f0d39776ece37
Author: Hans Goudey
Date:   Thu Oct 22 13:48:56 2020 -0500
Branches: geometry-nodes
https://developer.blender.org/rBfafed6234b2d1d7a3ab897fb128f0d39776ece37

Geometry Nodes: Add edge split node functionality

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

M	source/blender/modifiers/intern/MOD_edgesplit.c
M	source/blender/nodes/geometry/nodes/node_geo_edge_split.cc

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

diff --git a/source/blender/modifiers/intern/MOD_edgesplit.c b/source/blender/modifiers/intern/MOD_edgesplit.c
index 882d080c08d..1743321d44d 100644
--- a/source/blender/modifiers/intern/MOD_edgesplit.c
+++ b/source/blender/modifiers/intern/MOD_edgesplit.c
@@ -53,7 +53,10 @@
 #include "MOD_modifiertypes.h"
 #include "MOD_ui_common.h"
 
-static Mesh *doEdgeSplit(Mesh *mesh, EdgeSplitModifierData *emd)
+/* For edge split modifier node. */
+Mesh *doEdgeSplit(Mesh *mesh, EdgeSplitModifierData *emd);
+
+Mesh *doEdgeSplit(Mesh *mesh, EdgeSplitModifierData *emd)
 {
   Mesh *result;
   BMesh *bm;
diff --git a/source/blender/nodes/geometry/nodes/node_geo_edge_split.cc b/source/blender/nodes/geometry/nodes/node_geo_edge_split.cc
index 86d35df882a..e6cddb9db7d 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_edge_split.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_edge_split.cc
@@ -17,8 +17,14 @@
 #include "BLI_math_base.h"
 #include "BLI_math_rotation.h"
 
+#include "DNA_modifier_types.h"
+
 #include "node_geometry_util.hh"
 
+extern "C" {
+Mesh *doEdgeSplit(Mesh *mesh, EdgeSplitModifierData *emd);
+}
+
 static bNodeSocketTemplate geo_node_edge_split_in[] = {
     {SOCK_GEOMETRY, N_("Geometry")},
     {SOCK_FLOAT,
@@ -39,11 +45,39 @@ static bNodeSocketTemplate geo_node_edge_split_out[] = {
     {-1, ""},
 };
 
+namespace blender::nodes {
+static void geo_edge_split_exec(bNode *UNUSED(node), GValueByName &inputs, GValueByName &outputs)
+{
+  GeometryPtr geometry_in = inputs.extract<GeometryPtr>("Geometry");
+
+  GeometryPtr geometry_out;
+  if (geometry_in.has_value()) {
+    Mesh *mesh_in = geometry_in->mesh_get_for_read();
+    if (mesh_in != nullptr) {
+      const float split_angle = inputs.extract<float>("Angle");
+      const bool use_sharp_flag = inputs.extract<bool>("Sharp Edges");
+
+      /* Use modifier struct to pass arguments to the modifier code. */
+      EdgeSplitModifierData emd = {.split_angle = split_angle, .flags = MOD_EDGESPLIT_FROMANGLE};
+      if (use_sharp_flag) {
+        emd.flags |= MOD_EDGESPLIT_FROMFLAG;
+      }
+
+      Mesh *mesh_out = doEdgeSplit(mesh_in, &emd);
+      geometry_out = GeometryPtr{new Geometry()};
+      geometry_out->mesh_set_and_transfer_ownership(mesh_out);
+    }
+  }
+  outputs.move_in("Geometry", std::move(geometry_out));
+}
+}  // namespace blender::nodes
+
 void register_node_type_geo_edge_split()
 {
   static bNodeType ntype;
 
   geo_node_type_base(&ntype, GEO_NODE_EDGE_SPLIT, "Edge Split", 0, 0);
   node_type_socket_templates(&ntype, geo_node_edge_split_in, geo_node_edge_split_out);
+  ntype.geometry_node_execute = blender::nodes::geo_edge_split_exec;
   nodeRegisterType(&ntype);
 }



More information about the Bf-blender-cvs mailing list