diff --git a/rigify/__init__.py b/rigify/__init__.py index 68d2224506d75421fa6d6d811181ee3bac1ec3f5..fe9511cf2fafc9ffa221cbb8c53c8d7f86b03ea4 100644 --- a/rigify/__init__.py +++ b/rigify/__init__.py @@ -115,6 +115,37 @@ class RigifyParameters(bpy.types.PropertyGroup): name = bpy.props.StringProperty() +class RigifyArmatureProps(bpy.types.PropertyGroup): + layer_name_01 = bpy.props.StringProperty(name="Layer 1 Name", default="1") + layer_name_02 = bpy.props.StringProperty(name="Layer 2 Name", default="2") + layer_name_03 = bpy.props.StringProperty(name="Layer 3 Name", default="3") + layer_name_04 = bpy.props.StringProperty(name="Layer 4 Name", default="4") + layer_name_05 = bpy.props.StringProperty(name="Layer 5 Name", default="5") + layer_name_06 = bpy.props.StringProperty(name="Layer 6 Name", default="6") + layer_name_07 = bpy.props.StringProperty(name="Layer 7 Name", default="7") + layer_name_08 = bpy.props.StringProperty(name="Layer 8 Name", default="8") + layer_name_09 = bpy.props.StringProperty(name="Layer 9 Name", default="9") + layer_name_10 = bpy.props.StringProperty(name="Layer 10 Name", default="10") + layer_name_11 = bpy.props.StringProperty(name="Layer 11 Name", default="11") + layer_name_12 = bpy.props.StringProperty(name="Layer 12 Name", default="12") + layer_name_13 = bpy.props.StringProperty(name="Layer 13 Name", default="13") + layer_name_14 = bpy.props.StringProperty(name="Layer 14 Name", default="14") + layer_name_15 = bpy.props.StringProperty(name="Layer 15 Name", default="15") + layer_name_16 = bpy.props.StringProperty(name="Layer 16 Name", default="16") + layer_name_17 = bpy.props.StringProperty(name="Layer 17 Name", default="17") + layer_name_18 = bpy.props.StringProperty(name="Layer 18 Name", default="18") + layer_name_19 = bpy.props.StringProperty(name="Layer 19 Name", default="19") + layer_name_20 = bpy.props.StringProperty(name="Layer 20 Name", default="20") + layer_name_21 = bpy.props.StringProperty(name="Layer 21 Name", default="21") + layer_name_22 = bpy.props.StringProperty(name="Layer 22 Name", default="22") + layer_name_23 = bpy.props.StringProperty(name="Layer 23 Name", default="23") + layer_name_24 = bpy.props.StringProperty(name="Layer 24 Name", default="24") + layer_name_25 = bpy.props.StringProperty(name="Layer 25 Name", default="25") + layer_name_26 = bpy.props.StringProperty(name="Layer 26 Name", default="26") + layer_name_27 = bpy.props.StringProperty(name="Layer 27 Name", default="27") + layer_name_28 = bpy.props.StringProperty(name="Layer 28 Name", default="28") + + ##### REGISTER ##### def register(): @@ -123,10 +154,13 @@ def register(): bpy.utils.register_class(RigifyName) bpy.utils.register_class(RigifyParameters) + bpy.utils.register_class(RigifyArmatureProps) bpy.types.PoseBone.rigify_type = bpy.props.StringProperty(name="Rigify Type", description="Rig type for this bone.") bpy.types.PoseBone.rigify_parameters = bpy.props.CollectionProperty(type=RigifyParameters) + bpy.types.Armature.rigify_props = bpy.props.CollectionProperty(type=RigifyArmatureProps) + IDStore = bpy.types.WindowManager IDStore.rigify_collection = bpy.props.EnumProperty(items=col_enum_list, default="All", name="Rigify Active Collection", description="The selected rig collection") IDStore.rigify_types = bpy.props.CollectionProperty(type=RigifyName) @@ -144,6 +178,7 @@ def register(): def unregister(): del bpy.types.PoseBone.rigify_type del bpy.types.PoseBone.rigify_parameters + del bpy.types.Armature.rigify_props IDStore = bpy.types.WindowManager del IDStore.rigify_collection @@ -152,6 +187,7 @@ def unregister(): bpy.utils.unregister_class(RigifyName) bpy.utils.unregister_class(RigifyParameters) + bpy.utils.unregister_class(RigifyArmatureProps) metarig_menu.unregister() ui.unregister() diff --git a/rigify/generate.py b/rigify/generate.py index 4809e290c4bffed0b25f6b2058babeee0c64fc15..3de8fe23364f51eedc9e06dde2f883c5e87a647b 100644 --- a/rigify/generate.py +++ b/rigify/generate.py @@ -282,6 +282,13 @@ def generate_rig(context, metarig): vis_layers[i] = vis_layers[i] and not (ORG_LAYER[i] or MCH_LAYER[i] or DEF_LAYER[i]) obj.data.layers = vis_layers + # Create list of layer names + if len(metarig.data.rigify_props) < 1: + metarig.data.rigify_props.add() + layer_names = [] + for i in range(28): + layer_names += [getattr(metarig.data.rigify_props[0], "layer_name_%s" % str(i+1).rjust(2, "0"))] + # Generate the UI script if "rig_ui.py" in bpy.data.texts: script = bpy.data.texts["rig_ui.py"] @@ -291,7 +298,7 @@ def generate_rig(context, metarig): script.write(UI_SLIDERS % rig_id) for s in ui_scripts: script.write("\n " + s.replace("\n", "\n ") + "\n") - script.write(layers_ui(vis_layers)) + script.write(layers_ui(vis_layers, layer_names)) script.write(UI_REGISTER) script.use_module = True diff --git a/rigify/metarigs/human.py b/rigify/metarigs/human.py index e4eb9f2bf617019d731024d0cc2c3020ac04e68e..d0744066cae7f0323df905f380986a1f955d8297 100644 --- a/rigify/metarigs/human.py +++ b/rigify/metarigs/human.py @@ -24,6 +24,20 @@ def create(obj): bpy.ops.object.mode_set(mode='EDIT') arm = obj.data + props = arm.rigify_props.add() + props.layer_name_01 = "Torso" + props.layer_name_03 = "Head" + props.layer_name_05 = "Fingers" + props.layer_name_06 = "Fingers (tweak)" + props.layer_name_07 = "Arm.L (FK)" + props.layer_name_08 = "Arm.L (IK)" + props.layer_name_09 = "Arm.R (FK)" + props.layer_name_10 = "Arm.R (IK)" + props.layer_name_11 = "Leg.L (FK)" + props.layer_name_12 = "Leg.L (IK)" + props.layer_name_13 = "Leg.R (FK)" + props.layer_name_14 = "Leg.R (IK)" + bones = {} bone = arm.edit_bones.new('hips') diff --git a/rigify/rig_ui_template.py b/rigify/rig_ui_template.py index db3bb6cbc6a27fe76e9a496ef0b4a6f270e8a7f9..35df1ec2a2f18e8992614e4af8c77d33390f93a8 100644 --- a/rigify/rig_ui_template.py +++ b/rigify/rig_ui_template.py @@ -493,8 +493,8 @@ class RigUI(bpy.types.Panel): ''' -def layers_ui(layers): - """ Turn a list of booleans into a layer UI. +def layers_ui(layers, names): + """ Turn a list of booleans + a list of names into a layer UI. """ code = ''' @@ -522,7 +522,7 @@ class RigLayers(bpy.types.Panel): if i == 28: code += " row.prop(context.active_object.data, 'layers', index=%s, toggle=True, text='Root')\n" % (str(i)) else: - code += " row.prop(context.active_object.data, 'layers', index=%s, toggle=True, text='%s')\n" % (str(i), str(i + 1)) + code += " row.prop(context.active_object.data, 'layers', index=%s, toggle=True, text='%s')\n" % (str(i), names[i]) i += 1 return code diff --git a/rigify/rigs/biped/arm/fk.py b/rigify/rigs/biped/arm/fk.py index 77dcc6a6884701c626d7f076a2f078366547dc28..2c634b8667327d97cf678d59b7766f97dbca65c0 100644 --- a/rigify/rigs/biped/arm/fk.py +++ b/rigify/rigs/biped/arm/fk.py @@ -120,6 +120,8 @@ class Rig: uarm_p = pb[uarm] farm_p = pb[farm] hand_p = pb[hand] + if self.org_parent != None: + hinge_p = pb[hinge] if self.org_parent != None: socket1_p = pb[socket1] @@ -134,6 +136,13 @@ class Rig: else: farm_p.lock_rotation = (True, True, False) + # Hinge transforms are locked, for auto-ik + if self.org_parent != None: + hinge_p.lock_location = True, True, True + hinge_p.lock_rotation = True, True, True + hinge_p.lock_rotation_w = True + hinge_p.lock_scale = True, True, True + # Set up custom properties if self.org_parent != None: prop = rna_idprop_ui_prop_get(uarm_p, "isolate", create=True) diff --git a/rigify/rigs/biped/leg/fk.py b/rigify/rigs/biped/leg/fk.py index e231fa8e8bfa66e3518bfa7520c4b1f72fbfa74d..f2ce6653d5bfe2010fd4b9db917b4ea9112a2723 100644 --- a/rigify/rigs/biped/leg/fk.py +++ b/rigify/rigs/biped/leg/fk.py @@ -158,12 +158,14 @@ class Rig: thigh_p = pb[thigh] shin_p = pb[shin] foot_p = pb[foot] + if self.org_parent != None: + hinge_p = pb[hinge] if self.org_parent != None: socket1_p = pb[socket1] socket2_p = pb[socket2] - # Set the elbow to only bend on the x-axis. + # Set the knee to only bend on the x-axis. shin_p.rotation_mode = 'XYZ' if 'X' in self.primary_rotation_axis: shin_p.lock_rotation = (False, True, True) @@ -172,6 +174,13 @@ class Rig: else: shin_p.lock_rotation = (True, True, False) + # Hinge transforms are locked, for auto-ik + if self.org_parent != None: + hinge_p.lock_location = True, True, True + hinge_p.lock_rotation = True, True, True + hinge_p.lock_rotation_w = True + hinge_p.lock_scale = True, True, True + # Set up custom properties if self.org_parent != None: prop = rna_idprop_ui_prop_get(thigh_p, "isolate", create=True) diff --git a/rigify/rigs/spine.py b/rigify/rigs/spine.py index 2b4558f4f5c2b6c7cc919a6b14e170de689033a3..a6bbc74733b071a65fa2a54c8ffa8da3119fbf12 100644 --- a/rigify/rigs/spine.py +++ b/rigify/rigs/spine.py @@ -508,6 +508,9 @@ class Rig: if w != None: obj_to_bone(w, self.obj, self.org_bones[-1]) + # Layers + pb[main_control].bone.layers = pb[self.org_bones[0]].bone.layers + return [main_control] + controls def generate(self): diff --git a/rigify/ui.py b/rigify/ui.py index a751cfe93fe585494a5448ce3c8bbdc866126e62..eafa967960b9f4d016a72da0c18a3916f2ce4dca 100644 --- a/rigify/ui.py +++ b/rigify/ui.py @@ -81,6 +81,46 @@ class DATA_PT_rigify_buttons(bpy.types.Panel): op.metarig_type = id_store.rigify_types[id_store.rigify_active_type].name +class DATA_PT_rigify_layer_names(bpy.types.Panel): + bl_label = "Rigify Layer Names" + bl_space_type = 'PROPERTIES' + bl_region_type = 'WINDOW' + bl_context = "data" + bl_options = {'DEFAULT_CLOSED'} + + @classmethod + def poll(cls, context): + if not context.armature: + return False + #obj = context.object + #if obj: + # return (obj.mode in ('POSE', 'OBJECT', 'EDIT')) + #return False + return True + + def draw(self, context): + C = context + layout = self.layout + obj = context.object + + if len(obj.data.rigify_props) < 1: + obj.data.rigify_props.add() + + for i in range(28): + if (i % 16) == 0: + col = layout.column() + if i == 0: + col.label(text="Top Row:") + else: + col.label(text="Bottom Row:") + if (i % 8) == 0: + col = layout.column(align=True) + row = col.row() + row.prop(obj.data, "layers", index=i, text="", toggle=True) + row.prop(obj.data.rigify_props[0], "layer_name_%s" % str(i+1).rjust(2, "0"), text="Layer %d" % (i + 1)) + + + class BONE_PT_rigify_buttons(bpy.types.Panel): bl_label = "Rigify Type" bl_space_type = 'PROPERTIES' @@ -243,6 +283,7 @@ class Sample(bpy.types.Operator): #from bl_ui import space_info # ensure the menu is loaded first def register(): + bpy.utils.register_class(DATA_PT_rigify_layer_names) bpy.utils.register_class(DATA_PT_rigify_buttons) bpy.utils.register_class(BONE_PT_rigify_buttons) bpy.utils.register_class(Generate) @@ -252,6 +293,7 @@ def register(): def unregister(): + bpy.utils.unregister_class(DATA_PT_rigify_layer_names) bpy.utils.unregister_class(DATA_PT_rigify_buttons) bpy.utils.unregister_class(BONE_PT_rigify_buttons) bpy.utils.unregister_class(Generate)