Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender-addons.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Gavrilov <angavrilov@gmail.com>2019-10-22 19:22:52 +0300
committerAlexander Gavrilov <angavrilov@gmail.com>2019-10-22 19:22:52 +0300
commit3114f0b93a0358bf0442dd9cc896a4cdccbd90f4 (patch)
tree71ac333efd4f4f3086f429dae806423c9299692e /rigify/utils/switch_parent.py
parent72d99082bb6cfc0b03afe73382f5562935d87a43 (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.
Diffstat (limited to 'rigify/utils/switch_parent.py')
-rw-r--r--rigify/utils/switch_parent.py23
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