Browse Source

UI: socket templates for xForm (except Bone)

Joseph Brandenburg 6 months ago
parent
commit
4084daebeb
3 changed files with 91 additions and 103 deletions
  1. 17 69
      xForm_containers.py
  2. 4 34
      xForm_definitions.py
  3. 70 0
      xForm_socket_templates.py

+ 17 - 69
xForm_containers.py

@@ -1,5 +1,6 @@
 from .node_container_common import *
 from .base_definitions import MantisNode, NodeSocket
+from .xForm_socket_templates import *
 
 def TellClasses():
              
@@ -86,18 +87,7 @@ class xFormArmature(xFormNode):
     '''A node representing an armature object'''
     
     def __init__(self, signature, base_tree):
-        super().__init__(signature, base_tree)
-        inputs = [
-            "Name"           ,
-            "Rotation Order" ,
-            "Matrix"         ,
-            "Relationship"   ,
-        ]
-        outputs = [
-         "xForm Out",
-        ]
-        self.inputs.init_sockets(inputs)
-        self.outputs.init_sockets(outputs)
+        super().__init__(signature, base_tree, xFormArmatureSockets)
         self.init_parameters()
         self.set_traverse([("Relationship", "xForm Out")])
 
@@ -624,21 +614,7 @@ class xFormBone(xFormNode):
 class xFormGeometryObject(xFormNode):
     '''A node representing an armature object'''
     def __init__(self, signature, base_tree):
-        super().__init__(signature, base_tree)
-        inputs = [
-            "Name"             ,
-            "Geometry"         ,
-            "Matrix"           ,
-            "Relationship"     ,
-            "Deformer"         ,
-            "Hide in Viewport" ,
-            "Hide in Render"   ,
-        ]
-        outputs = [
-          "xForm Out",
-        ]
-        self.inputs.init_sockets(inputs)
-        self.outputs.init_sockets(outputs)
+        super().__init__(signature, base_tree, xFormGeometryObjectSockets)
         self.init_parameters()
         self.set_traverse([("Relationship", "xForm Out")])
         self.has_shape_keys = False
@@ -736,28 +712,25 @@ class xFormGeometryObject(xFormNode):
 class xFormObjectInstance(xFormNode):
     """Represents an instance of an existing geometry object."""
     def __init__(self, signature, base_tree):
-        super().__init__(signature, base_tree)
-        inputs = [
-            "Name"             ,
-            "Source Object"    ,
-            "As Instance"      ,
-            "Matrix"           ,
-            "Relationship"     ,
-            "Deformer"         ,
-            "Hide in Viewport" ,
-            "Hide in Render"   ,
-        ]
-        outputs = [
-          "xForm Out",
-        ]
-        self.inputs.init_sockets(inputs)
-        self.outputs.init_sockets(outputs)
+        super().__init__(signature, base_tree, xFormGeometryObjectInstanceSockets)
         self.init_parameters()
+        # TODO: I think this field is a leftover from a test or something. see if it can be removed.
         self.links = {} # leave this empty for now!
-        # now set up the traverse target...
         self.set_traverse([("Relationship", "xForm Out")])
         self.has_shape_keys = False # Shape Keys will make a dupe so this is OK
 
+    def ui_modify_socket(self, ui_socket, socket_name=None):
+        if ui_socket.name == 'As Instance':
+            change_handled = True
+            try:
+                self.bObject.modifiers[0]['Socket_1'] = ui_socket.default_value
+            except Exception as e:
+                print("Failed to update mantis socket because of %s" % e,
+                        "Updating tree instead.")
+            return change_handled
+        else:
+            return super().ui_modify_socket(ui_socket, socket_name)
+
     def bPrepare(self, bContext = None,):
         from bpy import data
         empty_mesh = data.meshes.get("MANTIS_EMPTY_MESH")
@@ -819,31 +792,6 @@ class xFormObjectInstance(xFormNode):
     def bGetObject(self, mode = 'POSE'):
         return self.bObject
 
-from .base_definitions import MantisSocketTemplate as SockTemplate
-from .misc_nodes_socket_templates import SplineIndexTemplate
-xFormCurvePinSockets = [
-    NameTemplate := SockTemplate(
-        name="Name", is_input=True,  bl_idname='StringSocket',
-        default_value='Curve Pin', blender_property='name' ),
-    ParentCurveTemplate := SockTemplate(
-        name="Parent Curve", is_input=True,  bl_idname='xFormSocket', ),
-    SplineIndexTemplate,
-    FactorTemplate := SockTemplate(
-        name="Curve Pin Factor", is_input=True,  bl_idname='FloatFactorSocket',
-        default_value=0.0, blender_property='offset_factor' ),
-    ForwardAxisTemplate := SockTemplate(
-        name="Forward Axis", is_input=True,  bl_idname='EnumFollowPathForwardAxis',
-        default_value="FORWARD_Y", blender_property='forward_axis' ),
-    UpAxisTemplate := SockTemplate(
-        name="Up Axis", is_input=True,  bl_idname='EnumUpAxis',
-        default_value="UP_Z", blender_property='up_axis' ),
-    CurvePinDisplaySize := SockTemplate(
-        name="Display Size", is_input=True,  bl_idname='FloatPositiveSocket',
-        default_value=0.05, blender_property='empty_display_size'),
-    xFormOutTemplate := SockTemplate(
-        name="xForm Out", is_input=False,  bl_idname='xFormSocket', ),
-]
-
 class xFormCurvePin(xFormNode):
     """An xForm pinned to a specific location on a curve."""
     def __init__(self, signature, base_tree):

+ 4 - 34
xForm_definitions.py

@@ -6,7 +6,7 @@ from .utilities import (prRed, prGreen, prPurple, prWhite,
                               wrapRed, wrapGreen, wrapPurple, wrapWhite,
                               wrapOrange,)
 from .base_definitions import get_signature_from_edited_tree
-
+from .xForm_socket_templates import *
 
 def TellClasses():
     return [
@@ -265,7 +265,6 @@ class xFormBoneNode(Node, xFormNode):
                 if name in ['BBone Segments']: continue
                 self.inputs[name].hide = not self.display_bb_settings
 
-
 class xFormArmatureNode(Node, xFormNode):
     '''A node representing an Armature object node'''
     bl_idname = 'xFormArmatureNode'
@@ -275,16 +274,9 @@ class xFormArmatureNode(Node, xFormNode):
     mantis_node_class_name=bl_idname[:-4]
 
     def init(self, context):
-        self.inputs.new('StringSocket', "Name")
-        self.inputs.new('RelationshipSocket', "Relationship")
-        self.inputs.new('RotationOrderSocket', "Rotation Order")
-        self.inputs.new('MatrixSocket', "Matrix")
-        self.outputs.new('xFormSocket', "xForm Out")
-
-        # color
+        self.init_sockets(xFormArmatureSockets)
         self.use_custom_color = True
         self.color = xFormColor
-
         self.initialized=True
 
     def draw_label(self): # this will prefer a user-set label, or return the evaluated name
@@ -297,7 +289,6 @@ class xFormArmatureNode(Node, xFormNode):
             if nc:
                 self.inputs['Name'].display_text = nc.evaluate_input("Name")
 
-
 class xFormGeometryObjectNode(Node, xFormNode):
     """Represents a curve or mesh object."""
     bl_idname = "xFormGeometryObject"
@@ -307,19 +298,9 @@ class xFormGeometryObjectNode(Node, xFormNode):
     mantis_node_class_name=bl_idname
     
     def init(self, context):
-        self.inputs.new('StringSocket', "Name")
-        self.inputs.new('GeometrySocket', "Geometry")
-        self.inputs.new('MatrixSocket', "Matrix")
-        self.inputs.new('RelationshipSocket', "Relationship")
-        self.inputs.new('DeformerSocket', "Deformer")
-        self.inputs.new ("HideSocket", "Hide in Viewport")
-        self.inputs.new ("BooleanSocket", "Hide in Render")
-        self.outputs.new('xFormSocket', "xForm Out")
-
-        # color
+        self.init_sockets(xFormGeometryObjectSockets)
         self.use_custom_color = True
         self.color = xFormColor
-
         self.initialized=True
 
     def draw_label(self): # this will prefer a user-set label, or return the evaluated name
@@ -341,20 +322,9 @@ class xFormObjectInstance(Node, xFormNode):
     mantis_node_class_name=bl_idname
     
     def init(self, context):
-        self.inputs.new('StringSocket', "Name")
-        self.inputs.new('xFormSocket', "Source Object")
-        self.inputs.new('BooleanSocket', "As Instance",)
-        self.inputs.new('MatrixSocket', "Matrix")
-        self.inputs.new('RelationshipSocket', "Relationship")
-        self.inputs.new('DeformerSocket', "Deformer")
-        self.inputs.new ("HideSocket", "Hide in Viewport")
-        self.inputs.new ("BooleanSocket", "Hide in Render")
-        self.outputs.new('xFormSocket', "xForm Out")
-
-        # color
+        self.init_sockets(xFormGeometryObjectInstanceSockets)
         self.use_custom_color = True
         self.color = xFormColor
-
         self.initialized=True
 
     def draw_label(self): # this will prefer a user-set label, or return the evaluated name

+ 70 - 0
xForm_socket_templates.py

@@ -0,0 +1,70 @@
+from .base_definitions import MantisSocketTemplate as SockTemplate
+from .misc_nodes_socket_templates import SplineIndexTemplate
+from dataclasses import replace
+
+xFormArmatureSockets=[
+    NameTemplate := SockTemplate(
+        name="Name", is_input=True,  bl_idname='StringSocket',
+            default_value='Armature', blender_property='name' ),
+    RotationOrderTemplate := SockTemplate(
+        name="Rotation Order", is_input=True,  bl_idname='RotationOrderSocket',
+            default_value='XYZ', blender_property='rotation_mode' ),
+    ObjectMatrixTemplate := SockTemplate(
+        name="Matrix", is_input=True,  bl_idname='MatrixSocket',
+            blender_property='matrix_world' ),
+    RelationshipInSocket := SockTemplate(
+        name="Relationship", is_input=True,  bl_idname='RelationshipSocket', ),
+    xFormOutTemplate := SockTemplate(
+        name="xForm Out", is_input=False,  bl_idname='xFormSocket', ),
+]
+
+xFormGeometryObjectSockets=[
+    replace(NameTemplate, default_value='Object'),
+    GeometryTemplate := SockTemplate(
+        name="Geometry", is_input=True,  bl_idname='GeometrySocket', ),
+    ObjectMatrixTemplate,
+    RelationshipInSocket,
+    DeformerInTemplate := SockTemplate(name="Deformer", is_input=True,
+                                       bl_idname='DeformerSocket', ),
+    HideTemplate := SockTemplate(name="Hide in Viewport",
+        is_input=True, bl_idname='HideSocket', default_value=False,
+        blender_property='hide_viewport' ),
+    HideRenderTemplate := SockTemplate(name="Hide in Render",
+        is_input=True, bl_idname='BooleanSocket', default_value=False,
+        blender_property='hide_render' ),
+    xFormOutTemplate,
+]
+
+xFormGeometryObjectInstanceSockets=[
+    replace(NameTemplate, default_value='Object Instance'),
+    SourcexFormTemplate := SockTemplate(
+        name="Source Object", is_input=True,  bl_idname='xFormSocket', ),
+    AsInstanceTemplate := SockTemplate( name="As Instance", is_input=True,
+                            bl_idname='BooleanSocket', default_value=True,),
+    ObjectMatrixTemplate,
+    RelationshipInSocket,
+    DeformerInTemplate,
+    HideTemplate,
+    HideRenderTemplate,
+    xFormOutTemplate,
+]
+
+xFormCurvePinSockets = [
+    replace(NameTemplate, default_value='Curve Pin'),
+    ParentCurveTemplate := SockTemplate(
+        name="Parent Curve", is_input=True,  bl_idname='xFormSocket', ),
+    SplineIndexTemplate,
+    FactorTemplate := SockTemplate(
+        name="Curve Pin Factor", is_input=True,  bl_idname='FloatFactorSocket',
+        default_value=0.0, blender_property='offset_factor' ),
+    ForwardAxisTemplate := SockTemplate(
+        name="Forward Axis", is_input=True,  bl_idname='EnumFollowPathForwardAxis',
+        default_value="FORWARD_Y", blender_property='forward_axis' ),
+    UpAxisTemplate := SockTemplate(
+        name="Up Axis", is_input=True,  bl_idname='EnumUpAxis',
+        default_value="UP_Z", blender_property='up_axis' ),
+    CurvePinDisplaySize := SockTemplate(
+        name="Display Size", is_input=True,  bl_idname='FloatPositiveSocket',
+        default_value=0.05, blender_property='empty_display_size'),
+    xFormOutTemplate,
+]