[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