[Bf-blender-cvs] [33e09fe233b] functions: initial particle type and mesh emitter node

Jacques Lucke noreply at git.blender.org
Tue Jul 2 16:11:44 CEST 2019


Commit: 33e09fe233be889b66ac1b0060f97a3f4160bd74
Author: Jacques Lucke
Date:   Tue Jul 2 12:40:01 2019 +0200
Branches: functions
https://developer.blender.org/rB33e09fe233be889b66ac1b0060f97a3f4160bd74

initial particle type and mesh emitter node

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

M	release/scripts/startup/nodes/base.py
A	release/scripts/startup/nodes/bparticle_nodes/__init__.py
A	release/scripts/startup/nodes/bparticle_nodes/mesh_emitter.py
A	release/scripts/startup/nodes/bparticle_nodes/particle_type.py
M	release/scripts/startup/nodes/bparticles_tree.py
M	release/scripts/startup/nodes/declaration/__init__.py
A	release/scripts/startup/nodes/declaration/bparticles.py
M	release/scripts/startup/nodes/function_tree.py
M	release/scripts/startup/nodes/menu.py
M	release/scripts/startup/nodes/search.py
M	release/scripts/startup/nodes/socket_builder.py
M	release/scripts/startup/nodes/sockets.py
M	release/scripts/startup/nodes/sync.py

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

diff --git a/release/scripts/startup/nodes/base.py b/release/scripts/startup/nodes/base.py
index 0965e2ed9c6..b6c737ece93 100644
--- a/release/scripts/startup/nodes/base.py
+++ b/release/scripts/startup/nodes/base.py
@@ -205,6 +205,9 @@ class BaseSocket:
 class FunctionNode(BaseNode):
     pass
 
+class BParticlesNode(BaseNode):
+    pass
+
 class DataSocket(BaseSocket):
     data_type: StringProperty(
         maxlen=64)
diff --git a/release/scripts/startup/nodes/bparticle_nodes/__init__.py b/release/scripts/startup/nodes/bparticle_nodes/__init__.py
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/release/scripts/startup/nodes/bparticle_nodes/mesh_emitter.py b/release/scripts/startup/nodes/bparticle_nodes/mesh_emitter.py
new file mode 100644
index 00000000000..467ddf948c7
--- /dev/null
+++ b/release/scripts/startup/nodes/bparticle_nodes/mesh_emitter.py
@@ -0,0 +1,10 @@
+import bpy
+from .. base import BParticlesNode
+from .. socket_builder import SocketBuilder
+
+class MeshEmitterNode(bpy.types.Node, BParticlesNode):
+    bl_idname = "bp_MeshEmitterNode"
+    bl_label = "Mesh Emitter"
+
+    def declaration(self, builder : SocketBuilder):
+        builder.emitter_output("emitter", "Emitter")
diff --git a/release/scripts/startup/nodes/bparticle_nodes/particle_type.py b/release/scripts/startup/nodes/bparticle_nodes/particle_type.py
new file mode 100644
index 00000000000..3933bb8f45e
--- /dev/null
+++ b/release/scripts/startup/nodes/bparticle_nodes/particle_type.py
@@ -0,0 +1,10 @@
+import bpy
+from .. base import BParticlesNode
+from .. socket_builder import SocketBuilder
+
+class ParticleTypeNode(bpy.types.Node, BParticlesNode):
+    bl_idname = "bp_ParticleTypeNode"
+    bl_label = "Particle Type"
+
+    def declaration(self, builder : SocketBuilder):
+        builder.emitter_input("emitters", "Emitters")
diff --git a/release/scripts/startup/nodes/bparticles_tree.py b/release/scripts/startup/nodes/bparticles_tree.py
index 1f3feb3992b..ef245c917ba 100644
--- a/release/scripts/startup/nodes/bparticles_tree.py
+++ b/release/scripts/startup/nodes/bparticles_tree.py
@@ -1,7 +1,8 @@
 import bpy
 from . base import BaseTree
+from . function_tree import TreeWithFunctionNodes
 
-class BParticlesTree(bpy.types.NodeTree, BaseTree):
+class BParticlesTree(bpy.types.NodeTree, BaseTree, TreeWithFunctionNodes):
     bl_idname = "BParticlesTree"
     bl_icon = "PARTICLES"
     bl_label = "BParticles"
diff --git a/release/scripts/startup/nodes/declaration/__init__.py b/release/scripts/startup/nodes/declaration/__init__.py
index 60121a1ed48..9fe5d41f10c 100644
--- a/release/scripts/startup/nodes/declaration/__init__.py
+++ b/release/scripts/startup/nodes/declaration/__init__.py
@@ -4,3 +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
diff --git a/release/scripts/startup/nodes/declaration/bparticles.py b/release/scripts/startup/nodes/declaration/bparticles.py
new file mode 100644
index 00000000000..19e13eaead9
--- /dev/null
+++ b/release/scripts/startup/nodes/declaration/bparticles.py
@@ -0,0 +1,29 @@
+from . base import SocketDeclBase
+
+MAX_LINK_LIMIT = 4095
+
+class EmitterSocketDecl(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_EmitterSocket", 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_EmitterSocket":
+            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/function_tree.py b/release/scripts/startup/nodes/function_tree.py
index 65f174fd6b2..296f3b219b5 100644
--- a/release/scripts/startup/nodes/function_tree.py
+++ b/release/scripts/startup/nodes/function_tree.py
@@ -9,7 +9,14 @@ FunctionInput = namedtuple("FunctionInput",
 FunctionOutput = namedtuple("FunctionOutput",
     ["data_type", "name", "identifier"])
 
-class FunctionTree(bpy.types.NodeTree, BaseTree):
+class TreeWithFunctionNodes:
+    def iter_dependency_trees(self):
+        for node in self.nodes:
+            if node.bl_idname == "fn_CallNode":
+                if node.function_tree is not None:
+                    yield node.function_tree
+
+class FunctionTree(bpy.types.NodeTree, BaseTree, TreeWithFunctionNodes):
     bl_idname = "FunctionTree"
     bl_icon = "MOD_DATA_TRANSFER"
     bl_label = "Function Nodes"
@@ -47,9 +54,3 @@ class FunctionTree(bpy.types.NodeTree, BaseTree):
             if node.bl_idname == "fn_FunctionOutputNode":
                 return node
         return None
-
-    def iter_dependency_trees(self):
-        for node in self.nodes:
-            if node.bl_idname == "fn_CallNode":
-                if node.function_tree is not None:
-                    yield node.function_tree
diff --git a/release/scripts/startup/nodes/menu.py b/release/scripts/startup/nodes/menu.py
index aef1557bd33..3cb6012b589 100644
--- a/release/scripts/startup/nodes/menu.py
+++ b/release/scripts/startup/nodes/menu.py
@@ -1,9 +1,10 @@
 import bpy
 from . function_tree import FunctionTree
+from . bparticles_tree import BParticlesTree
 
 def draw_menu(self, context):
     tree = context.space_data.node_tree
-    if not isinstance(tree, FunctionTree):
+    if not isinstance(tree, (FunctionTree, BParticlesTree)):
         return
 
     layout = self.layout
diff --git a/release/scripts/startup/nodes/search.py b/release/scripts/startup/nodes/search.py
index f8985070925..ff8263d69b9 100644
--- a/release/scripts/startup/nodes/search.py
+++ b/release/scripts/startup/nodes/search.py
@@ -20,7 +20,7 @@ class NodeSearch(bpy.types.Operator):
 
     @classmethod
     def poll(cls, context):
-        try: return context.space_data.node_tree.bl_idname == "FunctionTree"
+        try: return context.space_data.node_tree.bl_idname in ("FunctionTree", "BParticlesTree")
         except: return False
 
     def invoke(self, context, event):
diff --git a/release/scripts/startup/nodes/socket_builder.py b/release/scripts/startup/nodes/socket_builder.py
index 07f01d925f6..4703705f791 100644
--- a/release/scripts/startup/nodes/socket_builder.py
+++ b/release/scripts/startup/nodes/socket_builder.py
@@ -6,6 +6,7 @@ from . declaration import (
     TreeInterfaceDecl,
     VectorizedInputDecl,
     VectorizedOutputDecl,
+    EmitterSocketDecl,
 )
 
 class SocketBuilder:
@@ -167,6 +168,18 @@ class SocketBuilder:
         self._add_output(decl)
 
 
+    # BParticles
+    ###################################
+
+    def emitter_input(self, identifier, name):
+        decl = EmitterSocketDecl(self.node, identifier, name)
+        self._add_input(decl)
+
+    def emitter_output(self, identifier, name):
+        decl = EmitterSocketDecl(self.node, identifier, name)
+        self._add_output(decl)
+
+
 class SocketDeclMap:
     def __init__(self, node, input_declarations, output_declarations):
         self.node = node
diff --git a/release/scripts/startup/nodes/sockets.py b/release/scripts/startup/nodes/sockets.py
index 56f159d5ed7..db55eb143ec 100644
--- a/release/scripts/startup/nodes/sockets.py
+++ b/release/scripts/startup/nodes/sockets.py
@@ -89,3 +89,10 @@ class BooleanSocket(bpy.types.NodeSocket, DataSocket):
 class CustomColoredSocket(bpy.types.NodeSocket, DataSocket):
     bl_idname = "fn_CustomColoredSocket"
     bl_label = "Custom Colored Socket"
+
+class EmitterSocket(bpy.types.NodeSocket, BaseSocket):
+    bl_idname = "bp_EmitterSocket"
+    bl_label = "Emitter Socket"
+
+    def draw_color(self, context, node):
+        return (1, 1, 1, 1)
diff --git a/release/scripts/startup/nodes/sync.py b/release/scripts/startup/nodes/sync.py
index b2871db9932..feeae0fcc77 100644
--- a/release/scripts/startup/nodes/sync.py
+++ b/release/scripts/startup/nodes/sync.py
@@ -72,10 +72,11 @@ def build_tree_dependency_graph():
     Every edge (A, B) means: Changes in A might affect B.
     '''
     from . function_tree import FunctionTree
+    from . bparticles_tree import BParticlesTree
 
     builder = DirectedGraphBuilder()
     for tree in bpy.data.node_groups:
-        if isinstance(tree, FunctionTree):
+        if isinstance(tree, (FunctionTree, BParticlesTree)):
             builder.add_vertex(tree)
             for dependency_tree in tree.iter_dependency_trees():
                 builder.add_directed_edge(



More information about the Bf-blender-cvs mailing list