[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