#====================== 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 ...base_rig import BaseRig from ...utils.naming import strip_org, make_deformer_name from ...utils.widgets_basic import create_bone_widget, create_circle_widget class Rig(BaseRig): """ A "copy" rig. All it does is duplicate the original bone and constrain it. This is a control and deformation rig. """ def find_org_bones(self, pose_bone): return pose_bone.name def initialize(self): """ Gather and validate data about the rig. """ self.org_name = strip_org(self.bones.org) self.make_control = self.params.make_control self.make_widget = self.params.make_widget self.make_deform = self.params.make_deform def generate_bones(self): bones = self.bones # Make a control bone (copy of original). if self.make_control: bones.ctrl = self.copy_bone(bones.org, self.org_name, parent=True) # Make a deformation bone (copy of original, child of original). if self.make_deform: bones.deform = self.copy_bone(bones.org, make_deformer_name(self.org_name), bbone=True) def parent_bones(self): bones = self.bones if self.make_deform: self.set_bone_parent(bones.deform, bones.org, use_connect=False) def configure_bones(self): bones = self.bones if self.make_control: self.copy_bone_properties(bones.org, bones.ctrl) def rig_bones(self): bones = self.bones if self.make_control: # Constrain the original bone. self.make_constraint(bones.org, 'COPY_TRANSFORMS', bones.ctrl) def generate_widgets(self): bones = self.bones if self.make_control: # Create control widget if self.make_widget: create_circle_widget(self.obj, bones.ctrl, radius=0.5) else: create_bone_widget(self.obj, bones.ctrl) @classmethod def add_parameters(self, params): """ Add the parameters of this rig type to the RigifyParameters PropertyGroup """ params.make_control = bpy.props.BoolProperty( name = "Control", default = True, description = "Create a control bone for the copy" ) params.make_widget = bpy.props.BoolProperty( name = "Widget", default = True, description = "Choose a widget for the bone control" ) params.make_deform = bpy.props.BoolProperty( name = "Deform", default = True, description = "Create a deform bone for the copy" ) @classmethod def parameters_ui(self, layout, params): """ Create the ui for the rig parameters. """ r = layout.row() r.prop(params, "make_control") r = layout.row() r.prop(params, "make_widget") r.enabled = params.make_control r = layout.row() r.prop(params, "make_deform") def create_sample(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') bone.head[:] = 0.0000, 0.0000, 0.0000 bone.tail[:] = 0.0000, 0.0000, 0.2000 bone.roll = 0.0000 bone.use_connect = False bones['Bone'] = bone.name bpy.ops.object.mode_set(mode='OBJECT') pbone = obj.pose.bones[bones['Bone']] pbone.rigify_type = 'basic.super_copy' 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 return bones