|
| 1 | +import bpy, re |
| 2 | +from mathutils import Vector |
| 3 | +from ...utils import copy_bone, flip_bone, put_bone |
| 4 | +from ...utils import org, strip_org, make_deformer_name, connected_children_names, make_mechanism_name |
| 5 | +from ...utils import create_circle_widget, create_sphere_widget, create_widget, create_cube_widget |
| 6 | +from ...utils import MetarigError |
| 7 | +from rna_prop_ui import rna_idprop_ui_prop_get |
| 8 | +from ..widgets import create_face_widget, create_eye_widget, create_eyes_widget, create_ear_widget, create_jaw_widget, create_teeth_widget |
| 9 | + |
| 10 | + |
| 11 | +class Rig: |
| 12 | + |
| 13 | + CTRL_SCALE = 0.1 |
| 14 | + |
| 15 | + def __init__(self, obj, bone_name, params): |
| 16 | + self.obj = obj |
| 17 | + self.bones = dict() |
| 18 | + self.bones['org'] = [bone_name] |
| 19 | + |
| 20 | + for edit_bone in self.obj.data.edit_bones[bone_name].children_recursive: |
| 21 | + self.bones['org'].append(edit_bone.name) |
| 22 | + |
| 23 | + for edit_bone in self.obj.data.edit_bones[bone_name].children_recursive: |
| 24 | + if self.obj.pose.bones[edit_bone.name].rigify_type != "": |
| 25 | + self.bones['org'].remove(edit_bone.name) |
| 26 | + for child in edit_bone.children_recursive: |
| 27 | + self.bones['org'].remove(child.name) |
| 28 | + |
| 29 | + self.bones['ctrl'] = dict() |
| 30 | + |
| 31 | + def create_controls(self): |
| 32 | + bpy.ops.object.mode_set(mode='EDIT') |
| 33 | + edit_bones = self.obj.data.edit_bones |
| 34 | + |
| 35 | + start_bones = [] |
| 36 | + |
| 37 | + for name in self.bones['org'][1:]: |
| 38 | + if not edit_bones[name].use_connect: |
| 39 | + start_bones.append(name) |
| 40 | + |
| 41 | + for name in start_bones: |
| 42 | + subchain = [name] |
| 43 | + subchain.extend(connected_children_names(self.obj, name)) |
| 44 | + self.bones['ctrl'][strip_org(name)] = [] |
| 45 | + |
| 46 | + for subname in subchain: |
| 47 | + ctrl = copy_bone(self.obj, self.bones['org'][0], assign_name=strip_org(subname)) |
| 48 | + put_bone(self.obj, ctrl, edit_bones[subname].head) |
| 49 | + edit_bones[ctrl].length *= self.CTRL_SCALE |
| 50 | + self.bones['ctrl'][strip_org(name)].append(ctrl) |
| 51 | + |
| 52 | + last_name = subchain[-1] |
| 53 | + last_ctrl = copy_bone(self.obj, self.bones['org'][0], assign_name=strip_org(last_name)) |
| 54 | + put_bone(self.obj, last_ctrl, edit_bones[last_name].tail) |
| 55 | + edit_bones[last_ctrl].length *= self.CTRL_SCALE |
| 56 | + self.bones['ctrl'][strip_org(name)].append(last_ctrl) |
| 57 | + |
| 58 | + bpy.ops.object.mode_set(mode='OBJECT') |
| 59 | + for subchain in self.bones['ctrl']: |
| 60 | + for ctrl in self.bones['ctrl'][subchain]: |
| 61 | + create_sphere_widget(self.obj, ctrl) |
| 62 | + |
| 63 | + def generate(self): |
| 64 | + |
| 65 | + self.create_controls() |
| 66 | + |
| 67 | + return [""] |
0 commit comments