[Bf-blender-cvs] [4127c7ff876] functions: make execute and influence sockets work in groups

Jacques Lucke noreply at git.blender.org
Tue Dec 3 15:11:53 CET 2019


Commit: 4127c7ff87600bae3da7b74a85b152d49ca5f166
Author: Jacques Lucke
Date:   Tue Dec 3 15:07:40 2019 +0100
Branches: functions
https://developer.blender.org/rB4127c7ff87600bae3da7b74a85b152d49ca5f166

make execute and influence sockets work in groups

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

M	release/scripts/startup/nodes/declaration/__init__.py
M	release/scripts/startup/nodes/declaration/bparticles.py
M	release/scripts/startup/nodes/function_nodes/groups.py
M	release/scripts/startup/nodes/function_tree.py
M	release/scripts/startup/nodes/node_builder.py
M	release/scripts/startup/nodes/node_operators.py
M	source/blender/blenkernel/intern/inlined_node_tree.cc
M	source/blender/functions/intern/inlined_tree_multi_function_network/generate.cc
M	source/blender/simulations/bparticles/particle_function.cpp

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

diff --git a/release/scripts/startup/nodes/declaration/__init__.py b/release/scripts/startup/nodes/declaration/__init__.py
index a67bcbfe059..ea1185b4b5a 100644
--- a/release/scripts/startup/nodes/declaration/__init__.py
+++ b/release/scripts/startup/nodes/declaration/__init__.py
@@ -8,5 +8,6 @@ from . vectorized import VectorizedInputDecl, VectorizedOutputDecl
 from . bparticles import (
     InfluencesSocketDecl,
     ExecuteOutputDecl,
+    ExecuteInputDecl,
     ExecuteInputListDecl,
 )
diff --git a/release/scripts/startup/nodes/declaration/bparticles.py b/release/scripts/startup/nodes/declaration/bparticles.py
index f4b2d96c810..cd7bf1fc49a 100644
--- a/release/scripts/startup/nodes/declaration/bparticles.py
+++ b/release/scripts/startup/nodes/declaration/bparticles.py
@@ -56,6 +56,27 @@ class ExecuteOutputDecl(SocketDeclBase):
             return False
         return True
 
+
+class ExecuteInputDecl(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):
+        return [node_sockets.new("fn_ExecuteSocket", self.display_name, identifier=self.identifier)]
+
+    def amount(self):
+        return 1
+
+    def validate(self, sockets):
+        if len(sockets) != 1:
+            return False
+        if sockets[0].bl_idname != "fn_ExecuteSocket":
+            return False
+        return True
+
+
 class ExecuteInputListDecl(SocketDeclBase):
     def __init__(self, node, identifier: str, prop_name: str, display_name: str):
         self.node = node
diff --git a/release/scripts/startup/nodes/function_nodes/groups.py b/release/scripts/startup/nodes/function_nodes/groups.py
index a3d765d29a8..db306aeff87 100644
--- a/release/scripts/startup/nodes/function_nodes/groups.py
+++ b/release/scripts/startup/nodes/function_nodes/groups.py
@@ -6,62 +6,106 @@ from .. function_tree import FunctionTree
 from .. node_builder import NodeBuilder
 from .. ui import NodeSidebarPanel
 
-class GroupInputNode(BaseNode):
-    sort_index: IntProperty()
-
-class GroupOutputNode(BaseNode):
-    sort_index: IntProperty()
+interface_type_items = [
+    ("DATA", "Data", "Some data type like integer or vector", "NONE", 0),
+    ("EXECUTE", "Control Flow", "", "NONE", 1),
+    ("INFLUENCES", "Influences", "", "NONE", 2),
+]
 
-class GroupDataInputNode(bpy.types.Node, GroupInputNode):
-    bl_idname = "fn_GroupDataInputNode"
-    bl_label = "Group Data Input"
+class GroupInputNode(bpy.types.Node, BaseNode):
+    bl_idname = "fn_GroupInputNode"
+    bl_label = "Group Input"
 
     input_name: StringProperty(
         default="Name",
-        update=GroupInputNode.sync_tree,
+        update=BaseNode.sync_tree,
+    )
+
+    sort_index: IntProperty()
+
+    interface_type: EnumProperty(
+        items=interface_type_items,
+        default="DATA",
+        update= BaseNode.sync_tree,
     )
 
     data_type: StringProperty(
         default="Float",
-        update=GroupInputNode.sync_tree,
+        update=BaseNode.sync_tree,
     )
 
     def declaration(self, builder: NodeBuilder):
-        builder.fixed_output("value", "Value", self.data_type)
+        builder.background_color((0.8, 0.8, 0.8))
+
+        if self.interface_type == "DATA":
+            builder.fixed_output("value", "Value", self.data_type)
+        elif self.interface_type == "EXECUTE":
+            builder.execute_output("execute", "Execute")
+        elif self.interface_type == "INFLUENCES":
+            builder.influences_output("influences", "Influences")
+        else:
+            assert False
 
     def draw(self, layout):
-        layout.prop(self, "input_name", text="")
+        col = layout.column()
+        col.prop(self, "input_name", text="")
+
+        if self.interface_type == "DATA":
+            if hasattr(self.outputs[0], "draw_property"):
+                self.outputs[0].draw_property(col, self, "Default")
 
-        if hasattr(self.outputs[0], "draw_property"):
-            self.outputs[0].draw_property(layout, self, "Default")
+            self.invoke_type_selection(col, "set_data_type", "Select Type")
 
-        self.invoke_type_selection(layout, "set_type", "Select Type")
+    def draw_advanced(self, layout):
+        layout.prop(self, "interface_type", text="")
 
-    def set_type(self, data_type):
+    def set_data_type(self, data_type):
         self.data_type = data_type
 
-class GroupDataOutputNode(bpy.types.Node, GroupOutputNode):
-    bl_idname = "fn_GroupDataOutputNode"
-    bl_label = "Group Data Output"
+
+class GroupOutputNode(bpy.types.Node, BaseNode):
+    bl_idname = "fn_GroupOutputNode"
+    bl_label = "Group Output"
+
+    sort_index: IntProperty()
 
     output_name: StringProperty(
         default="Name",
-        update=GroupOutputNode.sync_tree,
+        update=BaseNode.sync_tree,
+    )
+
+    interface_type: EnumProperty(
+        items=interface_type_items,
+        default="DATA",
+        update= BaseNode.sync_tree,
     )
 
     data_type: StringProperty(
         default="Float",
-        update=GroupOutputNode.sync_tree,
+        update=BaseNode.sync_tree,
     )
 
     def declaration(self, builder: NodeBuilder):
-        builder.fixed_input("value", "Value", self.data_type)
+        builder.background_color((0.8, 0.8, 0.8))
+
+        if self.interface_type == "DATA":
+            builder.fixed_input("value", "Value", self.data_type)
+        elif self.interface_type == "EXECUTE":
+            builder.single_execute_input("execute", "Execute")
+        elif self.interface_type == "INFLUENCES":
+            builder.influences_input("influences", "Influences")
 
     def draw(self, layout):
-        layout.prop(self, "output_name", text="")
-        self.invoke_type_selection(layout, "set_type", "Select Type")
+        col = layout.column()
+        col.prop(self, "output_name", text="")
+
+        if self.interface_type == "DATA":
+            self.invoke_type_selection(col, "set_type_type", "Select Type")
+
+    def draw_advanced(self, layout):
+        layout.prop(self, "interface_type", text="")
 
-    def set_type(self, data_type):
+    def set_type_type(self, data_type):
         self.data_type = data_type
 
 class GroupNode(bpy.types.Node, FunctionNode):
@@ -78,17 +122,31 @@ class GroupNode(bpy.types.Node, FunctionNode):
             return
 
         for input_node in self.node_group.get_input_nodes():
-            builder.fixed_input(
-                input_node.identifier,
-                input_node.input_name,
-                input_node.data_type,
-                default=input_node.outputs[0].get_state())
+            if input_node.interface_type == "DATA":
+                builder.fixed_input(
+                    input_node.identifier,
+                    input_node.input_name,
+                    input_node.data_type,
+                    default=input_node.outputs[0].get_state())
+            elif input_node.interface_type == "EXECUTE":
+                builder.single_execute_input(input_node.identifier, input_node.input_name)
+            elif input_node.interface_type == "INFLUENCES":
+                builder.influences_input(input_node.identifier, input_node.input_name)
+            else:
+                assert False
 
         for output_node in self.node_group.get_output_nodes():
-            builder.fixed_output(
-                output_node.identifier,
-                output_node.output_name,
-                output_node.data_type)
+            if output_node.interface_type == "DATA":
+                builder.fixed_output(
+                    output_node.identifier,
+                    output_node.output_name,
+                    output_node.data_type)
+            elif output_node.interface_type == "EXECUTE":
+                builder.execute_output(output_node.identifier, output_node.output_name)
+            elif output_node.interface_type == "INFLUENCES":
+                builder.influences_output(output_node.identifier, output_node.output_name)
+            else:
+                assert False
 
     def draw(self, layout):
         text = "Select Group" if self.node_group is None else self.node_group.name
diff --git a/release/scripts/startup/nodes/function_tree.py b/release/scripts/startup/nodes/function_tree.py
index 48c7bbc40d4..227c6d8b8e8 100644
--- a/release/scripts/startup/nodes/function_tree.py
+++ b/release/scripts/startup/nodes/function_tree.py
@@ -10,12 +10,12 @@ class FunctionTree(bpy.types.NodeTree, BaseTree):
     bl_label = "Function Nodes"
 
     def get_input_nodes(self):
-        input_nodes = [node for node in self.nodes if node.bl_idname == "fn_GroupDataInputNode"]
+        input_nodes = [node for node in self.nodes if node.bl_idname == "fn_GroupInputNode"]
         sorted_input_nodes = sorted(input_nodes, key=lambda node: (node.sort_index, node.name))
         return sorted_input_nodes
 
     def get_output_nodes(self):
-        output_nodes = [node for node in self.nodes if node.bl_idname == "fn_GroupDataOutputNode"]
+        output_nodes = [node for node in self.nodes if node.bl_idname == "fn_GroupOutputNode"]
         sorted_output_nodes = sorted(output_nodes, key=lambda node: (node.sort_index, node.name))
         return sorted_output_nodes
 
diff --git a/release/scripts/startup/nodes/node_builder.py b/release/scripts/startup/nodes/node_builder.py
index 31933ee9681..af2c6f45137 100644
--- a/release/scripts/startup/nodes/node_builder.py
+++ b/release/scripts/startup/nodes/node_builder.py
@@ -8,6 +8,7 @@ from . declaration import (
     InfluencesSocketDecl,
     ExecuteOutputDecl,
     ExecuteInputListDecl,
+    ExecuteInputDecl,
 
     NoDefaultValue,
 )
@@ -198,6 +199,10 @@ class NodeBuilder:
         decl = ExecuteInputListDecl(self.node, identifier, prop_name, display_name)
         self._add_input(decl)
 
+    def single_execute_input(self, identifier, name):
+        decl = ExecuteInputDecl(self.node, identifier, name)
+        self._add_input(decl)
+
     def execute_output(self, identifier, name):
         decl = ExecuteOutputDecl(self.node, identifier, name)
         self._add_output(decl)
diff --git a/release/scripts/start

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list