diff options
author | Alexander Gavrilov <angavrilov@gmail.com> | 2020-06-29 20:19:52 +0300 |
---|---|---|
committer | Alexander Gavrilov <angavrilov@gmail.com> | 2020-06-29 20:19:52 +0300 |
commit | da8877fa8b295afba5a986bc710b862777fcfba3 (patch) | |
tree | 2bad3f4fe9ff8870def4ef02ce773ad85fa8a5a8 /rigify/base_generate.py | |
parent | db23ff3d34415a3aae1c8bd775de2db8af22d5c7 (diff) |
Fix T78193 (Rigify): use bone history tracking to find derived DEF bones.
It is not really safe to assume that by swapping ORG to DEF you will
get a deform bone derived from the given ORG bone. The new base rig
API already tracks copying of bones, so polish it up and use here.
Note however that this tracking doesn't work with bones created
without self.copy_bone, e.g. by legacy rigs.
Diffstat (limited to 'rigify/base_generate.py')
-rw-r--r-- | rigify/base_generate.py | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/rigify/base_generate.py b/rigify/base_generate.py index 7141d77e..22a35eae 100644 --- a/rigify/base_generate.py +++ b/rigify/base_generate.py @@ -62,6 +62,8 @@ class GeneratorPlugin(base_rig.GenerateCallbackHost, metaclass=SingletonPluginMe def register_new_bone(self, new_name, old_name=None): self.generator.bone_owners[new_name] = None + if old_name: + self.generator.derived_bones[old_name].add(new_name) #============================================= @@ -201,6 +203,7 @@ class BaseGenerator: self.root_rigs = [] # Map from bone names to their rigs self.bone_owners = {} + self.derived_bones = collections.defaultdict(set) # Set of plugins self.plugin_list = [] @@ -228,6 +231,32 @@ class BaseGenerator: self.noparent_bones.add(bone_name) + def find_derived_bones(self, bone_name, *, by_owner=False, recursive=True): + """Find which bones were copied from the specified one.""" + if by_owner: + owner = self.bone_owners.get(bone_name, None) + if not owner: + return {} + + table = owner.rigify_derived_bones + else: + table = self.derived_bones + + if recursive: + result = set() + + def rec(name): + for child in table.get(name, {}): + result.add(child) + rec(child) + + rec(bone_name) + + return result + else: + return set(table.get(bone_name, {})) + + def set_layer_group_priority(self, bone_name, layers, priority): for i, val in enumerate(layers): if val: |