[Bf-extensions-cvs] [704ace1b] master: Rigify: implement priorities to add toes to the FK bone group.

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


Commit: 704ace1b48181180b70a5b4ed0039420c4acb4db
Author: Alexander Gavrilov
Date:   Sun Sep 29 12:10:01 2019 +0300
Branches: master
https://developer.blender.org/rBA704ace1b48181180b70a5b4ed0039420c4acb4db

Rigify: implement priorities to add toes to the FK bone group.

Toes behave as FK, but are needed both in IK and FK mode.

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

M	rigify/base_generate.py
M	rigify/generate.py
M	rigify/rigs/limbs/limb_rigs.py
M	rigify/utils/layers.py

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

diff --git a/rigify/base_generate.py b/rigify/base_generate.py
index 790a0e1e..8cf04ade 100644
--- a/rigify/base_generate.py
+++ b/rigify/base_generate.py
@@ -21,6 +21,7 @@
 import bpy
 import sys
 import traceback
+import collections
 
 from .utils.errors import MetarigError, RaiseErrorMixin
 from .utils.naming import random_id
@@ -210,6 +211,9 @@ class BaseGenerator:
         # Set of bones that should be left without parent
         self.noparent_bones = set()
 
+        # Table of layer priorities for defining bone groups
+        self.layer_group_priorities = collections.defaultdict(dict)
+
         # Random string with time appended so that
         # different rigs don't collide id's
         self.rig_id = random_id(16)
@@ -220,6 +224,12 @@ class BaseGenerator:
         self.noparent_bones.add(bone_name)
 
 
+    def set_layer_group_priority(self, bone_name, layers, priority):
+        for i, val in enumerate(layers):
+            if val:
+                self.layer_group_priorities[bone_name][i] = priority
+
+
     def __run_object_stage(self, method_name):
         assert(self.context.active_object == self.obj)
         assert(self.obj.mode == 'OBJECT')
diff --git a/rigify/generate.py b/rigify/generate.py
index bebe4fc3..88b216ed 100644
--- a/rigify/generate.py
+++ b/rigify/generate.py
@@ -463,7 +463,7 @@ class Generator(base_generate.BaseGenerator):
         create_selection_sets(obj, metarig)
 
         # Create Bone Groups
-        create_bone_groups(obj, metarig)
+        create_bone_groups(obj, metarig, self.layer_group_priorities)
 
         t.tick("The rest: ")
 
@@ -544,12 +544,13 @@ def create_selection_sets(obj, metarig):
                     bone_id.name = bone.name
 
 
-def create_bone_groups(obj, metarig):
+def create_bone_groups(obj, metarig, priorities={}):
 
     bpy.ops.object.mode_set(mode='OBJECT')
     pb = obj.pose.bones
     layers = metarig.data.rigify_layers
     groups = metarig.data.rigify_colors
+    dummy = {}
 
     # Create BGs
     for l in layers:
@@ -566,7 +567,9 @@ def create_bone_groups(obj, metarig):
 
     for b in pb:
         try:
-            layer_index = b.bone.layers[:].index(True)
+            prios = priorities.get(b.name, dummy)
+            enabled = [ i for i, v in enumerate(b.bone.layers) if v ]
+            layer_index = max(enabled, key=lambda i: prios.get(i, 0))
         except ValueError:
             continue
         if layer_index > len(layers) - 1:   # bone is on reserved layers
diff --git a/rigify/rigs/limbs/limb_rigs.py b/rigify/rigs/limbs/limb_rigs.py
index 0b6c0425..4799e87d 100644
--- a/rigify/rigs/limbs/limb_rigs.py
+++ b/rigify/rigs/limbs/limb_rigs.py
@@ -268,7 +268,8 @@ class BaseLimbRig(BaseRig):
         for args in zip(count(0), self.bones.ctrl.fk, self.bones.org.main):
             self.configure_fk_control_bone(*args)
 
-        ControlLayersOption.FK.assign(self.params, self.obj, self.bones.ctrl.fk[0:3])
+        ControlLayersOption.FK.assign_rig(self, self.bones.ctrl.fk[0:3])
+        ControlLayersOption.FK.assign_rig(self, self.bones.ctrl.fk[3:], combine=True, priority=1)
 
     def configure_fk_control_bone(self, i, ctrl, org):
         self.copy_bone_properties(org, ctrl)
@@ -624,7 +625,7 @@ class BaseLimbRig(BaseRig):
         for args in zip(count(0), self.bones.ctrl.tweak, self.segment_table_tweak):
             self.configure_tweak_bone(*args)
 
-        ControlLayersOption.TWEAK.assign(self.params, self.obj, self.bones.ctrl.tweak)
+        ControlLayersOption.TWEAK.assign_rig(self, self.bones.ctrl.tweak)
 
     def configure_tweak_bone(self, i, tweak, entry):
         tweak_pb = self.get_bone(tweak)
diff --git a/rigify/utils/layers.py b/rigify/utils/layers.py
index b624e9ac..7a1bcef8 100644
--- a/rigify/utils/layers.py
+++ b/rigify/utils/layers.py
@@ -52,6 +52,13 @@ def get_layers(layers):
             return [x in layers for x in range(0, 32)]
 
 
+def set_bone_layers(bone, layers, combine=False):
+    if combine:
+        bone.layers = [ a or b for a, b in zip(bone.layers, layers) ]
+    else:
+        bone.layers = layers
+
+
 #=============================================
 # UI utilities
 #=============================================
@@ -72,7 +79,7 @@ class ControlLayersOption:
         else:
             return None
 
-    def assign(self, params, bone_set, bone_list):
+    def assign(self, params, bone_set, bone_list, combine=False):
         layers = self.get(params)
 
         if isinstance(bone_set, bpy.types.Object):
@@ -84,7 +91,18 @@ class ControlLayersOption:
                 if isinstance(bone, bpy.types.PoseBone):
                     bone = bone.bone
 
-                bone.layers = layers
+                set_bone_layers(bone, layers, combine)
+
+    def assign_rig(self, rig, bone_list, combine=False, priority=None):
+        layers = self.get(rig.params)
+        bone_set = rig.obj.data.bones
+
+        if layers:
+            for name in bone_list:
+                set_bone_layers(bone_set[name], layers, combine)
+
+                if priority is not None:
+                    rig.generator.set_layer_group_priority(name, layers, priority)
 
     def add_parameters(self, params):
         prop_toggle = bpy.props.BoolProperty(



More information about the Bf-extensions-cvs mailing list