diff options
author | Alexander Gavrilov <angavrilov@gmail.com> | 2019-10-22 19:22:52 +0300 |
---|---|---|
committer | Alexander Gavrilov <angavrilov@gmail.com> | 2019-10-22 19:22:52 +0300 |
commit | 3114f0b93a0358bf0442dd9cc896a4cdccbd90f4 (patch) | |
tree | 71ac333efd4f4f3086f429dae806423c9299692e | |
parent | 72d99082bb6cfc0b03afe73382f5562935d87a43 (diff) |
Rigify: fix nonsensical default parent for pole controls.
Instead of collecting all possible parents in a list, use
buckets indexed by the owning rig, so that parents injected
by other rigs are ordered correctly. Otherwise the Head
parent injected into the spine hierarchy gets in the way.
-rw-r--r-- | rigify/utils/switch_parent.py | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/rigify/utils/switch_parent.py b/rigify/utils/switch_parent.py index 463398fc..c26f5e74 100644 --- a/rigify/utils/switch_parent.py +++ b/rigify/utils/switch_parent.py @@ -13,7 +13,8 @@ from .misc import map_list, map_apply from ..base_rig import * from ..base_generate import GeneratorPlugin -from itertools import count, repeat +from collections import defaultdict +from itertools import count, repeat, chain def _auto_call(value): if callable(value): @@ -45,7 +46,7 @@ class SwitchParentBuilder(GeneratorPlugin, MechanismUtilityMixin): self.child_list = [] self.global_parents = [] - self.local_parents = [] + self.local_parents = defaultdict(list) self.child_map = {} self.frozen = False @@ -82,7 +83,7 @@ class SwitchParentBuilder(GeneratorPlugin, MechanismUtilityMixin): if is_global: self.global_parents.append(entry) else: - self.local_parents.append(entry) + self.local_parents[id(rig)].append(entry) def build_child(self, rig, bone, *, use_parent_mch=True, **options): @@ -176,16 +177,28 @@ class SwitchParentBuilder(GeneratorPlugin, MechanismUtilityMixin): child[name] = value + def get_rig_parent_candidates(self, rig): + candidates = [] + + # Build a list in parent hierarchy order + while rig: + candidates.append(self.local_parents[id(rig)]) + rig = rig.rigify_parent + + candidates.append(self.global_parents) + + return list(chain.from_iterable(reversed(candidates))) + def generate_bones(self): self.frozen = True - self.parent_list = self.global_parents + self.local_parents + self.parent_list = self.global_parents + list(chain.from_iterable(self.local_parents.values())) # Link children to parents for child in self.child_list: child_rig = child['context_rig'] or child['rig'] parents = [] - for parent in self.parent_list: + for parent in self.get_rig_parent_candidates(child_rig): if parent['rig'] is child_rig: if parent['exclude_self'] or child['exclude_self']: continue |