diff --git a/rigify/metarigs/human.py b/rigify/metarigs/human.py index 9a67504a7f5122c29b94db58d3af793adb8c1209..10e093163742ff4ae49392fa567d6a92c847a75c 100644 --- a/rigify/metarigs/human.py +++ b/rigify/metarigs/human.py @@ -551,7 +551,7 @@ def create(obj): pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] pbone = obj.pose.bones[bones['shoulder.L']] - pbone.rigify_type = 'copy' + pbone.rigify_type = 'basic.copy' pbone.lock_location = (True, True, True) pbone.lock_rotation = (False, True, False) pbone.lock_rotation_w = False @@ -559,7 +559,7 @@ def create(obj): pbone.rotation_mode = 'YXZ' pbone.bone.layers = [True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] pbone = obj.pose.bones[bones['shoulder.R']] - pbone.rigify_type = 'copy' + pbone.rigify_type = 'basic.copy' pbone.lock_location = (True, True, True) pbone.lock_rotation = (False, True, False) pbone.lock_rotation_w = False diff --git a/rigify/rigs/basic/__init__.py b/rigify/rigs/basic/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/rigify/rigs/copy.py b/rigify/rigs/basic/copy.py similarity index 97% rename from rigify/rigs/copy.py rename to rigify/rigs/basic/copy.py index 61c4cc99799cc8b1492740d9955de9d6b25e750b..ed6d781689b189dc5ea66433826da722d332c61e 100644 --- a/rigify/rigs/copy.py +++ b/rigify/rigs/basic/copy.py @@ -65,7 +65,7 @@ class Rig: # Constrain the original bone. con = pb[self.org_bone].constraints.new('COPY_TRANSFORMS') - con.name = "copy_loc" + con.name = "copy_transforms" con.target = self.obj con.subtarget = bone @@ -92,7 +92,7 @@ class Rig: bpy.ops.object.mode_set(mode='OBJECT') pbone = obj.pose.bones[bones['Bone']] - pbone.rigify_type = 'copy' + pbone.rigify_type = 'simple.bone' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) pbone.lock_rotation_w = False diff --git a/rigify/rigs/basic/copy_chain.py b/rigify/rigs/basic/copy_chain.py new file mode 100644 index 0000000000000000000000000000000000000000..930e025b236edad619b55306eeb06ace4b2b6e64 --- /dev/null +++ b/rigify/rigs/basic/copy_chain.py @@ -0,0 +1,172 @@ +#====================== BEGIN GPL LICENSE BLOCK ====================== +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +#======================= END GPL LICENSE BLOCK ======================== + +import bpy +from rigify.utils import MetarigError +from rigify.utils import copy_bone +from rigify.utils import connected_children_names +from rigify.utils import strip_org, make_deformer_name +from rigify.utils import create_bone_widget + + +class Rig: + """ A "copy_chain" rig. All it does is duplicate the original bone chain + and constrain it. + This is a control and deformation rig. + + """ + def __init__(self, obj, bone_name, params): + """ Gather and validate data about the rig. + """ + self.obj = obj + self.org_bones = [bone_name] + connected_children_names(obj, bone_name) + self.params = params + + if len(self.org_bones) <= 1: + raise MetarigError("RIGIFY ERROR: Bone '%s': input to rig type must be a chain of 2 or more bones." % (strip_org(bone))) + + def generate(self): + """ Generate the rig. + Do NOT modify any of the original bones, except for adding constraints. + The main armature should be selected and active before this is called. + + """ + bpy.ops.object.mode_set(mode='EDIT') + + # Create the deformation and control bone chains. + # Just copies of the original chain. + def_chain = [] + ctrl_chain = [] + for i in range(len(self.org_bones)): + name = self.org_bones[i] + + # Create bones + def_bone = copy_bone(self.obj, name) + ctrl_bone = copy_bone(self.obj, name) + + # Get edit bones + eb = self.obj.data.edit_bones + def_bone_e = eb[def_bone] + ctrl_bone_e = eb[ctrl_bone] + + # Set their names + def_bone_e.name = make_deformer_name(strip_org(name)) + ctrl_bone_e.name = strip_org(name) + + # Add them to their respective lists + def_chain += [def_bone_e.name] + ctrl_chain += [ctrl_bone_e.name] + + # Parenting + if i == 0: + # First bone + def_bone_e.parent = eb[self.org_bones[i]].parent + ctrl_bone_e.parent = eb[self.org_bones[i]].parent + else: + # The rest + def_bone_e.parent = eb[def_chain[i-1]] + ctrl_bone_e.parent = eb[ctrl_chain[i-1]] + + bpy.ops.object.mode_set(mode='OBJECT') + pb = self.obj.pose.bones + + # Constraint org and def to the control bones + for org, ctrl, defrm in zip(self.org_bones, ctrl_chain, def_chain): + con = pb[org].constraints.new('COPY_TRANSFORMS') + con.name = "copy_transforms" + con.target = self.obj + con.subtarget = ctrl + + con = pb[defrm].constraints.new('COPY_TRANSFORMS') + con.name = "copy_transforms" + con.target = self.obj + con.subtarget = ctrl + + # Create control widgets + for bone in ctrl_chain: + create_bone_widget(self.obj, bone) + + @classmethod + def create_sample(self, obj): + """ Create a sample metarig for this rig type. + + """ + # generated by rigify.utils.write_metarig + bpy.ops.object.mode_set(mode='EDIT') + arm = obj.data + + bones = {} + + bone = arm.edit_bones.new('bone.01') + bone.head[:] = 0.0000, 0.0000, 0.0000 + bone.tail[:] = 0.0000, 0.0000, 0.3333 + bone.roll = 0.0000 + bone.use_connect = False + bones['bone.01'] = bone.name + bone = arm.edit_bones.new('bone.02') + bone.head[:] = 0.0000, 0.0000, 0.3333 + bone.tail[:] = 0.0000, 0.0000, 0.6667 + bone.roll = 3.1416 + bone.use_connect = True + bone.parent = arm.edit_bones[bones['bone.01']] + bones['bone.02'] = bone.name + bone = arm.edit_bones.new('bone.03') + bone.head[:] = 0.0000, 0.0000, 0.6667 + bone.tail[:] = 0.0000, 0.0000, 1.0000 + bone.roll = 3.1416 + bone.use_connect = True + bone.parent = arm.edit_bones[bones['bone.02']] + bones['bone.03'] = bone.name + + bpy.ops.object.mode_set(mode='OBJECT') + pbone = obj.pose.bones[bones['bone.01']] + pbone.rigify_type = 'basic.copy_chain' + pbone.lock_location = (False, False, False) + pbone.lock_rotation = (False, False, False) + pbone.lock_rotation_w = False + pbone.lock_scale = (False, False, False) + pbone.rotation_mode = 'QUATERNION' + pbone.rigify_parameters.add() + pbone = obj.pose.bones[bones['bone.02']] + pbone.rigify_type = '' + pbone.lock_location = (False, False, False) + pbone.lock_rotation = (False, False, False) + pbone.lock_rotation_w = False + pbone.lock_scale = (False, False, False) + pbone.rotation_mode = 'QUATERNION' + pbone = obj.pose.bones[bones['bone.03']] + pbone.rigify_type = '' + pbone.lock_location = (False, False, False) + pbone.lock_rotation = (False, False, False) + pbone.lock_rotation_w = False + pbone.lock_scale = (False, False, False) + pbone.rotation_mode = 'QUATERNION' + + bpy.ops.object.mode_set(mode='EDIT') + for bone in arm.edit_bones: + bone.select = False + bone.select_head = False + bone.select_tail = False + for b in bones: + bone = arm.edit_bones[bones[b]] + bone.select = True + bone.select_head = True + bone.select_tail = True + arm.edit_bones.active = bone + +