[Bf-blender-cvs] [a2f5fc2] object_nodes: Generalization of the dynamic socket list feature, currently used by mesh-combine.

Lukas Tönne noreply at git.blender.org
Wed Dec 23 14:46:05 CET 2015


Commit: a2f5fc297f4c5ddd32d1d92cb89b1e807867ba0f
Author: Lukas Tönne
Date:   Wed Dec 23 14:38:59 2015 +0100
Branches: object_nodes
https://developer.blender.org/rBa2f5fc297f4c5ddd32d1d92cb89b1e807867ba0f

Generalization of the dynamic socket list feature, currently used by mesh-combine.

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

M	release/scripts/nodes/common_nodes.py
M	release/scripts/nodes/geometry_nodes.py

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

diff --git a/release/scripts/nodes/common_nodes.py b/release/scripts/nodes/common_nodes.py
index cec8cd7..3dc5b5e 100644
--- a/release/scripts/nodes/common_nodes.py
+++ b/release/scripts/nodes/common_nodes.py
@@ -101,6 +101,75 @@ class NodeBase():
 
 
 ###############################################################################
+
+
+class DynamicSocketListNode:
+    def add_extender(self, socketlist, sockettype):
+        socket = socketlist.new(sockettype, "")
+        socket.is_placeholder = True
+        return socket
+
+    def update_socket_list(self, socketlist, sockettype, insert=None):
+        ntree = self.id_data
+
+        # build map of connected inputs
+        input_links = dict()
+        for link in ntree.links:
+            if link.to_node == self:
+                input_links[link.to_socket] = (link, link.from_socket)
+
+        # remove unconnected sockets
+        for socket in socketlist:
+            if socket not in input_links and socket != insert:
+                socketlist.remove(socket)
+            else:
+                socket.is_placeholder = False
+
+        # shift sockets to make room for a new link
+        if insert is not None:
+            socketlist.new(sockettype, "")
+            nsocket = socketlist[-1]
+            for socket in reversed(socketlist[:-1]):
+                link, from_socket = input_links.get(socket, (None, None))
+                if link is not None:
+                    ntree.links.remove(link)
+                    ntree.links.new(from_socket, nsocket)
+                nsocket = socket
+                if socket == insert:
+                    break
+
+        self.add_extender(socketlist, sockettype)
+
+    def compile_socket_list(self, compiler, socketlist, passtype, jointype, valuetype):
+        ntree = self.id_data
+
+        # list of connected inputs
+        used_inputs = set()
+        for link in ntree.links:
+            if link.to_node == self:
+                used_inputs.add(link.to_socket)
+        # make a sorted index list
+        used_inputs = [ i for i,socket in enumerate(socketlist) if socket in used_inputs ]
+
+        if len(used_inputs) > 0:
+            node = compiler.add_node(passtype)
+            compiler.map_input(used_inputs[0], node.inputs[0])
+            result = node.outputs[0]
+        
+            for index in used_inputs[1:]:
+                node = compiler.add_node(jointype)
+                compiler.link(result, node.inputs[0])
+                compiler.map_input(index, node.inputs[1])
+                result = node.outputs[0]
+
+        else:
+            node = compiler.add_node(valuetype)
+            result = node.outputs[0]
+
+        return result
+
+
+###############################################################################
 # Generic Nodes
 
 class CommonNodeBase(NodeBase):
diff --git a/release/scripts/nodes/geometry_nodes.py b/release/scripts/nodes/geometry_nodes.py
index 76bf022..bd81aba 100644
--- a/release/scripts/nodes/geometry_nodes.py
+++ b/release/scripts/nodes/geometry_nodes.py
@@ -24,7 +24,7 @@ from bpy.types import Operator, ObjectNode, NodeTree, Node
 from bpy.props import *
 from nodeitems_utils import NodeCategory, NodeItem
 from mathutils import *
-from common_nodes import NodeTreeBase, NodeBase, enum_property_copy, enum_property_value_prop
+from common_nodes import NodeTreeBase, NodeBase, DynamicSocketListNode, enum_property_copy, enum_property_value_prop
 import group_nodes
 
 ###############################################################################
@@ -135,87 +135,33 @@ class GeometryMeshLoadNode(GeometryNodeBase, ObjectNode):
         compiler.map_output(0, node.outputs[0])
 
 
-class GeometryMeshCombineNode(GeometryNodeBase, ObjectNode):
+class GeometryMeshCombineNode(GeometryNodeBase, ObjectNode, DynamicSocketListNode):
     '''Combine multiple meshes into one'''
     bl_idname = 'GeometryMeshCombineNode'
     bl_label = 'Combine Meshes'
 
-    def add_extender(self):
-        socket = self.inputs.new('GeometrySocket', "")
-        socket.is_placeholder = True
-        return socket
-
     def init(self, context):
         if self.is_updating:
             return
         with self.update_lock():
-            self.add_extender()
+            self.update_socket_list(self.inputs, 'GeometrySocket')
             self.outputs.new('GeometrySocket', "")
 
-    def update_inputs(self, insert=None):
+    def update(self):
         if self.is_updating:
             return
         with self.update_lock():
-            ntree = self.id_data
-
-            # build map of connected inputs
-            input_links = dict()
-            for link in ntree.links:
-                if link.to_node == self:
-                    input_links[link.to_socket] = (link, link.from_socket)
-
-            # remove unconnected sockets
-            for socket in self.inputs:
-                if socket not in input_links and socket != insert:
-                    self.inputs.remove(socket)
-                else:
-                    socket.is_placeholder = False
-
-            # shift sockets to make room for a new link
-            if insert is not None:
-                self.inputs.new('GeometrySocket', "")
-                nsocket = self.inputs[-1]
-                for socket in reversed(self.inputs[:-1]):
-                    link, from_socket = input_links.get(socket, (None, None))
-                    if link is not None:
-                        ntree.links.remove(link)
-                        ntree.links.new(from_socket, nsocket)
-                    nsocket = socket
-                    if socket == insert:
-                        break
-
-            self.add_extender()
-
-    def update(self):
-        self.update_inputs()
+            self.update_socket_list(self.inputs, 'GeometrySocket')
 
     def insert_link(self, link):
-        self.update_inputs(link.to_socket)
+        if self.is_updating:
+            return
+        with self.update_lock():
+            self.update_socket_list(self.inputs, 'GeometrySocket', insert=link.to_socket)
 
     def compile(self, compiler):
-        ntree = self.id_data
-
-        # list of connected inputs
-        used_inputs = set()
-        for link in ntree.links:
-            if link.to_node == self:
-                used_inputs.add(link.to_socket)
-        # make a sorted index list
-        used_inputs = [ i for i,socket in enumerate(self.inputs) if socket in used_inputs ]
-
-        if len(used_inputs) > 0:
-            node = compiler.add_node("PASS_MESH")
-            compiler.map_input(used_inputs[0], node.inputs[0])
-            result = node.outputs[0]
-        
-            for index in used_inputs[1:]:
-                node = compiler.add_node("MESH_COMBINE")
-                compiler.link(result, node.inputs[0])
-                compiler.map_input(index, node.inputs[1])
-                
-                result = node.outputs[0]
-
-            compiler.map_output(0, result)
+        result = self.compile_socket_list(compiler, self.inputs, "PASS_MESH", "MESH_COMBINE", "VALUE_MESH")
+        compiler.map_output(0, result)
 
 
 class GeometryMeshArrayNode(GeometryNodeBase, ObjectNode):




More information about the Bf-blender-cvs mailing list