[Bf-extensions-cvs] [1d656f36] master: Rigify: clear custom pivots in IK->FK snap and use in widget placement.

Alexander Gavrilov noreply at git.blender.org
Wed Oct 23 12:28:30 CEST 2019


Commit: 1d656f36618e5f2d5b1f7d0ff86e87ca6e705be4
Author: Alexander Gavrilov
Date:   Mon Oct 21 16:27:22 2019 +0300
Branches: master
https://developer.blender.org/rBA1d656f36618e5f2d5b1f7d0ff86e87ca6e705be4

Rigify: clear custom pivots in IK->FK snap and use in widget placement.

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

M	rigify/rigs/limbs/leg.py
M	rigify/rigs/limbs/limb_rigs.py
M	rigify/rigs/limbs/paw.py
M	rigify/rigs/spines/basic_spine.py
M	rigify/rigs/spines/basic_tail.py
M	rigify/rigs/spines/spine_rigs.py
M	rigify/utils/bones.py
M	rigify/utils/components.py

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

diff --git a/rigify/rigs/limbs/leg.py b/rigify/rigs/limbs/leg.py
index 309688e3..35e68f58 100644
--- a/rigify/rigs/limbs/leg.py
+++ b/rigify/rigs/limbs/leg.py
@@ -121,10 +121,10 @@ class Rig(BaseLimbRig):
     # IK controls
 
     def get_extra_ik_controls(self):
+        controls = super().get_extra_ik_controls() + [self.bones.ctrl.heel]
         if self.pivot_type == 'ANKLE_TOE':
-            return [self.bones.ctrl.heel, self.bones.ctrl.ik_spin]
-        else:
-            return [self.bones.ctrl.heel]
+            controls += [self.bones.ctrl.ik_spin]
+        return controls
 
     def make_ik_control_bone(self, orgs):
         name = self.copy_bone(orgs[2], make_derived_name(orgs[2], 'ctrl', '_ik'))
diff --git a/rigify/rigs/limbs/limb_rigs.py b/rigify/rigs/limbs/limb_rigs.py
index c195a9cb..493ba33a 100644
--- a/rigify/rigs/limbs/limb_rigs.py
+++ b/rigify/rigs/limbs/limb_rigs.py
@@ -23,7 +23,7 @@ import json
 
 from ...utils.animation import add_generic_snap_fk_to_ik, add_fk_ik_snap_buttons
 from ...utils.rig import connected_children_names
-from ...utils.bones import BoneDict, put_bone, compute_chain_x_axis, align_bone_orientation
+from ...utils.bones import BoneDict, put_bone, compute_chain_x_axis, align_bone_orientation, set_bone_widget_transform
 from ...utils.naming import strip_org, make_derived_name
 from ...utils.layers import ControlLayersOption
 from ...utils.misc import pairwise_nozip, padnone, map_list
@@ -324,13 +324,14 @@ class BaseLimbRig(BaseRig):
     # IK controls
 
     def get_extra_ik_controls(self):
-        return []
+        if self.component_ik_pivot:
+            return [self.component_ik_pivot.control]
+        else:
+            return []
 
     def get_all_ik_controls(self):
         ctrl = self.bones.ctrl
         controls = [ctrl.ik_base, ctrl.ik_pole, ctrl.ik]
-        if self.component_ik_pivot:
-            controls.append(self.component_ik_pivot.control)
         return controls + self.get_extra_ik_controls()
 
     @stage.generate_bones
@@ -411,9 +412,13 @@ class BaseLimbRig(BaseRig):
 
     @stage.generate_widgets
     def make_ik_control_widgets(self):
-        self.make_ik_base_widget(self.bones.ctrl.ik_base)
-        self.make_ik_pole_widget(self.bones.ctrl.ik_pole)
-        self.make_ik_ctrl_widget(self.bones.ctrl.ik)
+        ctrl = self.bones.ctrl
+
+        set_bone_widget_transform(self.obj, ctrl.ik, self.get_ik_control_output())
+
+        self.make_ik_base_widget(ctrl.ik_base)
+        self.make_ik_pole_widget(ctrl.ik_pole)
+        self.make_ik_ctrl_widget(ctrl.ik)
 
     def make_ik_base_widget(self, ctrl):
         if self.main_axis == 'x':
diff --git a/rigify/rigs/limbs/paw.py b/rigify/rigs/limbs/paw.py
index 8e9d2480..a13348d1 100644
--- a/rigify/rigs/limbs/paw.py
+++ b/rigify/rigs/limbs/paw.py
@@ -84,7 +84,7 @@ class Rig(BaseLimbRig):
     # IK controls
 
     def get_extra_ik_controls(self):
-        return [self.bones.ctrl.heel]
+        return super().get_extra_ik_controls() + [self.bones.ctrl.heel]
 
     def make_ik_control_bone(self, orgs):
         name = self.copy_bone(orgs[3], make_derived_name(orgs[2], 'ctrl', '_ik'))
diff --git a/rigify/rigs/spines/basic_spine.py b/rigify/rigs/spines/basic_spine.py
index 09d9b5d2..c2905463 100644
--- a/rigify/rigs/spines/basic_spine.py
+++ b/rigify/rigs/spines/basic_spine.py
@@ -27,7 +27,7 @@ from mathutils import Matrix
 from ...utils.errors import MetarigError
 from ...utils.layers import ControlLayersOption
 from ...utils.naming import strip_org, make_deformer_name, make_mechanism_name, make_derived_name
-from ...utils.bones import BoneDict, put_bone, align_bone_to_axis, align_bone_orientation
+from ...utils.bones import BoneDict, put_bone, align_bone_to_axis, align_bone_orientation, set_bone_widget_transform
 from ...utils.widgets import adjust_widget_transform_mesh
 from ...utils.widgets_basic import create_circle_widget
 from ...utils.misc import map_list
@@ -123,7 +123,7 @@ class Rig(BaseSpineRig):
         shape_bone = self.get_bone(wgt_mch)
         is_horizontal = abs(shape_bone.z_axis.normalized().y) < 0.7
 
-        self.get_bone(ctrl).custom_shape_transform = shape_bone
+        set_bone_widget_transform(self.obj, ctrl, wgt_mch)
 
         obj = create_circle_widget(
             self.obj, ctrl,
diff --git a/rigify/rigs/spines/basic_tail.py b/rigify/rigs/spines/basic_tail.py
index 845c3ca3..716116bf 100644
--- a/rigify/rigs/spines/basic_tail.py
+++ b/rigify/rigs/spines/basic_tail.py
@@ -23,7 +23,8 @@ import bpy
 from itertools import count
 
 from ...utils.naming import strip_org, make_derived_name
-from ...utils.bones import put_bone, flip_bone, is_same_position, connect_bbone_chain_handles, align_bone_orientation
+from ...utils.bones import put_bone, flip_bone, is_same_position, connect_bbone_chain_handles
+from ...utils.bones import align_bone_orientation, set_bone_widget_transform
 from ...utils.widgets_basic import create_circle_widget
 from ...utils.layers import ControlLayersOption
 from ...utils.misc import map_list
@@ -69,7 +70,7 @@ class Rig(BaseHeadTailRig):
     @stage.generate_widgets
     def make_master_control_widget(self):
         bone = self.bones.ctrl.master
-        self.get_bone(bone).custom_shape_transform = self.get_bone(self.bones.ctrl.tweak[-1])
+        set_bone_widget_transform(self.obj, bone, self.bones.ctrl.tweak[-1])
         create_ballsocket_widget(self.obj, bone, size=0.7)
 
     ####################################################
diff --git a/rigify/rigs/spines/spine_rigs.py b/rigify/rigs/spines/spine_rigs.py
index cf563994..9f62595a 100644
--- a/rigify/rigs/spines/spine_rigs.py
+++ b/rigify/rigs/spines/spine_rigs.py
@@ -24,7 +24,7 @@ from itertools import count
 
 from ...utils.layers import ControlLayersOption
 from ...utils.naming import make_derived_name
-from ...utils.bones import align_bone_orientation, align_bone_to_axis, put_bone
+from ...utils.bones import align_bone_orientation, align_bone_to_axis, put_bone, set_bone_widget_transform
 from ...utils.widgets_basic import create_cube_widget
 from ...utils.switch_parent import SwitchParentBuilder
 from ...utils.components import CustomPivotControl
@@ -123,10 +123,9 @@ class BaseSpineRig(TweakChainRig):
 
     @stage.generate_widgets
     def make_master_control_widget(self):
-        create_cube_widget(
-            self.obj, self.bones.ctrl.master,
-            radius=0.5,
-        )
+        master = self.bones.ctrl.master
+        set_bone_widget_transform(self.obj, master, self.get_master_control_output())
+        create_cube_widget(self.obj, master, radius=0.5)
 
     ####################################################
     # Tweak bones
diff --git a/rigify/utils/bones.py b/rigify/utils/bones.py
index 6a09cee1..854d4428 100644
--- a/rigify/utils/bones.py
+++ b/rigify/utils/bones.py
@@ -657,3 +657,17 @@ def align_bone_to_axis(obj, bone_name, axis, *, length=None, roll=0, flip=False)
         bone_e.tail = bone_e.head + vec
 
     bone_e.roll = roll
+
+
+def set_bone_widget_transform(obj, bone_name, transform_bone, use_size=True, scale=1.0):
+    assert obj.mode != 'EDIT'
+
+    bone = obj.pose.bones[bone_name]
+
+    if transform_bone and transform_bone != bone_name:
+        bone.custom_shape_transform = obj.pose.bones[transform_bone]
+    else:
+        bone.custom_shape_transform = None
+
+    bone.use_custom_shape_bone_size = use_size
+    bone.custom_shape_scale = scale
diff --git a/rigify/utils/components.py b/rigify/utils/components.py
index b99e183f..5c1ebcb6 100644
--- a/rigify/utils/components.py
+++ b/rigify/utils/components.py
@@ -17,7 +17,8 @@ class CustomPivotControl(RigComponent):
 
     def __init__(
         self, rig, id_name, org_bone, *,
-        name=None, parent=None, position=None, matrix=None, scale=1.0,
+        name=None, parent=None, position=None, matrix=None,
+        scale=1.0, scale_mch=None,
         move_to=None, align_to=None, snap_to=None,
         widget_axis=1.5, widget_cap=1.0, widget_square=True,
     ):
@@ -30,6 +31,7 @@ class CustomPivotControl(RigComponent):
 
         self.parent = parent
         self.scale = scale or 1
+        self.scale_mch = scale_mch or (self.scale * 0.7)
         self.move_to = move_to
         self.align_to = align_to
         self.snap_to = snap_to
@@ -51,7 +53,7 @@ class CustomPivotControl(RigComponent):
 
     def do_make_bones(self, org, name, position, matrix):
         self.bones.ctrl[self.id_name] = self.ctrl = self.copy_bone(org, name, parent=not self.parent, scale=self.scale)
-        self.bones.mch[self.id_name] = self.mch = self.copy_bone(org, make_derived_name(name, 'mch'), scale=self.scale * 0.7)
+        self.bones.mch[self.id_name] = self.mch = self.copy_bone(org, make_derived_name(name, 'mch'), scale=self.scale_mch)
 
         if position or matrix:
             put_bone(self.obj, self.ctrl, position, matrix=matrix)
@@ -61,7 +63,7 @@ class CustomPivotControl(RigComponent):
         if self.snap_to:
             bone = force_lazy(self.snap_to)
             copy_bone_position(self.obj, bone, self.ctrl, scale=self.scale)
-            copy_bone_position(self.obj, bone, self.mch, scale=self.scale * 0.7)
+            copy_bone_position(self.obj, bone, self.mch, scale=self.scale_mch)
 
         if self.move_to:
             pos = self.get_bone(force_lazy(self.move_to)).head



More information about the Bf-extensions-cvs mailing list