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