[Bf-extensions-cvs] [968da083] master: Fix T75285 (Rigify): allow single bone spines.super_head rigs.

Alexander Gavrilov noreply at git.blender.org
Thu Apr 16 15:07:40 CEST 2020


Commit: 968da083b882d51dc1daa803c8e2a3e9a25ea8ad
Author: Alexander Gavrilov
Date:   Thu Apr 16 16:06:38 2020 +0300
Branches: master
https://developer.blender.org/rBA968da083b882d51dc1daa803c8e2a3e9a25ea8ad

Fix T75285 (Rigify): allow single bone spines.super_head rigs.

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

M	rigify/rigs/chain_rigs.py
M	rigify/rigs/spines/spine_rigs.py
M	rigify/rigs/spines/super_head.py

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

diff --git a/rigify/rigs/chain_rigs.py b/rigify/rigs/chain_rigs.py
index fc070eb1..525626f0 100644
--- a/rigify/rigs/chain_rigs.py
+++ b/rigify/rigs/chain_rigs.py
@@ -36,9 +36,11 @@ class SimpleChainRig(BaseRig):
     def find_org_bones(self, bone):
         return [bone.name] + connected_children_names(self.obj, bone.name)
 
+    min_chain_length = 2
+
     def initialize(self):
-        if len(self.bones.org) <= 1:
-            self.raise_error("Input to rig type must be a chain of 2 or more bones.")
+        if len(self.bones.org) < self.min_chain_length:
+            self.raise_error("Input to rig type must be a chain of {} or more bones.", self.min_chain_length)
 
     def parent_bones(self):
         self.rig_parent_bone = self.get_bone_parent(self.bones.org[0])
diff --git a/rigify/rigs/spines/spine_rigs.py b/rigify/rigs/spines/spine_rigs.py
index 070a6bd3..d23676d5 100644
--- a/rigify/rigs/spines/spine_rigs.py
+++ b/rigify/rigs/spines/spine_rigs.py
@@ -40,10 +40,10 @@ class BaseSpineRig(TweakChainRig):
     """
 
     bbone_segments = 8
+    min_chain_length = 3
 
     def initialize(self):
-        if len(self.bones.org) < 3:
-            self.raise_error("Input to rig type must be a chain of 3 or more bones.")
+        super().initialize()
 
         self.use_torso_pivot = self.params.make_custom_pivot
         self.length = sum([self.get_bone(b).length for b in self.bones.org])
diff --git a/rigify/rigs/spines/super_head.py b/rigify/rigs/spines/super_head.py
index 15f011f7..b1ba9ee0 100644
--- a/rigify/rigs/spines/super_head.py
+++ b/rigify/rigs/spines/super_head.py
@@ -40,11 +40,13 @@ class Rig(BaseHeadTailRig):
     """
 
     use_connect_reverse = False
+    min_chain_length = 1
 
     def initialize(self):
         super().initialize()
 
         self.long_neck = len(self.bones.org) > 3
+        self.has_neck = len(self.bones.org) > 1
 
     ####################################################
     # BONES
@@ -78,8 +80,11 @@ class Rig(BaseHeadTailRig):
         orgs = self.bones.org
         ctrl = self.bones.ctrl
 
-        ctrl.neck = self.make_neck_control_bone(orgs[0], 'neck', orgs[-1])
+        if self.has_neck:
+            ctrl.neck = self.make_neck_control_bone(orgs[0], 'neck', orgs[-1])
+
         ctrl.head = self.make_head_control_bone(orgs[-1], 'head')
+
         if self.long_neck:
             ctrl.neck_bend = self.make_neck_bend_control_bone(orgs[0], 'neck_bend', ctrl.neck)
 
@@ -118,14 +123,16 @@ class Rig(BaseHeadTailRig):
     def parent_control_chain(self):
         ctrl = self.bones.ctrl
         mch = self.bones.mch
-        self.set_bone_parent(ctrl.neck, mch.rot_neck)
+        if self.has_neck:
+            self.set_bone_parent(ctrl.neck, mch.rot_neck)
         self.set_bone_parent(ctrl.head, mch.rot_head)
         if self.long_neck:
             self.set_bone_parent(ctrl.neck_bend, mch.stretch)
 
     @stage.configure_bones
     def configure_control_chain(self):
-        self.configure_control_bone(0, self.bones.ctrl.neck, self.bones.org[0])
+        if self.has_neck:
+            self.configure_control_bone(0, self.bones.ctrl.neck, self.bones.org[0])
         self.configure_control_bone(2, self.bones.ctrl.head, self.bones.org[-1])
         if self.long_neck:
             self.configure_control_bone(1, self.bones.ctrl.neck_bend, self.bones.org[0])
@@ -133,7 +140,8 @@ class Rig(BaseHeadTailRig):
     @stage.generate_widgets
     def make_control_widgets(self):
         ctrl = self.bones.ctrl
-        self.make_neck_widget(ctrl.neck)
+        if self.has_neck:
+            self.make_neck_widget(ctrl.neck)
         self.make_head_widget(ctrl.head)
         if self.long_neck:
             self.make_neck_bend_widget(ctrl.neck_bend)
@@ -178,9 +186,10 @@ class Rig(BaseHeadTailRig):
         orgs = self.bones.org
         mch = self.bones.mch
 
-        mch.rot_neck = self.make_mch_follow_bone(orgs[0], 'neck', 0.5, copy_scale=True)
+        if self.has_neck:
+            mch.rot_neck = self.make_mch_follow_bone(orgs[0], 'neck', 0.5, copy_scale=True)
+            mch.stretch = self.make_mch_stretch_bone(orgs[0], 'STR-neck', orgs[-1])
         mch.rot_head = self.make_mch_follow_bone(orgs[-1], 'head', 0.0, copy_scale=True)
-        mch.stretch = self.make_mch_stretch_bone(orgs[0], 'STR-neck', orgs[-1])
 
     def make_mch_stretch_bone(self, org, name, org_head):
         name = self.copy_bone(org, make_derived_name(name, 'mch'), parent=False)
@@ -189,13 +198,17 @@ class Rig(BaseHeadTailRig):
 
     @stage.parent_bones
     def parent_mch_control_bones(self):
-        self.set_bone_parent(self.bones.mch.rot_neck, self.rig_parent_bone)
-        self.set_bone_parent(self.bones.mch.rot_head, self.bones.ctrl.neck)
-        self.set_bone_parent(self.bones.mch.stretch, self.bones.ctrl.neck)
+        if self.has_neck:
+            self.set_bone_parent(self.bones.mch.rot_neck, self.rig_parent_bone)
+            self.set_bone_parent(self.bones.mch.rot_head, self.bones.ctrl.neck)
+            self.set_bone_parent(self.bones.mch.stretch, self.bones.ctrl.neck)
+        else:
+            self.set_bone_parent(self.bones.mch.rot_head, self.rig_parent_bone)
 
     @stage.rig_bones
     def rig_mch_control_bones(self):
-        self.rig_mch_stretch_bone(self.bones.mch.stretch, self.bones.ctrl.head)
+        if self.has_neck:
+            self.rig_mch_stretch_bone(self.bones.mch.stretch, self.bones.ctrl.head)
 
     def rig_mch_stretch_bone(self, mch, head):
         self.make_constraint(mch, 'DAMPED_TRACK', head)
@@ -299,14 +312,19 @@ class Rig(BaseHeadTailRig):
     def make_tweak_chain(self):
         orgs = self.bones.org
         self.bones.ctrl.tweak = map_list(self.make_tweak_bone, count(0), orgs[0:-1])
+        if not self.has_neck:
+            self.check_connect_tweak(orgs[0])
 
     @stage.parent_bones
     def parent_tweak_chain(self):
         ctrl = self.bones.ctrl
         mch = self.bones.mch
 
-        for args in zip(ctrl.tweak, [ctrl.neck, *mch.chain]):
-            self.set_bone_parent(*args)
+        if self.has_neck:
+            for args in zip(ctrl.tweak, [ctrl.neck, *mch.chain]):
+                self.set_bone_parent(*args)
+        elif self.connected_tweak:
+            self.set_bone_parent(self.connected_tweak, ctrl.head)
 
     @stage.rig_bones
     def generate_neck_tweak_widget(self):
@@ -333,7 +351,11 @@ class Rig(BaseHeadTailRig):
 
     @stage.rig_bones
     def rig_org_chain(self):
-        tweaks = self.bones.ctrl.tweak + [self.bones.ctrl.head]
+        if self.has_neck:
+            tweaks = self.bones.ctrl.tweak + [self.bones.ctrl.head]
+        else:
+            tweaks = [self.connected_tweak or self.bones.ctrl.head]
+
         for args in zip(count(0), self.bones.org, tweaks, tweaks[1:] + [None]):
             self.rig_org_bone(*args)



More information about the Bf-extensions-cvs mailing list