Просмотр исходного кода

cache property socket map at startup

Joseph Brandenburg 2 недель назад
Родитель
Сommit
836b087941
6 измененных файлов с 30 добавлено и 12 удалено
  1. 7 0
      __init__.py
  2. 6 2
      base_definitions.py
  3. 6 6
      deformer_nodes.py
  4. 9 2
      link_nodes.py
  5. 1 1
      primitives_nodes.py
  6. 1 1
      xForm_nodes.py

+ 7 - 0
__init__.py

@@ -473,6 +473,13 @@ def register():
     # I'm adding mine in first to ensure other addons don't mess up mine
     # but I am a good citizen! so my addon won't mess up yours! probably...
 
+    # Now it is time to pre-cache stuff for Mantis
+    from .base_definitions import MantisNode
+    mantis_classes = [cls for cls in classes if isinstance(cls, MantisNode)]
+    for cls in mantis_classes:
+        # Set up the property socket map cache
+        cls.gen_property_socket_map()
+
 
 def unregister():
     bpy.types.NODE_MT_context_menu.remove(node_context_menu_draw)

+ 6 - 2
base_definitions.py

@@ -928,6 +928,7 @@ class MantisNode:
         )
     node_type = 'UNINITIALIZED'
     socket_templates = None
+    property_socket_map = {}
     def __init__(self, signature : tuple,
                  base_tree : bpy.types.NodeTree,
                  socket_templates : list[MantisSocketTemplate]=[],
@@ -1008,12 +1009,14 @@ class MantisNode:
         for key, value in additional_parameters.items():
             self.parameters[key]=value
 
-    def gen_property_socket_map(self, prop_owner_group=None) -> dict:
+    # We really only need to do this once at class registration
+    @classmethod
+    def gen_property_socket_map(cls, prop_owner_group=None) -> dict:
         from .mantis_dataclasses import MantisSocketFiller
         from dataclasses import replace
         from bpy.app import version as bpy_version
         props_sockets = {}
-        for s_template in self.socket_templates:
+        for s_template in cls.socket_templates:
             if s_template.min_bpy_version:
                 if bpy_version < s_template.min_bpy_version:
                     prPurple(f"Skipping socket {s_template.name} because "
@@ -1038,6 +1041,7 @@ class MantisNode:
                     filler.default_value = s_template.default_value[index]
                     filler.combo_property=True
                     props_sockets[sub_prop]= filler
+        cls.property_socket_map = props_sockets
         return props_sockets
 
     def set_traverse(self, traversal_pairs = [(str, str)]) -> None:

+ 6 - 6
deformer_nodes.py

@@ -263,7 +263,7 @@ class DeformerArmature(MantisDeformerNode):
                 raise RuntimeError(f"Modifier was not created in node {self} -- the object is invalid.")
             self.bObject.append(d)
             d.object = self.bGetParentArmature()
-            props_sockets = self.gen_property_socket_map()
+            props_sockets = self.property_socket_map
             evaluate_sockets(self, d, props_sockets)
             #
             if (skin_method := self.evaluate_input("Skinning Method")) == "AUTOMATIC_HEAT":
@@ -344,7 +344,7 @@ class DeformerHook(MantisDeformerNode):
         auto_bezier = self.evaluate_input("Auto-Bezier")
         target_node = self.evaluate_input('Hook Target')
         target = target_node.bGetObject(); subtarget = ""
-        props_sockets = self.gen_property_socket_map()
+        props_sockets = self.property_socket_map
         if isinstance(target, Bone) or isinstance(target, PoseBone):
             subtarget = target.name; target = target.id_data
         for xf in self.GetxForm():
@@ -694,7 +694,7 @@ class DeformerSurfaceDeform(MantisDeformerNode):
                 raise RuntimeError(f"Modifier was not created in node {self} -- the object is invalid.")
             self.bObject.append(d)
             self.get_target_and_subtarget(d, input_name="Target")
-            props_sockets = self.gen_property_socket_map()
+            props_sockets = self.property_socket_map
             evaluate_sockets(self, d, props_sockets)
 
     def bModifierApply(self, bContext=None):
@@ -725,7 +725,7 @@ class DeformerMeshDeform(MantisDeformerNode):
                 raise RuntimeError(f"Modifier was not created in node {self} -- the object is invalid.")
             self.bObject.append(d)
             self.get_target_and_subtarget(d, input_name="Object")
-            props_sockets = self.gen_property_socket_map()
+            props_sockets = self.property_socket_map
             evaluate_sockets(self, d, props_sockets)
 
     def bModifierApply(self, bContext=None):
@@ -756,7 +756,7 @@ class DeformerLatticeDeform(MantisDeformerNode):
                 raise RuntimeError(f"Modifier was not created in node {self} -- the object is invalid.")
             self.bObject.append(d)
             self.get_target_and_subtarget(d, input_name="Object")
-            props_sockets = self.gen_property_socket_map()
+            props_sockets = self.property_socket_map
             evaluate_sockets(self, d, props_sockets)
 
 class DeformerSmoothCorrectiveDeform(MantisDeformerNode):
@@ -783,5 +783,5 @@ class DeformerSmoothCorrectiveDeform(MantisDeformerNode):
                 raise RuntimeError(f"Modifier was not created in node {self} -- the object is invalid.")
             self.bObject.append(d)
             # self.get_target_and_subtarget(d, input_name="Object")
-            props_sockets = self.gen_property_socket_map()
+            props_sockets = self.property_socket_map
             evaluate_sockets(self, d, props_sockets)

+ 9 - 2
link_nodes.py

@@ -69,7 +69,10 @@ class MantisLinkNode(MantisNode):
             return super().evaluate_input(input_name, index)
 
     def gen_property_socket_map(self) -> dict:
-        props_sockets = super().gen_property_socket_map()
+        if self.property_socket_map:
+            props_sockets = self.property_socket_map.copy()
+        else:
+            props_sockets = super().gen_property_socket_map()
         if (os := self.inputs.get("Owner Space")) and os.is_connected:
             node_line, _last_socket = trace_single_line(self, "Owner Space")
             for other_node in node_line:
@@ -281,10 +284,14 @@ class LinkTransformation(MantisLinkNode):
                 c.name = constraint_name
             self.bObject.append(c)
             self.set_custom_space()
-            props_sockets = self.gen_property_socket_map()
+            # TODO: this can be cached I just need a custom
+            #  gen_property_socket_map for this class.
+            from copy import deepcopy
+            props_sockets = self.gen_property_socket_map().copy()
             # we have to fix the blender-property for scale/rotation
             # because Blender stores these separately.
             # I do not care that this code is ugly.
+            # TODO this should be handled by the socket templates
             from_suffix, to_replace = '', ''
             if self.evaluate_input("Map From") == 'ROTATION':
                 from_suffix='_rot'

+ 1 - 1
primitives_nodes.py

@@ -91,6 +91,6 @@ class GeometryLattice(PrimitiveNode):
         import bpy
         if not data:
             data = bpy.data.lattices.new( self.evaluate_input("Name") )
-        props_sockets = self.gen_property_socket_map()
+        props_sockets = self.property_socket_map
         evaluate_sockets(self, data, props_sockets)
         self.prepared = True; self.executed = True

+ 1 - 1
xForm_nodes.py

@@ -612,7 +612,7 @@ class xFormGeometryObject(xFormNode):
         self.has_shape_keys = False
         # putting this in bTransformPass simply prevents it from being run more than once.
         # maybe I should do that with the rest of bPrepare, too.
-        props_sockets = self.gen_property_socket_map()
+        props_sockets = self.property_socket_map
         evaluate_sockets(self, self.bObject, props_sockets)
         self.executed = True