[Bf-blender-cvs] [fd8244fb26c] functions: new Combine Behaviors node

Jacques Lucke noreply at git.blender.org
Thu Sep 5 10:40:42 CEST 2019


Commit: fd8244fb26c40c5604517ef075c26b6075830bc3
Author: Jacques Lucke
Date:   Thu Sep 5 10:38:03 2019 +0200
Branches: functions
https://developer.blender.org/rBfd8244fb26c40c5604517ef075c26b6075830bc3

new Combine Behaviors node

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

A	release/scripts/startup/nodes/bparticle_nodes/combine_behaviors.py
M	source/blender/simulations/bparticles/node_frontend.cpp

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

diff --git a/release/scripts/startup/nodes/bparticle_nodes/combine_behaviors.py b/release/scripts/startup/nodes/bparticle_nodes/combine_behaviors.py
new file mode 100644
index 00000000000..f8c68bcce4c
--- /dev/null
+++ b/release/scripts/startup/nodes/bparticle_nodes/combine_behaviors.py
@@ -0,0 +1,11 @@
+import bpy
+from .. base import BParticlesNode
+from .. node_builder import NodeBuilder
+
+class CombineBehaviorsNode(bpy.types.Node, BParticlesNode):
+    bl_idname = "bp_CombineBehaviorsNode"
+    bl_label = "Combine Behaviors"
+
+    def declaration(self, builder: NodeBuilder):
+        builder.particle_effector_input("behaviors", "Behaviors")
+        builder.particle_effector_output("behaviors", "Behaviors")
diff --git a/source/blender/simulations/bparticles/node_frontend.cpp b/source/blender/simulations/bparticles/node_frontend.cpp
index d896c166275..87eadd8cc80 100644
--- a/source/blender/simulations/bparticles/node_frontend.cpp
+++ b/source/blender/simulations/bparticles/node_frontend.cpp
@@ -33,32 +33,39 @@ class BehaviorCollector {
   MultiMap<std::string, OffsetHandler *> &m_offset_handlers;
 };
 
-static bool is_particle_type_node(VirtualNode *vnode)
-{
-  return STREQ(vnode->bnode()->idname, "bp_ParticleTypeNode");
-}
+static StringRef particle_type_idname = "bp_ParticleTypeNode";
+static StringRef combine_behaviors_idname = "bp_CombineBehaviorsNode";
 
 static std::unique_ptr<Action> build_action_list(VTreeDataGraph &vtree_data_graph,
                                                  VirtualNode *start_vnode,
                                                  StringRef name);
 
-static Vector<VirtualNode *> find_connected_particle_type_nodes(VirtualSocket *output_socket)
+static void find_connected_particle_type_nodes__recursive(VirtualSocket *output_vsocket,
+                                                          SetVector<VirtualNode *> &r_nodes)
 {
-  BLI_assert(output_socket->is_output());
-  Vector<VirtualNode *> type_nodes;
-  for (VirtualSocket *connected : output_socket->links()) {
+  BLI_assert(output_vsocket->is_output());
+  for (VirtualSocket *connected : output_vsocket->links()) {
     VirtualNode *connected_vnode = connected->vnode();
-    if (is_particle_type_node(connected_vnode)) {
-      type_nodes.append(connected_vnode);
+    if (connected_vnode->idname() == particle_type_idname) {
+      r_nodes.add(connected_vnode);
+    }
+    else if (connected_vnode->idname() == combine_behaviors_idname) {
+      find_connected_particle_type_nodes__recursive(connected_vnode->output(0), r_nodes);
     }
   }
-  return type_nodes;
 }
 
-static Vector<std::string> find_connected_particle_type_names(VirtualSocket *output_socket)
+static Vector<VirtualNode *> find_connected_particle_type_nodes(VirtualSocket *output_vsocket)
+{
+  SetVector<VirtualNode *> type_nodes;
+  find_connected_particle_type_nodes__recursive(output_vsocket, type_nodes);
+  return Vector<VirtualNode *>(type_nodes);
+}
+
+static Vector<std::string> find_connected_particle_type_names(VirtualSocket *output_vsocket)
 {
   Vector<std::string> type_names;
-  for (VirtualNode *vnode : find_connected_particle_type_nodes(output_socket)) {
+  for (VirtualNode *vnode : find_connected_particle_type_nodes(output_vsocket)) {
     type_names.append(vnode->name());
   }
   return type_names;



More information about the Bf-blender-cvs mailing list