[Bf-extensions-cvs] [8c035351] master: Rigify: implement a deformed circle widget for main spine controls.

Alexander Gavrilov noreply at git.blender.org
Sun Sep 29 17:30:32 CEST 2019


Commit: 8c0353518e1dfef4046f1be1f8b2df6e9b3fd0af
Author: Alexander Gavrilov
Date:   Sun Sep 29 16:42:54 2019 +0300
Branches: master
https://developer.blender.org/rBA8c0353518e1dfef4046f1be1f8b2df6e9b3fd0af

Rigify: implement a deformed circle widget for main spine controls.

The idea is inspired by similar shapes in other rigs like BlenRig.
The actual used shape is simply a circle deformed into a parabolic
shape when viewed from the side, added to create_circle_widget.

Using the new shape for the main controls allows adding extra FK
controls to the spine without visual confusion.

As an aside, fix a minor issue in handling bone_transform_name,
and remove redundant bone_transform_name=None parameters.

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

M	rigify/rigs/limbs/arm.py
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/spine_rigs.py
M	rigify/rigs/spines/super_head.py
M	rigify/utils/widgets.py
M	rigify/utils/widgets_basic.py

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

diff --git a/rigify/rigs/limbs/arm.py b/rigify/rigs/limbs/arm.py
index 4e9cf299..98a3c50f 100644
--- a/rigify/rigs/limbs/arm.py
+++ b/rigify/rigs/limbs/arm.py
@@ -65,7 +65,7 @@ class Rig(BaseLimbRig):
         pbuilder.register_parent(self, self.bones.org.main[2], exclude_self=True)
 
     def make_ik_ctrl_widget(self, ctrl):
-        create_hand_widget(self.obj, ctrl, bone_transform_name=None)
+        create_hand_widget(self.obj, ctrl)
 
     ####################################################
     # Settings
diff --git a/rigify/rigs/limbs/leg.py b/rigify/rigs/limbs/leg.py
index 098d303a..dbdd20cb 100644
--- a/rigify/rigs/limbs/leg.py
+++ b/rigify/rigs/limbs/leg.py
@@ -127,7 +127,7 @@ class Rig(BaseLimbRig):
         pbuilder.register_parent(self, self.bones.org.main[2], exclude_self=True)
 
     def make_ik_ctrl_widget(self, ctrl):
-        create_foot_widget(self.obj, ctrl, bone_transform_name=None)
+        create_foot_widget(self.obj, ctrl)
 
 
     ####################################################
@@ -159,7 +159,7 @@ class Rig(BaseLimbRig):
 
     @stage.generate_widgets
     def generate_heel_control_widget(self):
-        create_ballsocket_widget(self.obj, self.bones.ctrl.heel, bone_transform_name=None)
+        create_ballsocket_widget(self.obj, self.bones.ctrl.heel)
 
 
     ####################################################
diff --git a/rigify/rigs/limbs/limb_rigs.py b/rigify/rigs/limbs/limb_rigs.py
index 4799e87d..30d475bb 100644
--- a/rigify/rigs/limbs/limb_rigs.py
+++ b/rigify/rigs/limbs/limb_rigs.py
@@ -407,10 +407,10 @@ class BaseLimbRig(BaseRig):
         else:
             roll = pi/2
 
-        create_ikarrow_widget(self.obj, ctrl, bone_transform_name=None, roll=roll)
+        create_ikarrow_widget(self.obj, ctrl, roll=roll)
 
     def make_ik_pole_widget(self, ctrl):
-        create_sphere_widget(self.obj, ctrl, bone_transform_name=None)
+        create_sphere_widget(self.obj, ctrl)
 
     def make_ik_ctrl_widget(self, ctrl):
         raise NotImplementedError()
diff --git a/rigify/rigs/limbs/paw.py b/rigify/rigs/limbs/paw.py
index fa590b66..f8cb1f9f 100644
--- a/rigify/rigs/limbs/paw.py
+++ b/rigify/rigs/limbs/paw.py
@@ -110,7 +110,7 @@ class Rig(BaseLimbRig):
         pbuilder.register_parent(self, self.bones.org.main[3], exclude_self=True)
 
     def make_ik_ctrl_widget(self, ctrl):
-        create_foot_widget(self.obj, ctrl, bone_transform_name=None)
+        create_foot_widget(self.obj, ctrl)
 
 
     ####################################################
@@ -136,7 +136,7 @@ class Rig(BaseLimbRig):
 
     @stage.generate_widgets
     def generate_heel_control_widget(self):
-        create_ballsocket_widget(self.obj, self.bones.ctrl.heel, bone_transform_name=None)
+        create_ballsocket_widget(self.obj, self.bones.ctrl.heel)
 
 
     ####################################################
diff --git a/rigify/rigs/spines/basic_spine.py b/rigify/rigs/spines/basic_spine.py
index d90e4c8d..269889cf 100644
--- a/rigify/rigs/spines/basic_spine.py
+++ b/rigify/rigs/spines/basic_spine.py
@@ -125,9 +125,9 @@ class Rig(BaseSpineRig):
         create_circle_widget(
             self.obj, ctrl,
             radius=1.0,
-            head_tail=0.75,
+            head_tail=0.0,
+            head_tail_x=1.0,
             with_line=False,
-            bone_transform_name=wgt_mch
         )
 
     ####################################################
diff --git a/rigify/rigs/spines/spine_rigs.py b/rigify/rigs/spines/spine_rigs.py
index 47a72287..34eefbf5 100644
--- a/rigify/rigs/spines/spine_rigs.py
+++ b/rigify/rigs/spines/spine_rigs.py
@@ -79,7 +79,6 @@ class BaseSpineRig(TweakChainRig):
         create_cube_widget(
             self.obj, self.bones.ctrl.master,
             radius=0.5,
-            bone_transform_name=None
         )
 
     ####################################################
diff --git a/rigify/rigs/spines/super_head.py b/rigify/rigs/spines/super_head.py
index de25113a..422f3ad0 100644
--- a/rigify/rigs/spines/super_head.py
+++ b/rigify/rigs/spines/super_head.py
@@ -144,7 +144,6 @@ class Rig(BaseHeadTailRig):
             self.obj, ctrl,
             radius=radius,
             head_tail=0.5,
-            bone_transform_name=None
         )
 
     def make_neck_bend_widget(self, ctrl):
@@ -154,7 +153,6 @@ class Rig(BaseHeadTailRig):
             self.obj, ctrl,
             radius=radius/2,
             head_tail=0.0,
-            bone_transform_name=None
         )
 
     def make_head_widget(self, ctrl):
@@ -169,7 +167,6 @@ class Rig(BaseHeadTailRig):
             radius              = 0.5,
             head_tail           = head_tail,
             with_line           = False,
-            bone_transform_name = None
         )
 
     ####################################################
diff --git a/rigify/utils/widgets.py b/rigify/utils/widgets.py
index 037d4118..f7e796b6 100644
--- a/rigify/utils/widgets.py
+++ b/rigify/utils/widgets.py
@@ -33,7 +33,7 @@ WGT_PREFIX = "WGT-"  # Prefix for widget objects
 #=============================================
 
 
-def obj_to_bone(obj, rig, bone_name):
+def obj_to_bone(obj, rig, bone_name, bone_transform_name=None):
     """ Places an object at the location/rotation/scale of the given bone.
     """
     if bpy.context.mode == 'EDIT_ARMATURE':
@@ -45,7 +45,9 @@ def obj_to_bone(obj, rig, bone_name):
     if bone.use_custom_shape_bone_size:
         scale *= bone.length
 
-    if bone.custom_shape_transform:
+    if bone_transform_name is not None:
+        bone = rig.pose.bones[bone_transform_name]
+    elif bone.custom_shape_transform:
         bone = bone.custom_shape_transform
 
     mat = rig.matrix_world @ bone.bone.matrix_local
@@ -63,9 +65,6 @@ def obj_to_bone(obj, rig, bone_name):
 def create_widget(rig, bone_name, bone_transform_name=None):
     """ Creates an empty widget object for a bone, and returns the object.
     """
-    if bone_transform_name is None:
-        bone_transform_name = bone_name
-
     obj_name = WGT_PREFIX + rig.name + '_' + bone_name
     scene = bpy.context.scene
     collection = ensure_widget_collection(bpy.context)
@@ -74,7 +73,7 @@ def create_widget(rig, bone_name, bone_transform_name=None):
     if obj_name in scene.objects:
         # Move object to bone position, in case it changed
         obj = scene.objects[obj_name]
-        obj_to_bone(obj, rig, bone_transform_name)
+        obj_to_bone(obj, rig, bone_name, bone_transform_name)
 
         return None
     else:
@@ -91,7 +90,7 @@ def create_widget(rig, bone_name, bone_transform_name=None):
         collection.objects.link(obj)
 
         # Move object to bone position and set layers
-        obj_to_bone(obj, rig, bone_transform_name)
+        obj_to_bone(obj, rig, bone_name, bone_transform_name)
         wgts_group_name = 'WGTS_' + rig.name
         if wgts_group_name in bpy.data.objects.keys():
             obj.parent = bpy.data.objects[wgts_group_name]
diff --git a/rigify/utils/widgets_basic.py b/rigify/utils/widgets_basic.py
index a40806ad..2848e5bf 100644
--- a/rigify/utils/widgets_basic.py
+++ b/rigify/utils/widgets_basic.py
@@ -33,15 +33,17 @@ def create_line_widget(rig, bone_name, bone_transform_name=None):
         mesh.update()
 
 
-def create_circle_widget(rig, bone_name, radius=1.0, head_tail=0.0, with_line=False, bone_transform_name=None):
+def create_circle_widget(rig, bone_name, radius=1.0, head_tail=0.0, head_tail_x=None, with_line=False, bone_transform_name=None):
     """ Creates a basic circle widget, a circle around the y-axis.
         radius: the radius of the circle
         head_tail: where along the length of the bone the circle is (0.0=head, 1.0=tail)
+        head_tail_x: if not None, specifies a different value along the X axis to create a deformed circle
     """
     obj = create_widget(rig, bone_name, bone_transform_name)
     if obj != None:
         v = [(0.7071068286895752, 2.980232238769531e-07, -0.7071065306663513), (0.8314696550369263, 2.980232238769531e-07, -0.5555699467658997), (0.9238795042037964, 2.682209014892578e-07, -0.3826831877231598), (0.9807852506637573, 2.5331974029541016e-07, -0.19509011507034302), (1.0, 2.365559055306221e-07, 1.6105803979371558e-07), (0.9807853698730469, 2.2351741790771484e-07, 0.19509044289588928), (0.9238796234130859, 2.086162567138672e-07, 0.38268351554870605), (0.8314696550369263, 1.788 [...]
-        verts = [(a[0] * radius, head_tail, a[2] * radius) for a in v]
+        delta = (head_tail_x - head_tail) if head_tail_x is not None else 0
+        verts = [(a[0] * radius, head_tail + delta * a[0] * a[0], a[2] * 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-extensions-cvs mailing list