Changeset View
Changeset View
Standalone View
Standalone View
rigify/rigs/spines/super_spine.py
| import bpy | import bpy | ||||
| from mathutils import Vector | from mathutils import Vector | ||||
| from ...utils import copy_bone, flip_bone, put_bone, org, align_bone_y_axis, align_bone_x_axis | from ...utils import copy_bone, flip_bone, put_bone, org, align_bone_y_axis, align_bone_x_axis | ||||
| from ...utils import strip_org, make_deformer_name, connected_children_names | from ...utils import strip_org, make_deformer_name, connected_children_names | ||||
| from ...utils import create_circle_widget, create_sphere_widget, create_neck_bend_widget, create_neck_tweak_widget | from ...utils import create_circle_widget, create_sphere_widget, create_neck_bend_widget, create_neck_tweak_widget | ||||
| from ..widgets import create_ballsocket_widget | from ..widgets import create_ballsocket_widget | ||||
| from ...utils import MetarigError, make_mechanism_name, create_cube_widget | from ...utils import MetarigError, make_mechanism_name, create_cube_widget | ||||
| from ...utils import ControlLayersOption | |||||
| from rna_prop_ui import rna_idprop_ui_prop_get | from rna_prop_ui import rna_idprop_ui_prop_get | ||||
| script = """ | script = """ | ||||
| controls = [%s] | controls = [%s] | ||||
| torso = '%s' | torso = '%s' | ||||
| if is_selected( controls ): | if is_selected( controls ): | ||||
| if hasattr(pose_bones[torso],'["%s"]'): | if hasattr(pose_bones[torso],'["%s"]'): | ||||
| Show All 37 Lines | def __init__(self, obj, bone_name, params): | ||||
| self.neck_pos = params.neck_pos | self.neck_pos = params.neck_pos | ||||
| if not self.use_head: | if not self.use_head: | ||||
| self.neck_pos = len(self.org_bones) | self.neck_pos = len(self.org_bones) | ||||
| if self.use_tail and self.pivot_pos - 2 > 0: | if self.use_tail and self.pivot_pos - 2 > 0: | ||||
| self.tail_pos = params.tail_pos | self.tail_pos = params.tail_pos | ||||
| # Assign values to tweak layers props if opted by user | |||||
| if params.tweak_extra_layers: | |||||
| self.tweak_layers = list(params.tweak_layers) | |||||
| else: | |||||
| self.tweak_layers = None | |||||
| # Report error of user created less than the minimum of bones for rig | # Report error of user created less than the minimum of bones for rig | ||||
| min_bone_number = 3 | min_bone_number = 3 | ||||
| if self.use_head: | if self.use_head: | ||||
| min_bone_number += 1 | min_bone_number += 1 | ||||
| if self.use_tail: | if self.use_tail: | ||||
| min_bone_number += 2 | min_bone_number += 2 | ||||
| if len(self.org_bones) < min_bone_number: | if len(self.org_bones) < min_bone_number: | ||||
| ▲ Show 20 Lines • Show All 562 Lines • ▼ Show 20 Lines | def constrain_bones(self, bones): | ||||
| 'use_offset': True, | 'use_offset': True, | ||||
| 'owner_space': 'LOCAL', | 'owner_space': 'LOCAL', | ||||
| 'target_space': 'LOCAL' | 'target_space': 'LOCAL' | ||||
| }) | }) | ||||
| if len(bones['neck']['original_names']) > 3: | if len(bones['neck']['original_names']) > 3: | ||||
| self.make_constraint(b, { | self.make_constraint(b, { | ||||
| 'constraint': 'COPY_SCALE', | 'constraint': 'COPY_SCALE', | ||||
| 'subtarget': org(l['original_names'][j+1]), | 'subtarget': bones['neck']['ctrl_neck'], | ||||
| 'influence': 1.0 | 'influence': 1.0 | ||||
| }) | }) | ||||
| else: | else: | ||||
| factor = float(1 / len(l['tweak'])) | factor = float(1 / len(l['tweak'])) | ||||
| self.make_constraint(b, { | self.make_constraint(b, { | ||||
| 'constraint': 'COPY_TRANSFORMS', | 'constraint': 'COPY_TRANSFORMS', | ||||
| 'subtarget': l['ctrl'], | 'subtarget': l['ctrl'], | ||||
| ▲ Show 20 Lines • Show All 282 Lines • ▼ Show 20 Lines | def locks_and_widgets(self, bones): | ||||
| for bone in tweaks: | for bone in tweaks: | ||||
| if bones['neck']['tweak'] and bone == bones['neck']['tweak'][0] \ | if bones['neck']['tweak'] and bone == bones['neck']['tweak'][0] \ | ||||
| and len(bones['neck']['original_names']) > 3: | and len(bones['neck']['original_names']) > 3: | ||||
| create_neck_tweak_widget(self.obj, bone, size=1.0, bone_transform_name=None) | create_neck_tweak_widget(self.obj, bone, size=1.0, bone_transform_name=None) | ||||
| continue | continue | ||||
| create_sphere_widget(self.obj, bone, bone_transform_name=None) | create_sphere_widget(self.obj, bone, bone_transform_name=None) | ||||
| if self.tweak_layers: | ControlLayersOption.TWEAK.assign(self.params, pb, tweaks) | ||||
| pb[bone].bone.layers = self.tweak_layers | |||||
| def generate(self): | def generate(self): | ||||
| # Torso Rig Anatomy: | # Torso Rig Anatomy: | ||||
| # Neck: all bones above neck point, last bone is head | # Neck: all bones above neck point, last bone is head | ||||
| # Upper torso: all bones between pivot and neck start | # Upper torso: all bones between pivot and neck start | ||||
| # Lower torso: all bones below pivot until tail point | # Lower torso: all bones below pivot until tail point | ||||
| # Tail: all bones below tail point | # Tail: all bones below tail point | ||||
| ▲ Show 20 Lines • Show All 99 Lines • ▼ Show 20 Lines | def add_parameters(params): | ||||
| params.use_head = bpy.props.BoolProperty( | params.use_head = bpy.props.BoolProperty( | ||||
| name='use_head', | name='use_head', | ||||
| default=True, | default=True, | ||||
| description='Create head and neck bones' | description='Create head and neck bones' | ||||
| ) | ) | ||||
| # Setting up extra layers for the FK and tweak | # Setting up extra layers for the FK and tweak | ||||
| params.tweak_extra_layers = bpy.props.BoolProperty( | ControlLayersOption.TWEAK.add_parameters(params) | ||||
| name="tweak_extra_layers", | |||||
| default=True, | |||||
| description="" | |||||
| ) | |||||
| params.tweak_layers = bpy.props.BoolVectorProperty( | |||||
| size = 32, | |||||
| description = "Layers for the tweak controls to be on", | |||||
| default = tuple( [ i == 1 for i in range(0, 32) ] ) | |||||
| ) | |||||
| def parameters_ui(layout, params): | def parameters_ui(layout, params): | ||||
| """ Create the ui for the rig parameters.""" | """ Create the ui for the rig parameters.""" | ||||
| r = layout.row(align=True) | r = layout.row(align=True) | ||||
| r.prop(params, "use_head", toggle=True, text="Head") | r.prop(params, "use_head", toggle=True, text="Head") | ||||
| r.prop(params, "use_tail", toggle=True, text="Tail") | r.prop(params, "use_tail", toggle=True, text="Tail") | ||||
| Show All 11 Lines | def parameters_ui(layout, params): | ||||
| r = layout.row() | r = layout.row() | ||||
| col = r.column(align=True) | col = r.column(align=True) | ||||
| row = col.row(align=True) | row = col.row(align=True) | ||||
| for i, axis in enumerate(['x', 'y', 'z']): | for i, axis in enumerate(['x', 'y', 'z']): | ||||
| row.prop(params, "copy_rotation_axes", index=i, toggle=True, text=axis) | row.prop(params, "copy_rotation_axes", index=i, toggle=True, text=axis) | ||||
| r.enabled = params.use_tail | r.enabled = params.use_tail | ||||
| r = layout.row() | ControlLayersOption.TWEAK.parameters_ui(layout, params) | ||||
| r.prop(params, "tweak_extra_layers") | |||||
| r.active = params.tweak_extra_layers | |||||
| col = r.column(align=True) | |||||
| row = col.row(align=True) | |||||
| bone_layers = bpy.context.active_pose_bone.bone.layers[:] | |||||
| for i in range(8): | |||||
| icon = "NONE" | |||||
| if bone_layers[i]: | |||||
| icon = "LAYER_ACTIVE" | |||||
| row.prop(params, "tweak_layers", index=i, toggle=True, text="", icon=icon) | |||||
| row = col.row(align=True) | |||||
| for i in range(16, 24): | |||||
| icon = "NONE" | |||||
| if bone_layers[i]: | |||||
| icon = "LAYER_ACTIVE" | |||||
| row.prop(params, "tweak_layers", index=i, toggle=True, text="", icon=icon) | |||||
| col = r.column(align=True) | |||||
| row = col.row(align=True) | |||||
| for i in range(8, 16): | |||||
| icon = "NONE" | |||||
| if bone_layers[i]: | |||||
| icon = "LAYER_ACTIVE" | |||||
| row.prop(params, "tweak_layers", index=i, toggle=True, text="", icon=icon) | |||||
| row = col.row(align=True) | |||||
| for i in range(24, 32): | |||||
| icon = "NONE" | |||||
| if bone_layers[i]: | |||||
| icon = "LAYER_ACTIVE" | |||||
| row.prop(params, "tweak_layers", index=i, toggle=True, text="", icon=icon) | |||||
| def create_sample(obj): | def create_sample(obj): | ||||
| # generated by rigify.utils.write_metarig | # generated by rigify.utils.write_metarig | ||||
| bpy.ops.object.mode_set(mode='EDIT') | bpy.ops.object.mode_set(mode='EDIT') | ||||
| arm = obj.data | arm = obj.data | ||||
| bones = {} | bones = {} | ||||
| ▲ Show 20 Lines • Show All 128 Lines • Show Last 20 Lines | |||||