diff options
author | Alexander Gavrilov <angavrilov@gmail.com> | 2019-09-29 12:10:01 +0300 |
---|---|---|
committer | Alexander Gavrilov <angavrilov@gmail.com> | 2019-09-29 17:48:59 +0300 |
commit | 704ace1b48181180b70a5b4ed0039420c4acb4db (patch) | |
tree | 134f9f39da2b1df29ab4f691ef8fb16df7ef9157 /rigify | |
parent | 6bb8ab3ad7b8131ffa9ed3261b6da8627903f3b1 (diff) |
Rigify: implement priorities to add toes to the FK bone group.
Toes behave as FK, but are needed both in IK and FK mode.
Diffstat (limited to 'rigify')
-rw-r--r-- | rigify/base_generate.py | 10 | ||||
-rw-r--r-- | rigify/generate.py | 9 | ||||
-rw-r--r-- | rigify/rigs/limbs/limb_rigs.py | 5 | ||||
-rw-r--r-- | rigify/utils/layers.py | 22 |
4 files changed, 39 insertions, 7 deletions
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( |