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

Toes behave as FK, but are needed both in IK and FK mode.
This commit is contained in:
Alexander Gavrilov 2019-09-29 12:10:01 +03:00
parent 6bb8ab3ad7
commit 704ace1b48
4 changed files with 39 additions and 7 deletions

View File

@ -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')

View File

@ -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

View File

@ -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)

View File

@ -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(