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:
parent
6bb8ab3ad7
commit
704ace1b48
|
@ -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')
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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(
|
||||
|
|
Loading…
Reference in New Issue