diff --git a/release/scripts/modules/rigify/__init__.py b/release/scripts/modules/rigify/__init__.py index 6561e346d0d..611bfd7035d 100644 --- a/release/scripts/modules/rigify/__init__.py +++ b/release/scripts/modules/rigify/__init__.py @@ -24,8 +24,7 @@ from Mathutils import Vector # TODO, have these in a more general module from rna_prop_ui import rna_idprop_ui_prop_get -EMPTY_LAYER = [False] * 32 -DELIMITER = '-._' + def submodule_func_from_type(bone_type): type_pair = bone_type.split(".") @@ -39,7 +38,7 @@ def submodule_func_from_type(bone_type): # from rigify import leg submod = __import__(name="%s.%s" % (__package__, submod_name), fromlist=[submod_name]) - + reload(submod) return submod, getattr(submod, func_name) @@ -63,6 +62,8 @@ def validate_rig(context, obj): def generate_rig(context, obj_orig, prefix="ORG-", META_DEF=True): from collections import OrderedDict + import rigify_utils + reload(rigify_utils) global_undo = context.user_preferences.edit.global_undo context.user_preferences.edit.global_undo = False @@ -110,6 +111,12 @@ def generate_rig(context, obj_orig, prefix="ORG-", META_DEF=True): # value: [functions, ...] # each function is from the module. eg leg.ik, arm.main bone_typeinfos = {} + + # key: bone name + # value: [new_bone_name, ...] + # where each bone with a 'type' stores a list of bones that it created + # ...needed so we can override the root parent + bone_genesis = {} # inspect all bones and assign their definitions before modifying for pbone in obj.pose.bones: @@ -162,6 +169,8 @@ def generate_rig(context, obj_orig, prefix="ORG-", META_DEF=True): # Only blend results from the same submodule, eg. # leg.ik and arm.fk could not be blended. results = OrderedDict() + + bone_names_pre = set([bone.name for bone in arm.bones]) for submod_name, type_func in bone_typeinfos[bone_name]: # this bones definition of the current typeinfo @@ -186,15 +195,41 @@ def generate_rig(context, obj_orig, prefix="ORG-", META_DEF=True): if len(result_submod) == 2: blend_bone_list(obj, definition, result_submod[0], result_submod[1], target_bone=bone_name) + + bone_names_post = set([bone.name for bone in arm.bones]) + + # Store which bones were created from this one + bone_genesis[bone_name] = list(bone_names_post - bone_names_pre) + + # need a reverse lookup on bone_genesis so as to know immediately + # where a bone comes from + bone_genesis_reverse = {} + for bone_name, bone_children in bone_genesis.items(): + for bone_child_name in bone_children: + bone_genesis_reverse[bone_child_name] = bone_name + + if root_bone: # assign all new parentless bones to this bpy.ops.object.mode_set(mode='EDIT') root_ebone = arm.edit_bones[root_bone] for ebone in arm.edit_bones: - if ebone.parent is None and ebone.name not in base_names: + bone_name = ebone.name + if ebone.parent is None and bone_name not in base_names: + # check for override + bone_creator = bone_genesis_reverse[bone_name] + pbone_creator = obj.pose.bones[bone_creator] + root_bone_override = pbone_creator.get("root", "") + + if root_bone_override: + root_ebone_tmp = arm.edit_bones[root_bone_override] + else: + root_ebone_tmp = root_ebone + ebone.connected = False ebone.parent = root_ebone + bpy.ops.object.mode_set(mode='OBJECT') @@ -277,9 +312,11 @@ def generate_test(context, metarig_type="", GENERATE_FINAL=True): def generate_test_all(context, GRAPH=False): import rigify + import rigify_utils import graphviz_export import os reload(rigify) + reload(rigify_utils) reload(graphviz_export) new_objects = rigify.generate_test(context) diff --git a/release/scripts/modules/rigify/delta.py b/release/scripts/modules/rigify/delta.py index a081e3390f4..faedf7029f0 100644 --- a/release/scripts/modules/rigify/delta.py +++ b/release/scripts/modules/rigify/delta.py @@ -75,7 +75,7 @@ def main(obj, bone_definition, base_names): ''' Use this bone to define a delta thats applied to its child in pose mode. ''' - + return mode_orig = obj.mode bpy.ops.object.mode_set(mode='OBJECT') diff --git a/release/scripts/modules/rigify/finger_curl.py b/release/scripts/modules/rigify/finger_curl.py index 9cba1810fc9..73d4cc5fbd8 100644 --- a/release/scripts/modules/rigify/finger_curl.py +++ b/release/scripts/modules/rigify/finger_curl.py @@ -19,8 +19,7 @@ # import bpy -from rigify import EMPTY_LAYER -from rigify_utils import copy_bone_simple, get_side_name, get_base_name +from rigify_utils import copy_bone_simple, get_side_name, get_base_name, EMPTY_LAYER from rna_prop_ui import rna_idprop_ui_prop_get from functools import reduce @@ -90,7 +89,9 @@ def main(obj, bone_definition, base_names): # *** EDITMODE # get assosiated data - arm, orig_pbone, orig_ebone = get_bone_data(obj, bone_definition[0]) + arm = obj.data + orig_pbone = obj.pose.bones[bone_definition[0]] + orig_ebone = arm.edit_bones[bone_definition[0]] obj.animation_data_create() # needed if its a new armature with no keys @@ -117,7 +118,7 @@ def main(obj, bone_definition, base_names): children = [pbone.name for pbone in children] # set an alternate layer for driver bones - other_layer = empty_layer[:] + other_layer = EMPTY_LAYER[:] other_layer[8] = True diff --git a/release/scripts/modules/rigify/palm_curl.py b/release/scripts/modules/rigify/palm_curl.py index 78a3d1fb73f..cc40503703c 100644 --- a/release/scripts/modules/rigify/palm_curl.py +++ b/release/scripts/modules/rigify/palm_curl.py @@ -118,9 +118,9 @@ def main(obj, bone_definition, base_names): bpy.ops.object.mode_set(mode='OBJECT') - - arm, control_pbone, control_ebone = get_bone_data(obj, control_name) - arm, pinky_pbone, pinky_ebone = get_bone_data(obj, children[0]) + arm = obj.data + control_pbone = obj.pose.bones[control_name] + pinky_pbone = obj.pose.bones[children[0]] control_pbone.rotation_mode = 'YZX' control_pbone.lock_rotation = False, True, True diff --git a/release/scripts/modules/rigify_utils.py b/release/scripts/modules/rigify_utils.py index 9407c4e5875..5061248c35d 100644 --- a/release/scripts/modules/rigify_utils.py +++ b/release/scripts/modules/rigify_utils.py @@ -25,6 +25,13 @@ # for rigify so in some cases seemingly generic functions make assumptions # that a generic function would need to check for. +import bpy +from Mathutils import Vector +from rna_prop_ui import rna_idprop_ui_prop_get + +DELIMITER = '-._' +EMPTY_LAYER = [False] * 32 + def add_stretch_to(obj, from_name, to_name, name): ''' Adds a bone that stretches from one to another