[Bf-blender-cvs] [b06ed625007] functions: initial age reached event node

Jacques Lucke noreply at git.blender.org
Thu Jul 4 16:46:00 CEST 2019


Commit: b06ed625007764fd9275dca86d72a8df0e85aa79
Author: Jacques Lucke
Date:   Thu Jul 4 13:29:49 2019 +0200
Branches: functions
https://developer.blender.org/rBb06ed625007764fd9275dca86d72a8df0e85aa79

initial age reached event node

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

A	release/scripts/startup/nodes/bparticle_nodes/age_reached_event.py
M	release/scripts/startup/nodes/bparticle_nodes/particle_type.py
M	release/scripts/startup/nodes/declaration/__init__.py
M	release/scripts/startup/nodes/declaration/bparticles.py
M	release/scripts/startup/nodes/socket_builder.py
M	release/scripts/startup/nodes/sockets.py
M	source/blender/simulations/bparticles/c_wrapper.cpp

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

diff --git a/release/scripts/startup/nodes/bparticle_nodes/age_reached_event.py b/release/scripts/startup/nodes/bparticle_nodes/age_reached_event.py
new file mode 100644
index 00000000000..e9311c4964f
--- /dev/null
+++ b/release/scripts/startup/nodes/bparticle_nodes/age_reached_event.py
@@ -0,0 +1,16 @@
+import bpy
+from bpy.props import *
+from .. base import BParticlesNode
+from .. socket_builder import SocketBuilder
+
+class AgeReachedEventNode(bpy.types.Node, BParticlesNode):
+    bl_idname = "bp_AgeReachedEventNode"
+    bl_label = "Age Reached Event"
+
+    age: FloatProperty(name="Age", default=3)
+
+    def declaration(self, builder : SocketBuilder):
+        builder.event_input("events", "Event")
+
+    def draw(self, layout):
+        layout.prop(self, "age", text="Age")
diff --git a/release/scripts/startup/nodes/bparticle_nodes/particle_type.py b/release/scripts/startup/nodes/bparticle_nodes/particle_type.py
index 3933bb8f45e..35f711e3e41 100644
--- a/release/scripts/startup/nodes/bparticle_nodes/particle_type.py
+++ b/release/scripts/startup/nodes/bparticle_nodes/particle_type.py
@@ -8,3 +8,4 @@ class ParticleTypeNode(bpy.types.Node, BParticlesNode):
 
     def declaration(self, builder : SocketBuilder):
         builder.emitter_input("emitters", "Emitters")
+        builder.event_output("events", "Events")
diff --git a/release/scripts/startup/nodes/declaration/__init__.py b/release/scripts/startup/nodes/declaration/__init__.py
index 9fe5d41f10c..af2238d9673 100644
--- a/release/scripts/startup/nodes/declaration/__init__.py
+++ b/release/scripts/startup/nodes/declaration/__init__.py
@@ -4,4 +4,4 @@ from . pack_list import PackListDecl
 from . tree_interface import TreeInterfaceDecl
 from . variadic import AnyVariadicDecl
 from . vectorized import VectorizedInputDecl, VectorizedOutputDecl
-from . bparticles import EmitterSocketDecl
+from . bparticles import EmitterSocketDecl, EventSocketDecl
diff --git a/release/scripts/startup/nodes/declaration/bparticles.py b/release/scripts/startup/nodes/declaration/bparticles.py
index 19e13eaead9..e1672c2e54f 100644
--- a/release/scripts/startup/nodes/declaration/bparticles.py
+++ b/release/scripts/startup/nodes/declaration/bparticles.py
@@ -27,3 +27,29 @@ class EmitterSocketDecl(SocketDeclBase):
 
     def amount(self):
         return 1
+
+class EventSocketDecl(SocketDeclBase):
+    def __init__(self, node, identifier: str, display_name: str):
+        self.node = node
+        self.identifier = identifier
+        self.display_name = display_name
+
+    def build(self, node_sockets):
+        socket = node_sockets.new("bp_EventSocket", self.display_name, identifier=self.identifier)
+        socket.link_limit = MAX_LINK_LIMIT
+        return [socket]
+
+    def validate(self, sockets):
+        if len(sockets) != 1:
+            return False
+        socket = sockets[0]
+        if socket.bl_idname != "bp_EventSocket":
+            return False
+        if socket.name != self.display_name:
+            return False
+        if socket.link_limit != MAX_LINK_LIMIT:
+            return False
+        return True
+
+    def amount(self):
+        return 1
diff --git a/release/scripts/startup/nodes/socket_builder.py b/release/scripts/startup/nodes/socket_builder.py
index 4703705f791..058daf4f109 100644
--- a/release/scripts/startup/nodes/socket_builder.py
+++ b/release/scripts/startup/nodes/socket_builder.py
@@ -7,6 +7,7 @@ from . declaration import (
     VectorizedInputDecl,
     VectorizedOutputDecl,
     EmitterSocketDecl,
+    EventSocketDecl,
 )
 
 class SocketBuilder:
@@ -179,6 +180,14 @@ class SocketBuilder:
         decl = EmitterSocketDecl(self.node, identifier, name)
         self._add_output(decl)
 
+    def event_input(self, identifier, name):
+        decl = EventSocketDecl(self.node, identifier, name)
+        self._add_input(decl)
+
+    def event_output(self, identifier, name):
+        decl = EventSocketDecl(self.node, identifier, name)
+        self._add_output(decl)
+
 
 class SocketDeclMap:
     def __init__(self, node, input_declarations, output_declarations):
diff --git a/release/scripts/startup/nodes/sockets.py b/release/scripts/startup/nodes/sockets.py
index db55eb143ec..abafb8f0631 100644
--- a/release/scripts/startup/nodes/sockets.py
+++ b/release/scripts/startup/nodes/sockets.py
@@ -96,3 +96,10 @@ class EmitterSocket(bpy.types.NodeSocket, BaseSocket):
 
     def draw_color(self, context, node):
         return (1, 1, 1, 1)
+
+class EventSocket(bpy.types.NodeSocket, BaseSocket):
+    bl_idname = "bp_EventSocket"
+    bl_label = "Event Socket"
+
+    def draw_color(self, context, node):
+        return (0.2, 0.8, 0.2, 1)
diff --git a/source/blender/simulations/bparticles/c_wrapper.cpp b/source/blender/simulations/bparticles/c_wrapper.cpp
index fb2fabc90f1..59fb5412058 100644
--- a/source/blender/simulations/bparticles/c_wrapper.cpp
+++ b/source/blender/simulations/bparticles/c_wrapper.cpp
@@ -269,6 +269,11 @@ typedef std::function<void(
     bNode *bnode, IndexedBParticlesTree &bparticles_tree, SmallVector<Emitter *> &r_emitters)>
     EmitterInserter;
 
+typedef std::function<void(bNode *bnode,
+                           IndexedBParticlesTree &bparticles_tree,
+                           ModifierStepDescription &step_description)>
+    EventInserter;
+
 static void INSERT_EMITTER_mesh_surface(bNode *emitter_node,
                                         IndexedBParticlesTree &bparticles_tree,
                                         SmallVector<Emitter *> &r_emitters)
@@ -319,12 +324,41 @@ static void INSERT_EMITTER_point(bNode *emitter_node,
   }
 }
 
+static void INSERT_EVENT_age_reached(bNode *event_node,
+                                     IndexedBParticlesTree &bparticles_tree,
+                                     ModifierStepDescription &step_description)
+{
+  BLI_assert(STREQ(event_node->idname, "bp_AgeReachedEventNode"));
+  bNodeSocket *event_input = (bNodeSocket *)event_node->inputs.first;
+
+  for (SocketWithNode linked : bparticles_tree.base().linked(event_input)) {
+    if (!bparticles_tree.is_particle_type_node(linked.node)) {
+      continue;
+    }
+
+    bNode *type_node = linked.node;
+
+    PointerRNA rna = bparticles_tree.base().get_rna(event_node);
+    float age = RNA_float_get(&rna, "age");
+
+    EventFilter *event_filter = EVENT_age_reached(age);
+    Action *action = ACTION_kill();
+    Event *event = new EventActionTest(event_filter, action);
+    step_description.m_types.lookup_ref(type_node->name)->m_events.append(event);
+  }
+}
+
 static ModifierStepDescription *step_description_from_node_tree(bNodeTree *btree)
 {
+  SCOPED_TIMER(__func__);
+
   SmallMap<std::string, EmitterInserter> emitter_inserters;
   emitter_inserters.add_new("bp_MeshEmitterNode", INSERT_EMITTER_mesh_surface);
   emitter_inserters.add_new("bp_PointEmitterNode", INSERT_EMITTER_point);
 
+  SmallMap<std::string, EventInserter> event_inserters;
+  event_inserters.add_new("bp_AgeReachedEventNode", INSERT_EVENT_age_reached);
+
   ModifierStepDescription *step_description = new ModifierStepDescription();
 
   IndexedNodeTree indexed_tree(btree);
@@ -348,6 +382,12 @@ static ModifierStepDescription *step_description_from_node_tree(bNodeTree *btree
     }
   }
 
+  for (auto item : event_inserters.items()) {
+    for (bNode *event_node : indexed_tree.nodes_with_idname(item.key)) {
+      item.value(event_node, bparticles_tree, *step_description);
+    }
+  }
+
   return step_description;
 }



More information about the Bf-blender-cvs mailing list