Browse Source

Add Inherit Color socket to Bone

Joseph Brandenburg 3 months ago
parent
commit
382ff9e995
7 changed files with 83 additions and 33 deletions
  1. 2 3
      __init__.py
  2. 1 1
      blender_manifest.toml
  3. 3 0
      socket_definitions.py
  4. 26 1
      versioning.py
  5. 45 27
      xForm_containers.py
  6. 3 1
      xForm_definitions.py
  7. 3 0
      xForm_socket_templates.py

+ 2 - 3
__init__.py

@@ -18,7 +18,7 @@ from .utilities import prRed
 
 MANTIS_VERSION_MAJOR=0
 MANTIS_VERSION_MINOR=12
-MANTIS_VERSION_SUB=0
+MANTIS_VERSION_SUB=1
 
 classLists = [module.TellClasses() for module in [
  link_definitions,
@@ -264,17 +264,16 @@ def execute_handler(scene):
 from .versioning import versioning_tasks
 def node_version_update(node):
     do_once = True
-    do_tasks = []
     for bl_idname, task, required_kwargs in versioning_tasks:
         arg_map = {}
         if 'node' in required_kwargs:
             arg_map['node']=node
         if node.bl_idname in bl_idname:
-            task(**arg_map)
             if do_once:
                 print (f"Updating tree {node.id_data.name} to "
                        f"{MANTIS_VERSION_MAJOR}.{MANTIS_VERSION_MINOR}.{MANTIS_VERSION_SUB}")
                 do_once=False
+            task(**arg_map)
 
 def do_version_update(node_tree):
     # set updating status for dynamic nodes to prevent bugs in socket remapping

+ 1 - 1
blender_manifest.toml

@@ -3,7 +3,7 @@ schema_version = "1.0.0"
 # Example of manifest file for a Blender extension
 # Change the values according to your extension
 id = "mantis"
-version = "0.12.0"
+version = "0.12.1"
 name = "Mantis"
 tagline = "Mantis is a rigging nodes toolkit"
 maintainer = "Nodespaghetti <josephbburg@protonmail.com>"

+ 3 - 0
socket_definitions.py

@@ -989,10 +989,13 @@ class ColorSetSocket(MantisSocket):
         default=get_select_color(None),)
     is_valid_interface_type=False
     def draw(self, context, layout, node, text):
+        inherit_color_socket = self.node.inputs.get("Inherit Color")
         if (self.is_output == False) and (self.is_linked == True):
             layout.label(text=self.name)
         elif self.node.bl_idname in text_only_output_types:
             layout.label(text=self.name)
+        elif inherit_color_socket and inherit_color_socket.default_value == True:
+            layout.label(text='Using Inherit Color.')
         else:
             layout.prop( text='Color Set', data=self,
                         property='active_color', )

+ 26 - 1
versioning.py

@@ -2,7 +2,7 @@
 # this will be the new versioning system, and will deprecate the old SOCKETS_ADDED and such
 
 from bpy.types import Node, NodeSocket
-from .utilities import prRed, prGreen
+from .utilities import prRed, prGreen, prPurple
 
 
 def version_upgrade_bone_0_12_0_from_older(*args, **kwargs):
@@ -19,6 +19,7 @@ def version_upgrade_bone_0_12_0_from_older(*args, **kwargs):
     try:
         collection_input_is_array = node.inputs['Bone Collection'].is_multi_input
         if not collection_input_is_array: # it must be made into an array!
+            prPurple(f"Updating \"Bone Collection\" Socket in {node.name}")
             from .utilities import get_socket_maps
             socket_maps = get_socket_maps(node)
             socket_map = socket_maps[0]
@@ -42,6 +43,7 @@ def version_upgrade_bone_0_12_0_from_older(*args, **kwargs):
             else:
                 s.default_value = socket_map_from_old_socket
         if node.inputs.get('Color') is None:
+            prPurple(f"Adding \"Color\" Socket to {node.name}")
             s = node.inputs.new('ColorSetSocket', 'Color',)
             node.inputs.move(len(node.inputs)-1, 22)
     except Exception as e:
@@ -49,7 +51,30 @@ def version_upgrade_bone_0_12_0_from_older(*args, **kwargs):
         print(e)
 
 
+def up_0_12_1_add_inherit_color(*args, **kwargs):
+    # add an inherit color input.
+    node = kwargs['node']
+    current_major_version = node.id_data.mantis_version[0]
+    current_minor_version = node.id_data.mantis_version[1]
+    current_sub_version = node.id_data.mantis_version[2]
+    if  current_major_version > 0: return# major version must be 0
+    if current_minor_version > 12: return# minor version must be 12 or less
+    if current_minor_version == 12 and current_sub_version < 1: return # sub version must be 0
+    # sub version doesn't matter since any subversion of 11 should trigger this task
+    prPurple(f"Adding \"Inherit Color\" socket to {node.name}")
+    try:
+        if node.inputs.get('Inherit Color') is None:
+            s = node.inputs.new('BooleanSocket', 'Inherit Color',)
+            node.inputs.move(len(node.inputs)-1, 23)
+            s.default_value=True
+    except Exception as e:
+        prRed(f"Error updating version in node: {node.id_data.name}::{node.name}; see error:")
+        print(e)
+
+
+
 versioning_tasks = [
     # node bl_idname    task                required keyword arguments 
     (['xFormBoneNode'], version_upgrade_bone_0_12_0_from_older, ['node'],),
+    (['xFormBoneNode'], up_0_12_1_add_inherit_color, ['node'],),
 ]

+ 45 - 27
xForm_containers.py

@@ -203,6 +203,7 @@ bone_inputs= [
          "Custom Object Translation",
          "Custom Object Rotation",
          "Color",
+         "Inherit Color",
          # Deform Stuff
          "Deform",
          "Envelope Distance",
@@ -362,36 +363,53 @@ class xFormBone(xFormNode):
         print( wrapGreen("Created Bone: ") + wrapOrange(eb.name) + wrapGreen(" in ") + wrapWhite(self.bGetParentArmature().name))
         self.executed = True
 
+    def set_bone_color(self, b, inherit_color, bContext):
+        color_values = self.evaluate_input('Color')
+        if color_values is None:
+            return
+        if inherit_color and b.parent:
+            b.color.palette=b.parent.color.palette
+            if b.color.palette == 'CUSTOM':
+                b.color.custom.active=b.parent.color.custom.active
+                b.color.custom.normal=b.parent.color.custom.normal
+                b.color.custom.select=b.parent.color.custom.select
+            return
+
+        from mathutils import Color
+        color_active = Color(color_values[:3])
+        color_normal = Color(color_values[3:6])
+        color_select = Color(color_values[6:])
+        is_theme_colors = False
+        theme = bContext.preferences.themes[0]
+        for i, color_set in enumerate(theme.bone_color_sets):
+            if  ((color_active == color_set.active) and
+                (color_normal == color_set.normal) and
+                (color_select == color_set.select) ):
+                            is_theme_colors=True; break
+        if is_theme_colors:          # add 1, not 0-indexed
+            b.color.palette = 'THEME'+str(i+1).zfill(2)
+        elif    ((color_active == theme.view_3d.bone_pose_active) and
+                (color_normal == theme.view_3d.bone_solid) and
+                (color_select == theme.view_3d.bone_pose) ):
+                        b.color.palette = 'DEFAULT'
+        else:
+            b.color.palette = 'CUSTOM'
+            b.color.custom.active=color_active
+            b.color.custom.normal=color_normal
+            b.color.custom.select=color_select
+
+
     def bFinalize(self, bContext = None):
         b = self.bGetParentArmature().data.bones[self.bObject]
         # let's do bone colors first
-        color_values = self.evaluate_input('Color')
-        try: # just in case, this shouldn't cause a failure
-            from mathutils import Color
-            color_active = Color(color_values[:3])
-            color_normal = Color(color_values[3:6])
-            color_select = Color(color_values[6:])
-            is_theme_colors = False
-            theme = bContext.preferences.themes[0]
-            for i, color_set in enumerate(theme.bone_color_sets):
-                if  ((color_active == color_set.active) and
-                    (color_normal == color_set.normal) and
-                    (color_select == color_set.select) ):
-                                is_theme_colors=True; break
-            if is_theme_colors:          # add 1, not 0-indexed
-                b.color.palette = 'THEME'+str(i+1).zfill(2)
-            elif    ((color_active == theme.view_3d.bone_pose_active) and
-                    (color_normal == theme.view_3d.bone_solid) and
-                    (color_select == theme.view_3d.bone_pose) ):
-                            b.color.palette = 'DEFAULT'
-            else:
-                b.color.palette = 'CUSTOM'
-                b.color.custom.active=color_active
-                b.color.custom.normal=color_normal
-                b.color.custom.select=color_select
-        except Exception as e:
-            prRed("WARNING: failed to set color because of error, see report below:")
-            prOrange(e)
+        inherit_color = self.evaluate_input("Inherit Color")
+        if len(self.inputs['Color'].links) > 0:
+            inherit_color = False # use the link instead
+        # try: # just in case, this shouldn't cause a failure
+        self.set_bone_color(b, inherit_color, bContext)
+        # except Exception as e:
+        #     prRed("WARNING: failed to set color because of error, see report below:")
+        #     prOrange(e)
         #
         do_bb=False
         b.bbone_x = self.evaluate_input("BBone X Size"); b.bbone_x = max(b.bbone_x, 0.0002)

+ 3 - 1
xForm_definitions.py

@@ -99,6 +99,7 @@ display_names = {
 "Custom Object Translation":'VectorSocket',
 "Custom Object Rotation":'VectorEulerSocket',
 "Color":'ColorSetSocket',
+"Inherit Color":'BoolSocket',
 }
 
 # deform_names
@@ -216,7 +217,8 @@ class xFormBoneNode(Node, xFormNode):
         self.inputs['Lock Scale'].default_value[0] = True
         self.inputs['Lock Scale'].default_value[1] = True
         self.inputs['Lock Scale'].default_value[2] = True
-
+        self.inputs['Inherit Color'].default_value[2] = True
+        
         # color
         self.use_custom_color = True
         self.color = xFormColor

+ 3 - 0
xForm_socket_templates.py

@@ -128,6 +128,9 @@ xFormBoneSockets = [
     CustomColor := SockTemplate(name="Color",
             is_input=True, bl_idname='ColorSetSocket',
             category='Display',),
+    InheritColor := SockTemplate(name="Inherit Color",
+            is_input=True, bl_idname='BooleanSocket',
+            category='Display', default_value=True),
     # Deform Stuff
     BoneDeformTemplate := replace(HideRenderTemplate, name='Deform',
         category='Deform', blender_property='use_deform', default_value=False,),