[Bf-blender-cvs] [81d5383ce2b] functions: save socket states

Jacques Lucke noreply at git.blender.org
Wed Mar 20 19:07:42 CET 2019


Commit: 81d5383ce2baf982a060b0bb29df2b4f70acd846
Author: Jacques Lucke
Date:   Wed Mar 20 19:07:35 2019 +0100
Branches: functions
https://developer.blender.org/rB81d5383ce2baf982a060b0bb29df2b4f70acd846

save socket states

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

M	release/scripts/startup/function_nodes/base.py
M	release/scripts/startup/function_nodes/sockets.py

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

diff --git a/release/scripts/startup/function_nodes/base.py b/release/scripts/startup/function_nodes/base.py
index b40c76e84e4..7bade2e64a3 100644
--- a/release/scripts/startup/function_nodes/base.py
+++ b/release/scripts/startup/function_nodes/base.py
@@ -21,6 +21,7 @@ class NodeStorage:
     def __init__(self, node):
         self.node = node
         self.set_current_declaration(*node.get_sockets())
+        self.input_value_storage = dict()
 
     def set_current_declaration(self, inputs, outputs):
         self.inputs_decl = inputs
@@ -49,6 +50,22 @@ class NodeStorage:
                 self.decl_per_socket[socket] = decl
                 self.decl_index_per_socket[socket] = i
 
+    def store_socket_states(self):
+        for socket in self.node.inputs:
+            if not isinstance(socket, DataSocket):
+                continue
+            storage_id = (socket.data_type, socket.identifier)
+            self.input_value_storage[storage_id] = socket.get_state()
+
+    def try_restore_socket_states(self):
+        for socket in self.node.inputs:
+            if not isinstance(socket, DataSocket):
+                continue
+            storage_id = (socket.data_type, socket.identifier)
+            if storage_id in self.input_value_storage:
+                socket.restore_state(self.input_value_storage[storage_id])
+
+
 _storage_per_node = {}
 
 class BaseNode:
@@ -65,6 +82,7 @@ class BaseNode:
         self._try_set_state(state)
 
     def rebuild(self):
+        self.storage.store_socket_states()
         self.inputs.clear()
         self.outputs.clear()
 
@@ -74,6 +92,7 @@ class BaseNode:
         for decl in outputs:
             decl.build(self, self.outputs)
         self.storage.set_current_declaration(inputs, outputs)
+        self.storage.try_restore_socket_states()
 
     def _get_state(self):
         links_per_input = defaultdict(set)
@@ -170,7 +189,7 @@ class BaseNode:
     #########################
 
     @property
-    def storage(self):
+    def storage(self) -> NodeStorage:
         if self not in _storage_per_node:
             _storage_per_node[self] = NodeStorage(self)
         return _storage_per_node[self]
@@ -215,3 +234,9 @@ class DataSocket(BaseSocket):
         else:
             layout.label(text=text)
 
+    def get_state(self):
+        return None
+
+    def restore_state(self, state):
+        pass
+
diff --git a/release/scripts/startup/function_nodes/sockets.py b/release/scripts/startup/function_nodes/sockets.py
index cac39a92887..83214eaaee6 100644
--- a/release/scripts/startup/function_nodes/sockets.py
+++ b/release/scripts/startup/function_nodes/sockets.py
@@ -24,6 +24,12 @@ class FloatSocket(bpy.types.NodeSocket, DataSocket):
     def draw_color(self, context, node):
         return (0, 0.3, 0.5, 1)
 
+    def get_state(self):
+        return self.value
+
+    def restore_state(self, state):
+        self.value = state
+
 class IntegerSocket(bpy.types.NodeSocket, DataSocket):
     bl_idname = "fn_IntegerSocket"
     bl_label = "Integer Socket"
@@ -39,6 +45,12 @@ class IntegerSocket(bpy.types.NodeSocket, DataSocket):
     def draw_color(self, context, node):
         return (0.3, 0.7, 0.5, 1)
 
+    def get_state(self):
+        return self.value
+
+    def restore_state(self, state):
+        self.value = state
+
 class VectorSocket(bpy.types.NodeSocket, DataSocket):
     bl_idname = "fn_VectorSocket"
     bl_label = "Vector Socket"
@@ -55,6 +67,12 @@ class VectorSocket(bpy.types.NodeSocket, DataSocket):
     def draw_color(self, context, node):
         return (0, 0, 0.5, 1)
 
+    def get_state(self):
+        return tuple(self.value)
+
+    def restore_state(self, state):
+        self.value = state
+
 class CustomColoredSocket(bpy.types.NodeSocket, DataSocket):
     bl_idname = "fn_CustomColoredSocket"
     bl_label = "Custom Colored Socket"



More information about the Bf-blender-cvs mailing list