[Bf-blender-cvs] [c79c0c3c9a3] geometry-tree-evaluation: initial working tree evaluation

Jacques Lucke noreply at git.blender.org
Wed Oct 21 17:29:41 CEST 2020


Commit: c79c0c3c9a3ae04627e373d1be9a6cc2e7dd98aa
Author: Jacques Lucke
Date:   Wed Oct 21 17:29:31 2020 +0200
Branches: geometry-tree-evaluation
https://developer.blender.org/rBc79c0c3c9a3ae04627e373d1be9a6cc2e7dd98aa

initial working tree evaluation

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

M	source/blender/blenkernel/BKE_geometry.hh
M	source/blender/blenkernel/BKE_node.h
M	source/blender/modifiers/CMakeLists.txt
M	source/blender/modifiers/intern/MOD_nodes.cc
M	source/blender/nodes/NOD_geometry_exec.hh
M	source/blender/nodes/geometry/nodes/node_geo_triangulate.cc

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

diff --git a/source/blender/blenkernel/BKE_geometry.hh b/source/blender/blenkernel/BKE_geometry.hh
index d75b0f8f6c7..612fe8f7d95 100644
--- a/source/blender/blenkernel/BKE_geometry.hh
+++ b/source/blender/blenkernel/BKE_geometry.hh
@@ -50,7 +50,7 @@ class Geometry {
   Mesh *extract_mesh()
   {
     Mesh *mesh = mesh_;
-    mesh_ = mesh;
+    mesh_ = nullptr;
     return mesh;
   }
 };
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index 3158c1d5acf..bc0f32f2618 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -123,7 +123,7 @@ class MFDataType;
 using NodeExpandInMFNetworkFunction = void (*)(blender::nodes::NodeMFNetworkBuilder &builder);
 using SocketGetMFDataTypeFunction = blender::fn::MFDataType (*)();
 using SocketExpandInMFNetworkFunction = void (*)(blender::nodes::SocketMFNetworkBuilder &builder);
-using GeometryNodeExecFunction = void (*)(struct bNode *,
+using GeometryNodeExecFunction = void (*)(struct bNode *node,
                                           blender::nodes::GeoNodeInput input,
                                           blender::nodes::GeoNodeOutput output);
 
diff --git a/source/blender/modifiers/CMakeLists.txt b/source/blender/modifiers/CMakeLists.txt
index f4b45936ef1..bacde95ee20 100644
--- a/source/blender/modifiers/CMakeLists.txt
+++ b/source/blender/modifiers/CMakeLists.txt
@@ -29,8 +29,10 @@ set(INC
   ../bmesh
   ../depsgraph
   ../editors/include
+  ../functions
   ../makesdna
   ../makesrna
+  ../nodes
   ../render/extern/include
   ../windowmanager
   ../../../intern/eigen
diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc
index 579168268cd..c2e31b0ed9a 100644
--- a/source/blender/modifiers/intern/MOD_nodes.cc
+++ b/source/blender/modifiers/intern/MOD_nodes.cc
@@ -63,6 +63,9 @@
 #include "MOD_modifiertypes.h"
 #include "MOD_ui_common.h"
 
+#include "NOD_derived_node_tree.hh"
+#include "NOD_geometry_exec.hh"
+
 using blender::float3;
 
 static void initData(ModifierData *md)
@@ -107,12 +110,97 @@ static PointCloud *modifyPointCloud(ModifierData *md,
   return pointcloud;
 }
 
+using namespace blender;
+using namespace blender::nodes;
+using namespace blender::fn;
+using namespace blender::bke;
+
+static Geometry *compute_geometry(const DOutputSocket *group_input,
+                                  Geometry *group_input_geometry,
+                                  const DInputSocket &socket_to_compute)
+{
+  Span<const DOutputSocket *> from_sockets = socket_to_compute.linked_sockets();
+  Span<const DGroupInput *> from_group_inputs = socket_to_compute.linked_group_inputs();
+  const int total_inputs = from_sockets.size() + from_group_inputs.size();
+  if (total_inputs != 1) {
+    return nullptr;
+  }
+  if (!from_group_inputs.is_empty()) {
+    return nullptr;
+  }
+
+  const DOutputSocket &from_socket = *from_sockets[0];
+  if (&from_socket == group_input) {
+    return group_input_geometry;
+  }
+  if (from_socket.idname() != "NodeSocketGeometry") {
+    return nullptr;
+  }
+
+  const DNode &from_node = from_socket.node();
+  if (from_node.inputs().size() != 1) {
+    return nullptr;
+  }
+
+  Geometry *input_geometry = compute_geometry(
+      group_input, group_input_geometry, from_node.input(0));
+
+  bNode *bnode = from_node.node_ref().bnode();
+  GeometryNodeExecFunction execute = bnode->typeinfo->geometry_node_execute;
+
+  LinearAllocator<> allocator;
+  GeoNodeInputBuilder input_builder;
+  GeometryP geometry_p{input_geometry};
+  input_builder.add("Geometry", CPPType::get<GeometryP>(), &geometry_p);
+  GeoNodeOutputCollector output_collector{allocator};
+  execute(bnode, input_builder, output_collector);
+
+  Geometry *output_geometry =
+      output_collector.get<GeometryP>(from_socket.socket_ref().bsocket()->identifier).p;
+  return output_geometry;
+}
+
 static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *UNUSED(ctx), Mesh *mesh)
 {
   NodesModifierData *nmd = reinterpret_cast<NodesModifierData *>(md);
-  UNUSED_VARS(nmd);
-  std::cout << __func__ << "\n";
-  return mesh;
+  if (nmd->node_tree == nullptr) {
+    return mesh;
+  }
+
+  NodeTreeRefMap tree_refs;
+  DerivedNodeTree tree{nmd->node_tree, tree_refs};
+
+  Span<const DNode *> input_nodes = tree.nodes_by_type("NodeGroupInput");
+  Span<const DNode *> output_nodes = tree.nodes_by_type("NodeGroupOutput");
+
+  if (input_nodes.size() > 1) {
+    return mesh;
+  }
+  if (output_nodes.size() != 1) {
+    return mesh;
+  }
+
+  Span<const DOutputSocket *> group_inputs = (input_nodes.size() == 1) ?
+                                                 input_nodes[0]->outputs().drop_back(1) :
+                                                 Span<const DOutputSocket *>{};
+  Span<const DInputSocket *> group_outputs = output_nodes[0]->inputs().drop_back(1);
+
+  if (group_outputs.size() != 1) {
+    return mesh;
+  }
+
+  const DInputSocket *group_output = group_outputs[0];
+  if (group_output->idname() != "NodeSocketGeometry") {
+    return mesh;
+  }
+
+  Geometry *input_geometry = Geometry::from_mesh(mesh);
+  Geometry *new_geometry = compute_geometry(group_inputs[0], input_geometry, *group_outputs[0]);
+  if (new_geometry == nullptr) {
+    return mesh;
+  }
+  Mesh *new_mesh = new_geometry->extract_mesh();
+  return new_mesh;
 }
 
 static void panel_draw(const bContext *UNUSED(C), Panel *panel)
diff --git a/source/blender/nodes/NOD_geometry_exec.hh b/source/blender/nodes/NOD_geometry_exec.hh
index 47b387a97a0..382fb5bc993 100644
--- a/source/blender/nodes/NOD_geometry_exec.hh
+++ b/source/blender/nodes/NOD_geometry_exec.hh
@@ -58,7 +58,7 @@ class GeoNodeInput {
 
   template<typename T> T &get(StringRef name)
   {
-    return *builder_.values_.lookup(name).get<T>();
+    return *this->get(name).get<T>();
   }
 };
 
@@ -73,6 +73,16 @@ class GeoNodeOutputCollector {
   GeoNodeOutputCollector(LinearAllocator<> &allocator) : allocator_(allocator)
   {
   }
+
+  GMutablePointer get(StringRef name)
+  {
+    return values_.lookup(name);
+  }
+
+  template<typename T> T &get(StringRef name)
+  {
+    return *this->get(name).get<T>();
+  }
 };
 
 class GeoNodeOutput {
diff --git a/source/blender/nodes/geometry/nodes/node_geo_triangulate.cc b/source/blender/nodes/geometry/nodes/node_geo_triangulate.cc
index b9e53947449..a9a434c7277 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_triangulate.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_triangulate.cc
@@ -38,11 +38,14 @@ namespace blender::nodes {
 static void geo_triangulate_exec(bNode *UNUSED(node), GeoNodeInput input, GeoNodeOutput output)
 {
   Geometry *geometry = input.get<GeometryP>("Geometry").p;
-  Mesh *old_mesh = geometry->extract_mesh();
-  delete geometry;
-  Mesh *new_mesh = triangulate_mesh(old_mesh, 3, 0, 4, 0);
-  Geometry *new_geometry = Geometry::from_mesh(new_mesh);
-  output.set("Geometry", GeometryP{new_geometry});
+  if (geometry != nullptr) {
+    Mesh *old_mesh = geometry->extract_mesh();
+    if (old_mesh != nullptr) {
+      Mesh *new_mesh = triangulate_mesh(old_mesh, 3, 0, 4, 0);
+      geometry = Geometry::from_mesh(new_mesh);
+    }
+  }
+  output.set("Geometry", GeometryP{geometry});
 }
 }  // namespace blender::nodes



More information about the Bf-blender-cvs mailing list