From 54d4cbe6b0677564eeddc98ea2d98afefcc5095e Mon Sep 17 00:00:00 2001 From: Mark Allain <62905048+OctavoPE@users.noreply.github.com> Date: Mon, 6 May 2024 15:44:48 -0600 Subject: [PATCH 1/4] Delete setup_wizard/character_rig_setup/RootShape.blend --- .../character_rig_setup/RootShape.blend | Bin 278817 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 setup_wizard/character_rig_setup/RootShape.blend diff --git a/setup_wizard/character_rig_setup/RootShape.blend b/setup_wizard/character_rig_setup/RootShape.blend deleted file mode 100644 index dc65df3a6d00b99052edc606cec2abc9c14dfeb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 278817 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�k%QYXPd4tE zZv;ca<%Z{gz2hTMA zDR#l-mlM`)T`pg`{-yD$f$YbP4S(%QkfU`+ilak29it2zn6F{enhkFL6f2sj*?#CH~>?*d7UdY5HFRIo1lEbx{ED^Q7;BKV!#@J z8^lA?!xEp{jiaelZ%wdZ48R-N%vtde$<|~OX?t!BLeN)fpQ@FU(&w{$hkYYd*i6k3 z90oUlP#qh}msK!b;^=PUdI83kqMe)>27<>t?>(uFc+$oIppRsmqsxx>%M4~l?kHdR z1PWSNvZ3TO&!$TSN75{vtR?`9${T_g&0<+f9y7(RM$g6eM~&_CbfCtSNqZaP&CSx9 zx_e4TXgmqf{CJ~w8s_&5RyBN+e%m7c$!4>UYYKu{(KAH0S!J-hG1=OD6@_stys=!s zFcN5^)-GFkIIsC-30ZL5pWac-l({ag0oCAT#*YKq!w^ugRcb!PzupV}IxRIPhpEIL5yxy6sxq44nA+IUd=oj`9HKGTO-MGP!aC zTOX$~4nokHU9IB;JWg<*26J55PO5hU-=pN@aPY-n6V0_vqx<*flD!`2m?Sj6{&eGB zsomD=qd&(1lc5lAd>_BI*S%hzr$ZsOjA6#B>M>ohee%`EI!9#vfj}OtN(qCT2 zQ*OiT72)3-QX%~=`x6>s5kz(z4!BjH6N9Mq32Ef(AmfldX-@DS@ zBTGbQ5bGBDr�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

EzG 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%0AQ7npQ{!kPF#>c&p1-;_wf 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 y006K8003A4003AE002({000yQ003zi001C70RT$g001!30RR#J00027>XMIah=S$- From 31323c6d0a915082059b99e26e5912ac3f142680 Mon Sep 17 00:00:00 2001 From: Mark Allain <62905048+OctavoPE@users.noreply.github.com> Date: Mon, 6 May 2024 15:44:58 -0600 Subject: [PATCH 2/4] Delete setup_wizard/character_rig_setup/rig_script.py --- .../character_rig_setup/rig_script.py | 3092 ----------------- 1 file changed, 3092 deletions(-) delete mode 100644 setup_wizard/character_rig_setup/rig_script.py diff --git a/setup_wizard/character_rig_setup/rig_script.py b/setup_wizard/character_rig_setup/rig_script.py deleted file mode 100644 index 8ed6658..0000000 --- a/setup_wizard/character_rig_setup/rig_script.py +++ /dev/null @@ -1,3092 +0,0 @@ -# Authors: enthralpy, Llama.jpg -# Setup Wizard Integration by michael-gh1 - -import bpy -import os -from mathutils import Color, Vector -from math import pi - -def rig_character( - file_path, - disallow_arm_ik_stretch, - disallow_leg_ik_stretch, - use_arm_ik_poles, - use_leg_ik_poles, - add_child_of_constraints, - use_head_tracker, - meshes_joined=False): - - # Firstly, let's make a flag to identify the blender version. - is_version_4 = False - version_string = bpy.app.version_string - if version_string[0] == "4": - is_version_4 = True - - head_bone_arm_target = bpy.context.active_object - temp_armature = head_bone_arm_target.data - - bpy.ops.object.mode_set(mode='EDIT') - - # Check if toe bones exist - toe_bones_exist = True - if "Bip001 L Toe0" not in temp_armature.edit_bones: - toe_bones_exist = False - - # Check if eyes exist: - left_eye_exists = True - if "+EyeBone L A02" not in temp_armature.edit_bones: - left_eye_exists = False - - right_eye_exists = True - if "+EyeBone R A02" not in temp_armature.edit_bones: - right_eye_exists = False - - no_eyes = False - if not left_eye_exists and not right_eye_exists: - no_eyes = True - - # Hoyo models have inconsistent head bone shapes. I'm correcting them to my standard. (This stabilizes the head track bone) - # My logic: Line up the head bone's tail's X & Y to the head bone's head (so that it's straight up), and use the eye bone's head's Z as the height. - Llama - if not no_eyes: - if left_eye_exists: - eye_bone_head = temp_armature.edit_bones['+EyeBone L A02'] - elif right_eye_exists: - eye_bone_head = temp_armature.edit_bones['+EyeBone R A02'] - eye_bone_head_z = eye_bone_head.head[2] - - head_bone_temp = temp_armature.edit_bones['Bip001 Head'] - head_bone_head_x = head_bone_temp.head[0] - head_bone_head_y = head_bone_temp.head[1] - - head_bone_temp.tail[0] = head_bone_head_x - head_bone_temp.tail[1] = head_bone_head_y - head_bone_temp.tail[2] = eye_bone_head_z - - # If they dont have eye bones (Dottore), we can hardcode a reasonable value to use to repair the head. - else: - head_bone_temp = temp_armature.edit_bones['Bip001 Head'] - head_bone_head_x = head_bone_temp.head[0] - head_bone_head_y = head_bone_temp.head[1] - - head_bone_temp.tail[0] = head_bone_head_x - head_bone_temp.tail[1] = head_bone_head_y - head_bone_temp.tail[2] = head_bone_temp.head[2] + 0.0538 - - left_eye_2 = [] - left_eye_1 = [] - right_eye_2 = [] - right_eye_1 = [] - - if left_eye_exists: - left_eye_2.append(temp_armature.edit_bones['+EyeBone L A02'].head[0]) - left_eye_2.append(temp_armature.edit_bones['+EyeBone L A02'].head[1]) - left_eye_2.append(temp_armature.edit_bones['+EyeBone L A02'].head[2]) - - left_eye_1.append(temp_armature.edit_bones['+EyeBone L A01'].head[0]) - left_eye_1.append(temp_armature.edit_bones['+EyeBone L A01'].head[1]) - left_eye_1.append(temp_armature.edit_bones['+EyeBone L A01'].head[2]) - if right_eye_exists: - right_eye_2.append(temp_armature.edit_bones['+EyeBone R A02'].head[0]) - right_eye_2.append(temp_armature.edit_bones['+EyeBone R A02'].head[1]) - right_eye_2.append(temp_armature.edit_bones['+EyeBone R A02'].head[2]) - - right_eye_1.append(temp_armature.edit_bones['+EyeBone R A01'].head[0]) - right_eye_1.append(temp_armature.edit_bones['+EyeBone R A01'].head[1]) - right_eye_1.append(temp_armature.edit_bones['+EyeBone R A01'].head[2]) - - bpy.ops.object.mode_set(mode='OBJECT') - - # THANK YOU: https://blenderartists.org/t/how-to-bpy-ops-transform-resize-in-edit-mode-using-pivot/560381/2 - def get_override(area_type, region_type): - for area in bpy.context.screen.areas: - if area.type == area_type: - for region in area.regions: - if region.type == region_type: - override = {'area': area, 'region': region} - return override - #error message if the area or region wasn't found - raise RuntimeError("Wasn't able to find", region_type," in area ", area_type, " Make sure it's open while executing script.") - - #we need to override the context of our operator - override = get_override( 'VIEW_3D', 'WINDOW' ) - - # Function to create shape keys from given arguments: Works with only one element in vg to parse - def create_shape_key(obj_get, is_basis, shape_name, transform_pivot, vertex_groups_to_parse, transform_type, transformation_1, transformation_2=0, use_eye_1=False): - bpy.context.view_layer.objects.active = head_bone_arm_target - bpy.ops.object.mode_set(mode='EDIT') - for this_group in vertex_groups_to_parse: - if use_eye_1: - if " R " in this_group: - if right_eye_exists: - bpy.context.scene.cursor.location = (right_eye_1[0],right_eye_1[1],right_eye_1[2]) - elif " L " in this_group: - if left_eye_exists: - bpy.context.scene.cursor.location = (left_eye_1[0],left_eye_1[1],left_eye_1[2]) - else: - if " R " in this_group: - if right_eye_exists: - bpy.context.scene.cursor.location = (right_eye_2[0],right_eye_2[1],right_eye_2[2]) - elif " L " in this_group: - if left_eye_exists: - bpy.context.scene.cursor.location = (left_eye_2[0],left_eye_2[1],left_eye_2[2]) - - # AFTER MOVING 3D CURSOR - this_obj = bpy.data.objects.get(obj_get) - bpy.context.view_layer.objects.active = this_obj - - if is_basis: - this_obj.shape_key_add(name='Basis') - - this_obj.shape_key_add(from_mix=False) - sk = this_obj.data.shape_keys.key_blocks[-1] - sk.name = shape_name - sk.value = 1 - shape_index = this_obj.data.shape_keys.key_blocks.keys().index(shape_name) - bpy.context.object.active_shape_key_index = shape_index - - bpy.ops.object.mode_set(mode='EDIT') - bpy.ops.mesh.select_all(action='DESELECT') - bpy.context.tool_settings.transform_pivot_point = "CURSOR" - - try: - bpy.ops.object.vertex_group_set_active(group=this_group) - bpy.ops.object.vertex_group_select() - - if transform_type == "RESIZE": - # for documentation: v4 does not like the override argument lmao - if not is_version_4: - bpy.ops.transform.resize(override, value=(transformation_1), orient_type='LOCAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='LOCAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) - else: - bpy.ops.transform.resize(value=(transformation_1), orient_type='LOCAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='LOCAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) - bpy.ops.object.vertex_group_deselect() - elif transform_type == "TRANSLATE": - if not is_version_4: - bpy.ops.transform.translate(override, value=transformation_1, orient_type='LOCAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='LOCAL', constraint_axis=(False, True, False), mirror=True, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) - bpy.ops.transform.resize(override, value=transformation_2) - bpy.ops.object.vertex_group_deselect() - else: - bpy.ops.transform.translate(value=transformation_1, orient_type='LOCAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='LOCAL', constraint_axis=(False, True, False), mirror=True, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) - bpy.ops.transform.resize(override, value=transformation_2) - bpy.ops.object.vertex_group_deselect() - except: - pass - - bpy.ops.object.vertex_group_deselect() - bpy.ops.mesh.select_all(action='DESELECT') - bpy.ops.object.mode_set(mode='OBJECT') - sk.value = 0.0 - bpy.context.scene.cursor.location = (0.0,0.0,0.0) - - # Function to create shape keys that works with 2 elementsa - def create_shape_key2(obj_get, is_basis, shape_name, transform_pivot, vertex_groups_to_parse, transform_type, transformation_1, transformation_2=0, use_eye_1=False): - bpy.context.view_layer.objects.active = head_bone_arm_target - bpy.ops.object.mode_set(mode='EDIT') - if use_eye_1: - if " R " in vertex_groups_to_parse[0]: - if right_eye_exists: - bpy.context.scene.cursor.location = (right_eye_1[0],right_eye_1[1],right_eye_1[2]) - elif " L " in vertex_groups_to_parse[0]: - if left_eye_exists: - bpy.context.scene.cursor.location = (left_eye_1[0],left_eye_1[1],left_eye_1[2]) - else: - if " R " in vertex_groups_to_parse[0]: - if right_eye_exists: - bpy.context.scene.cursor.location = (right_eye_2[0],right_eye_2[1],right_eye_2[2]) - elif " L " in vertex_groups_to_parse[0]: - if left_eye_exists: - bpy.context.scene.cursor.location = (left_eye_2[0],left_eye_2[1],left_eye_2[2]) - - # AFTER MOVING 3D CURSOR - this_obj = bpy.data.objects.get(obj_get) - bpy.context.view_layer.objects.active = this_obj - - if is_basis: - this_obj.shape_key_add(name='Basis') - - this_obj.shape_key_add(from_mix=False) - sk = this_obj.data.shape_keys.key_blocks[-1] - sk.name = shape_name - sk.value = 1 - shape_index = this_obj.data.shape_keys.key_blocks.keys().index(shape_name) - bpy.context.object.active_shape_key_index = shape_index - - bpy.ops.object.mode_set(mode='EDIT') - bpy.ops.mesh.select_all(action='DESELECT') - bpy.context.tool_settings.transform_pivot_point = "CURSOR" - - try: - bpy.ops.object.vertex_group_set_active(group=vertex_groups_to_parse[0]) - bpy.ops.object.vertex_group_select() - - if transform_type == "RESIZE": - if not is_version_4: - bpy.ops.transform.resize(override, value=(transformation_1), orient_type='LOCAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='LOCAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) - bpy.ops.object.vertex_group_deselect() - else: - bpy.ops.transform.resize(value=(transformation_1), orient_type='LOCAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='LOCAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) - bpy.ops.object.vertex_group_deselect() - elif transform_type == "TRANSLATE": - if not is_version_4: - bpy.ops.transform.translate(override, value=transformation_1, orient_type='LOCAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='LOCAL', constraint_axis=(False, True, False), mirror=True, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) - bpy.ops.transform.resize(override, value=transformation_2) - bpy.ops.object.vertex_group_deselect() - else: - bpy.ops.transform.translate(value=transformation_1, orient_type='LOCAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='LOCAL', constraint_axis=(False, True, False), mirror=True, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) - bpy.ops.transform.resize(override, value=transformation_2) - bpy.ops.object.vertex_group_deselect() - - except: - pass - - bpy.ops.mesh.select_all(action='DESELECT') - bpy.ops.object.mode_set(mode='OBJECT') - - # REPEAT FOR SECOND BONE! - - bpy.context.view_layer.objects.active = head_bone_arm_target - bpy.ops.object.mode_set(mode='EDIT') - if use_eye_1: - if " R " in vertex_groups_to_parse[1]: - if right_eye_exists: - bpy.context.scene.cursor.location = (right_eye_1[0],right_eye_1[1],right_eye_1[2]) - elif " L " in vertex_groups_to_parse[1]: - if left_eye_exists: - bpy.context.scene.cursor.location = (left_eye_1[0],left_eye_1[1],left_eye_1[2]) - else: - if " R " in vertex_groups_to_parse[1]: - if right_eye_exists: - bpy.context.scene.cursor.location = (right_eye_2[0],right_eye_2[1],right_eye_2[2]) - elif " L " in vertex_groups_to_parse[1]: - if left_eye_exists: - bpy.context.scene.cursor.location = (left_eye_2[0],left_eye_2[1],left_eye_2[2]) - - # AFTER MOVING 3D CURSOR - this_obj = bpy.data.objects.get(obj_get) - bpy.context.view_layer.objects.active = this_obj - - bpy.ops.object.mode_set(mode='EDIT') - bpy.ops.mesh.select_all(action='DESELECT') - - try: - bpy.ops.object.vertex_group_set_active(group=vertex_groups_to_parse[1]) - bpy.ops.object.vertex_group_select() - - if transform_type == "RESIZE": - if not is_version_4: - bpy.ops.transform.resize(override, value=(transformation_1), orient_type='LOCAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='LOCAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) - bpy.ops.object.vertex_group_deselect() - else: - bpy.ops.transform.resize(value=(transformation_1), orient_type='LOCAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='LOCAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) - bpy.ops.object.vertex_group_deselect() - elif transform_type == "TRANSLATE": - if not is_version_4: - bpy.ops.transform.translate(override, value=transformation_1, orient_type='LOCAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='LOCAL', constraint_axis=(False, True, False), mirror=True, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) - bpy.ops.transform.resize(override, value=transformation_2) - bpy.ops.object.vertex_group_deselect() - else: - bpy.ops.transform.translate(value=transformation_1, orient_type='LOCAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='LOCAL', constraint_axis=(False, True, False), mirror=True, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) - bpy.ops.transform.resize(override, value=transformation_2) - bpy.ops.object.vertex_group_deselect() - except: - pass - - bpy.ops.mesh.select_all(action='DESELECT') - bpy.ops.object.mode_set(mode='OBJECT') - - # DONE - sk.value = 0.0 - bpy.context.scene.cursor.location = (0.0,0.0,0.0) - - - # Shape key to shrink pupils - create_shape_key2("Body", True, "pupils", "CURSOR", ["+EyeBone L A02","+EyeBone R A02"], "RESIZE", (0.5,0.5,0.5)) - # Shape keys to adjust eye during blink - # For some reason, the math is different for v4, therefore adjust the nums so its more like v3.6 - if not is_version_4: - create_shape_key("Body", False, "pupil-pushback-R", "CURSOR", ["+EyeBone R A02"], "TRANSLATE", (0, 0.00703, 0), (1.1,1.1,1.1),use_eye_1=True) # 0.0069, 70 - create_shape_key("Body", False, "pupil-pushback-L", "CURSOR", ["+EyeBone L A02"], "TRANSLATE", (0, 0.00703, 0), (1.1,1.1,1.1),use_eye_1=True) - else: - create_shape_key("Body", False, "pupil-pushback-R", "CURSOR", ["+EyeBone R A02"], "TRANSLATE", (0, 0.00234, 0), (1.1,1.1,1.1),use_eye_1=True) # 0.0069, 70 - create_shape_key("Body", False, "pupil-pushback-L", "CURSOR", ["+EyeBone L A02"], "TRANSLATE", (0, 0.00234, 0), (1.1,1.1,1.1),use_eye_1=True) - - try: - # Bring back EyeStar - bpy.data.objects["EyeStar"].hide_set(False) - bpy.data.objects["EyeStar"].hide_viewport = False - bpy.data.objects["EyeStar"].hide_render = False - - # Shape key to enable EyeStar growth/shrinkage - create_shape_key2("EyeStar", True, "EyeStar", "CURSOR", ["+EyeBone R A02","+EyeBone L A02"], "RESIZE", (0,0,0)) - except: - pass - - bpy.context.tool_settings.transform_pivot_point = "MEDIAN_POINT" - - bpy.context.view_layer.objects.active = head_bone_arm_target - bpy.ops.object.mode_set(mode='EDIT') - - if not toe_bones_exist: - r_foot_bone = temp_armature.edit_bones["Bip001 R Foot"] - r_foot_bone.tail = (-0.040187,-0.078244,0.005803) # X, Y, Z - r_foot_bone.roll = 1.5708 - - l_foot_bone = temp_armature.edit_bones["Bip001 L Foot"] - l_foot_bone.tail = (0.040187,-0.078244,0.005803) - l_foot_bone.roll = 1.5708 - - bpy.ops.object.mode_set(mode='OBJECT') - bpy.context.view_layer.objects.active = head_bone_arm_target - - # Let's let the RigUI script that poke made execute. - - context = bpy.context - obj = context.object - if obj.name[-4:] == ".001": - obj.name = obj.name[:-4] - print("New Run\n\n") - ## Rename all bones in selected armature to ORG - original_name = obj.name - abadidea = { - 'Bip001 Pelvis': 'spine', - 'Bip001 L Thigh': 'thigh.L', - 'Bip001 L Calf': 'shin.L', - 'Bip001 L Foot': 'foot.L', - 'Bip001 L Toe0': 'toe.L', - 'Bip001 R Thigh': 'thigh.R', - 'Bip001 R Calf': 'shin.R', - 'Bip001 R Foot': 'foot.R', - 'Bip001 R Toe0': 'toe.R', - 'Bip001 Spine': 'spine.001', - 'Bip001 Spine1': 'spine.002', - 'Bip001 Spine2': 'spine.003', - 'Bip001 L Clavicle': 'shoulder.L', - 'Bip001 L UpperArm': 'upper_arm.L', - 'Bip001 L Forearm': 'forearm.L', - 'Bip001 L Hand': 'hand.L', - 'Bip001 L Finger0': 'thumb.01.L', - 'DMZ L 01': 'thumb.01.L', ##WHERE DO THESE SIX COME FROM LMAO - 'DMZ L 02': 'thumb.02.L', - 'DMZ L 03': 'thumb.03.L', - 'DMZ R 01': 'thumb.01.R', - 'DMZ R 02': 'thumb.02.R', - 'DMZ R 03': 'thumb.03.R', - 'Bip001 L Finger01': 'thumb.02.L', - 'Bip001 L Finger02': 'thumb.03.L', - 'Bip001 L Finger1': 'f_index.01.L', - 'Bip001 L Finger11': 'f_index.02.L', - 'Bip001 L Finger12': 'f_index.03.L', - 'Bip001 L Finger2': 'f_middle.01.L', - 'Bip001 L Finger21': 'f_middle.02.L', - 'Bip001 L Finger22': 'f_middle.03.L', - 'Bip001 L Finger3': 'f_ring.01.L', - 'Bip001 L Finger31': 'f_ring.02.L', - 'Bip001 L Finger32': 'f_ring.03.L', - 'Bip001 L Finger4': 'f_pinky.01.L', - 'Bip001 L Finger41': 'f_pinky.02.L', - 'Bip001 L Finger42': 'f_pinky.03.L', - 'Bip001 Neck': 'spine.004', #YO - 'Bip001 Head': 'spine.006', #RUHROH - 'Bip001 R Clavicle': 'shoulder.R', - 'Bip001 R UpperArm': 'upper_arm.R', - 'Bip001 R Forearm': 'forearm.R', - 'Bip001 R Hand': 'hand.R', - 'Bip001 R Finger0': 'thumb.01.R', - 'Bip001 R Finger01': 'thumb.02.R', - 'Bip001 R Finger02': 'thumb.03.R', - 'Bip001 R Finger1': 'f_index.01.R', - 'Bip001 R Finger11': 'f_index.02.R', - 'Bip001 R Finger12': 'f_index.03.R', - 'Bip001 R Finger2': 'f_middle.01.R', - 'Bip001 R Finger21': 'f_middle.02.R', - 'Bip001 R Finger22': 'f_middle.03.R', - 'Bip001 R Finger3': 'f_ring.01.R', - 'Bip001 R Finger31': 'f_ring.02.R', - 'Bip001 R Finger32': 'f_ring.03.R', - 'Bip001 R Finger4': 'f_pinky.01.R', - 'Bip001 R Finger41': 'f_pinky.02.R', - 'Bip001 R Finger42': 'f_pinky.03.R', - '+EyeBone R A01': 'eye.R', - '+EyeBone L A01': 'eye.L', - '+Breast L A01': 'breast.L', - '+Breast R A01': 'breast.R', - } - if not toe_bones_exist: - del abadidea['Bip001 L Toe0'] - del abadidea['Bip001 R Toe0'] - - bpy.ops.object.mode_set(mode='EDIT') - armature = bpy.context.selected_objects[0].data - - bpy.ops.armature.select_all(action='DESELECT') - def select_bone(bone): - bone.select = True - bone.select_head = True - bone.select_tail = True - - # Disconnect the eyes because it'll throw an error if I don't, disconnect the spines so the hip wiggle bone in the rigify rig works properly - try: - select_bone(armature.edit_bones["+EyeBone L A02"]) - select_bone(armature.edit_bones["+EyeBone R A02"]) - except: - pass - select_bone(armature.edit_bones["Bip001 Spine"]) - select_bone(armature.edit_bones["Bip001 Spine1"]) - select_bone(armature.edit_bones["Bip001 Spine2"]) - bpy.ops.armature.parent_clear(type='DISCONNECT') - bpy.ops.armature.select_all(action='DESELECT') - - try: - select_bone(armature.edit_bones["+Breast R A02"]) - select_bone(armature.edit_bones["+Breast L A02"]) - bpy.ops.armature.parent_clear(type='DISCONNECT') - bpy.ops.armature.select_all(action='DESELECT') - except: - pass - - bones_list = obj.pose.bones - for bone in bones_list: - if bone.name in abadidea: - bone.name = abadidea[bone.name] - - # Fix finger rolls - Thanks Poke! - how_not = ['f_index.01.L', 'f_index.02.L', 'f_index.03.L'] - hahaha = ['f_middle.01.L', 'f_middle.02.L', 'f_middle.03.L'] - to_name = ['f_ring.01.L', 'f_ring.02.L', 'f_ring.03.L'] - things_efficiently = ['f_pinky.01.L', 'f_pinky.02.L', 'f_pinky.03.L'] - - for bone in how_not: - armature.edit_bones[bone].roll -= .1197 - - for bone in hahaha: - armature.edit_bones[bone].roll -= .04 - - for bone in to_name: - armature.edit_bones[bone].roll += .1297 - - for bone in things_efficiently: - armature.edit_bones[bone].roll += .338 - - #Aw shit here we go again. This second loop is for making it possible to symmetrize pose bones properly. - for bone in bones_list: - if ".L" in bone.name: - whee = bone.name[:-2] + ".R" - if "f_" in bone.name or "thumb" in bone.name: - armature.edit_bones[whee].roll = -armature.edit_bones[bone.name].roll - else: - armature.edit_bones[bone.name].roll = -armature.edit_bones[whee].roll - - armature.edit_bones["shoulder.L"].roll += 3.14 - armature.edit_bones["shoulder.R"].roll -= 3.14 - - - - # Fixes the thumb scale rotating inward on x instead of z - armature.edit_bones["thumb.01.L"].roll += 3.14 / 4 - armature.edit_bones["thumb.02.L"].roll += 3.14 / 4 - armature.edit_bones["thumb.03.L"].roll += 3.14 / 4 - armature.edit_bones["thumb.01.R"].roll -= 3.14 / 4 - armature.edit_bones["thumb.02.R"].roll -= 3.14 / 4 - armature.edit_bones["thumb.03.R"].roll -= 3.14 / 4 - - - - for bone in armature.edit_bones: - if "thumb" in bone.name or "index" in bone.name or "middle" in bone.name or "ring" in bone.name or "pinky" in bone.name: - if ".L" in bone.name: - armature.edit_bones[bone.name].roll -= 1.571 - else: - armature.edit_bones[bone.name].roll += 1.571 - ## Not sure why this bone exist but it's gotta go lmao - if bone.name == "Bip001": - for childbone in bone.children: - if childbone.name != "spine": - armature.edit_bones[childbone.name].parent = armature.edit_bones['spine'] - armature.edit_bones.remove(bone) - elif ".L" not in bone.name and ".R" not in bone.name: - armature.edit_bones[bone.name].roll = 0 - - - ## Fixes the weirdass pelvis/spine bone. Sets the spine's head and tail X to 0. - def realign(bone): - bone.head.x = 0 - bone.tail.x = 0 - realign(armature.edit_bones['spine']) - realign(armature.edit_bones['spine.006']) - - - ## Attaches the feet to the toes and the upperarms to lowerarms - def attachfeets(foot, toe): - armature.edit_bones[foot].tail.x = armature.edit_bones[toe].head.x - armature.edit_bones[foot].tail.y = armature.edit_bones[toe].head.y - armature.edit_bones[foot].tail.z = armature.edit_bones[toe].head.z - - if toe_bones_exist: - attachfeets('foot.L', 'toe.L') - attachfeets('foot.R', 'toe.R') - - attachfeets('upper_arm.L', 'forearm.L') - attachfeets('upper_arm.R', 'forearm.R') - attachfeets('thigh.L', 'shin.L') - attachfeets('thigh.R', 'shin.R') - attachfeets('forearm.L', 'hand.L') - attachfeets('forearm.R', 'hand.R') - attachfeets('spine', 'spine.001') - attachfeets('spine.001', 'spine.002') - attachfeets('spine.002', 'spine.003') - attachfeets('spine.003', 'spine.004') - attachfeets('spine.004', 'spine.006') - - ## Points toe bones in correct direction - if toe_bones_exist: - armature.edit_bones['toe.L'].tail.z = 0 - armature.edit_bones['toe.L'].tail.y -= 0.05 - - armature.edit_bones['toe.R'].tail.z = 0 - armature.edit_bones['toe.R'].tail.y -= 0.05 - - bpy.ops.armature.select_all(action='DESELECT') - try: - select_bone(armature.edit_bones["breast.L"]) - bpy.ops.armature.symmetrize() - bpy.ops.armature.select_all(action='DESELECT') - - except Exception: - pass - - try: - armature.edit_bones["eye.L"].name = "DEF-eye.L" - armature.edit_bones["eye.R"].name = "DEF-eye.R" - except: - pass - - bpy.ops.object.mode_set(mode='POSE') - - bpy.ops.object.expykit_convert_bone_names(src_preset='Rigify_Metarig.py', trg_preset='Rigify_Deform.py') - bpy.ops.object.expykit_extract_metarig(rig_preset='Rigify_Metarig.py', assign_metarig=True) - - - - ## Fixes the tiddy bones. Expykit, why did you neglect them - - metarm = bpy.data.objects["metarig"].data - bpy.ops.object.mode_set(mode='EDIT') - armature = bpy.data.objects[obj.name].data - - ## Left side first, right side's xyz is same as left, but x is negative - def getboob(bone, tip): - if tip == "head": - return armature.edit_bones[bone].head.x, armature.edit_bones[bone].head.y, armature.edit_bones[bone].head.z - else: - return armature.edit_bones[bone].tail.x, armature.edit_bones[bone].tail.y, armature.edit_bones[bone].tail.z - - - try: - xh, yh, zh = getboob("breast.L", "head") - xt, yt, zt = getboob("breast.L", "tail") - - ## Change the meta arm's boob positions - - def fixboob(bone, xh, yh, zh, xt, yt, zt): - bone.head.x = xh - bone.head.y = yh - bone.head.z = zh - bone.tail.x = xt - bone.tail.y = yt - bone.tail.z = zt - - boobL = metarm.edit_bones["breast.L"] - fixboob(boobL, xh, yh, zh, xt, yt, zt) - boobR = metarm.edit_bones["breast.R"] - fixboob(boobR, -xh, yh, zh, -xt, yt, zt) - - boobL.roll = armature.edit_bones["breast.L"].roll - boobR.roll = -boobL.roll - except Exception: - # If breast bones dont exist in the orig rig, then delete from the meta rig - metarm.edit_bones.remove(metarm.edit_bones["breast.L"]) - metarm.edit_bones.remove(metarm.edit_bones["breast.R"]) - - - - # Fixes the finger rolls - bpy.ops.object.mode_set(mode='OBJECT') - metapose = bpy.data.objects['metarig'].pose - for bone_name in ['f_index', 'f_middle', 'f_ring', 'f_pinky']: - metapose.bones[f"{bone_name}.01.L"].rigify_parameters.primary_rotation_axis = 'Z' - metapose.bones[f"{bone_name}.01.R"].rigify_parameters.primary_rotation_axis = '-Z' - - metapose.bones["thumb.01.L"].rigify_parameters.primary_rotation_axis = 'Z' - metapose.bones["thumb.01.R"].rigify_parameters.primary_rotation_axis = '-Z' - - - ## This part corrects metarm finger rolls - bpy.ops.object.mode_set(mode='OBJECT') - bpy.ops.object.select_all(action='DESELECT') - - armature = obj.data - - for o in bpy.data.objects: - # Check for given object names - if o.name in ("metarig", armature.name): - o.select_set(True) - - - bpy.ops.object.mode_set(mode='EDIT') - for bone in metarm.edit_bones: - if "f_" in bone.name or "thumb" in bone.name: - bone.roll = armature.edit_bones["DEF-"+bone.name].roll - - # Fix hand bones being rotated 90 degrees sideways and arm deformation bones being wonky - if "Loli" in obj.name: - metarm.edit_bones["upper_arm.L"].tail.y += .003 - metarm.edit_bones["upper_arm.R"].tail.y += .003 - - ########## DETACH PHYSICS BONES, - - metanames = ['eye.L', 'eye.R', 'spine', 'thigh.L', 'shin.L', 'foot.L', 'toe.L', 'thigh.R', 'shin.R', 'foot.R', 'toe.R', 'spine.001', 'spine.002', 'spine.003', 'breast.L', 'breast.R', 'shoulder.L', 'upper_arm.L', 'forearm.L', 'hand.L', 'thumb.01.L', 'thumb.02.L', 'thumb.03.L', 'f_index.01.L', 'f_index.02.L', 'f_index.03.L', 'f_middle.01.L', 'f_middle.02.L', 'f_middle.03.L', 'f_ring.01.L', 'f_ring.02.L', 'f_ring.03.L', 'f_pinky.01.L', 'f_pinky.02.L', 'f_pinky.03.L', 'spine.004', 'spine.006', 'shoulder.R', 'upper_arm.R', 'forearm.R', 'hand.R', 'thumb.01.R', 'thumb.02.R', 'thumb.03.R', 'f_index.01.R', 'f_index.02.R', 'f_index.03.R', 'f_middle.01.R', 'f_middle.02.R', 'f_middle.03.R', 'f_ring.01.R', 'f_ring.02.R', 'f_ring.03.R', 'f_pinky.01.R', 'f_pinky.02.R', 'f_pinky.03.R'] - if not toe_bones_exist: - metanames.remove("toe.L") - metanames.remove("toe.R") - - - pre_res = ["DEF-" + bonename for bonename in metanames] - armature = obj.data ## Original char rig - - - ## Make a dictionary. Key is a main body bone that exists in the Rigify (arm, leg, spine, etc), and the value is a list of all the children bones that aren't other main body bones (usually hair, clothes, deform, etc.) - savethechildren = { - - } - bpy.ops.object.mode_set(mode='EDIT') - for bone in armature.edit_bones: - if bone.name in pre_res: - childlist = [] - for childbone in armature.edit_bones[bone.name].children: - if childbone.name not in pre_res: # Adds only non-main body bones, avoids like forearm or knee etc - childlist.append(childbone.name) - if childlist: # If list isn't empty, add it to dict - wtf = bone.name - savethechildren[wtf] = childlist - - - ## Duplicates the physics bones - bpy.ops.object.mode_set(mode='EDIT') - bpy.ops.armature.select_all(action='DESELECT') - bones = armature.edit_bones[:] - for bone in bones: - if bone.name not in pre_res: - #this is a physics bone, so duplicate it. - bone.select = True - bone.select_tail = True - bone.select_head = True - - bpy.ops.armature.separate() - # Generates rigify rig and renames it to 'rigify' - bpy.ops.pose.rigify_generate() - bpy.data.objects[obj.name].name = "rigify" - bpy.context.view_layer.objects.active = bpy.data.objects[armature.name + ".001"] - - - for o in bpy.data.objects: - # Check for given object names - if o.name in ("rigify", armature.name): - o.select_set(True) - - # THEN REATTACH PHYSICS - - bpy.ops.object.mode_set(mode='OBJECT') - ### BLENDER ARE U GOOD LMAO WTF IS THIS (this joins two objects together) - newrig = armature.name + ".001" ## New temporary armature with the physics bones. Hopefully you didnt touch any names lmao - - ## Why's the list for selected objects ordered alphabetically instead of by selection order - objList = bpy.context.selected_objects - unselected = [obj for obj in objList if obj != context.active_object] - rigifyr = unselected[0] ## Rigified Rig - - obs = [bpy.data.objects.get("rigify"), bpy.data.objects.get(newrig)] - c={} - c["object"] = c["active_object"] = bpy.data.objects.get("rigify") - c["selected_objects"] = c["selected_editable_objects"] = obs - bpy.ops.object.mode_set(mode='OBJECT') - bpy.ops.object.select_all(action='DESELECT') - - with bpy.context.temp_override(active_object=bpy.data.objects.get("rigify"), selected_editable_objects=obs): - bpy.ops.object.join() - - - bpy.context.view_layer.objects.active = bpy.data.objects["rigify"] - - setup_neck_and_head_follow(neck_follow_value=1.0, head_follow_value=1.0) - setup_finger_scale_controls_on_x_axis_to_curl_just_the_fingertips(rigifyr) - - bpy.ops.object.mode_set(mode='EDIT') - - #### whats this for??? - #oh i think it's useless now bc there's only one rig LMAOLMAO - #for bone in bones_list: - # armature.edit_bones[bone.name].roll = rigifyr.data.edit_bones[bone.name].roll - #### - - ## Reattach the physics bones to their parents - #Go back into rigify, find the main body bones, and reattach every bone in the corresponding dict list - for mainbone in savethechildren: - for childbone in savethechildren[mainbone]: - rigifyr.data.edit_bones[childbone].parent = rigifyr.data.edit_bones[mainbone] - - print("donelol\n") - bpy.ops.object.mode_set(mode='OBJECT') - bpy.data.objects["rigify"].show_in_front = True - - # Symmetrize clothes/hair bones - bpy.ops.object.mode_set(mode='EDIT') - for bone in rigifyr.data.edit_bones: - if " L " in bone.name: # Finds clothes/hair bones with symmetrical bones - y = bone.name.find(' L ') # Finds index of "Hair L 1" - orgname = bone.name - try: - oppbone = orgname[:y] + " R " + orgname[y+3:] # oppbone = "Hair R 1" - bone.name = orgname[:y] + orgname[y+3:] + ".L" #Rename bones to "Hair 1.L/R" so Blender - rigifyr.data.edit_bones[oppbone].name = orgname[:y] + orgname[y+3:] + ".R" # goes ":o symmetry" - except: - pass - - rigifyr.pose.bones["upper_arm_parent.L"]["pole_parent"] = 2 - rigifyr.pose.bones["upper_arm_parent.R"]["pole_parent"] = 2 - rigifyr.pose.bones["thigh_parent.L"]["pole_parent"] = 2 - rigifyr.pose.bones["thigh_parent.R"]["pole_parent"] = 2 - - bpy.ops.object.mode_set(mode='OBJECT') - #change active object to rigifyr - - bpy.context.view_layer.objects.active = bpy.data.objects["rigify"] - - bpy.ops.object.mode_set(mode='OBJECT') - - # This part puts all the main bones I use into the secoond bone layer - listofbones = ["root", "foot_heel_ik.R", "foot_heel_ik.L", "toe_ik.R", "toe_ik.L", "foot_ik.R", "foot_ik.L", "thigh_ik_target.R", "thigh_ik_target.L", "hips", "torso", "chest", "neck", "head", "shoulder.L", "shoulder.R", "upper_arm_fk.L", "upper_arm_fk.R", "forearm_fk.L", "forearm_fk.R", "hand_fk.L", "hand_fk.R", "upper_arm_ik_target.L", "upper_arm_ik_target.R", "hand_ik.R", "hand_ik.L", ] - - if not toe_bones_exist: - listofbones.remove("toe_ik.R") - listofbones.remove("toe_ik.L") - - if not is_version_4: - for bone in listofbones: - bpy.context.active_object.pose.bones[bone].bone.layers[1] = True - - try: - bpy.data.objects["EyeStar"].hide_viewport = False - except: - pass - - x = original_name.split("_") - char_name = x[-1] - bpy.data.objects["rigify"].name = char_name + "Rig" - - bpy.ops.object.mode_set(mode='POSE') - bpy.ops.pose.select_all(action='DESELECT') - bones_list = obj.pose.bones - - # Creates selection sets for FK arms + shoulders, hair bones, and clothes bones. Selection Sets is an addon that comes with Blender. - try: - bpy.ops.object.mode_set(mode='POSE') - - arms = ['upper_arm_fk', 'forearm_fk', 'hand_fk', 'shoulder'] - bpy.ops.pose.select_all(action='DESELECT') - for side in ['.L', '.R']: - for bone in arms: - bonename = bone + side - rigifyr.pose.bones[bonename].bone.select= True - bpy.ops.pose.selection_set_add() - bpy.ops.pose.selection_set_assign() - bpy.ops.pose.select_all(action='DESELECT') - - ## Hair - for bone in bones_list: - if "Hair" in bone.name: - rigifyr.pose.bones[bone.name].bone.select = True - bpy.ops.pose.selection_set_add() - bpy.ops.pose.selection_set_assign() - bpy.ops.pose.select_all(action='DESELECT') - - ## Clothes - for bone in bones_list: - if "Amice" in bone.name or ("fk" not in bone.name and "tweak" not in bone.name and "Twist" not in bone.name and "Hair" not in bone.name and (bone.name[-1].isdigit() or bone.name[-3].isdigit())): - rigifyr.pose.bones[bone.name].bone.select = True - bpy.ops.pose.selection_set_add() - bpy.ops.pose.selection_set_assign() - bpy.ops.pose.select_all(action='DESELECT') - bpy.context.object.selection_sets[0].name = "FK Arms" - bpy.context.object.selection_sets[1].name = "Hair" - bpy.context.object.selection_sets[2].name = "Clothes...and teeth and eyes lmao" - except: - pass - - # Fix scaling for finger tips. - rig = bpy.context.object - - for oDrv in rig.animation_data.drivers: - for variable in oDrv.driver.variables: - for target in variable.targets: - if ".03" in oDrv.data_path and target.data_path[-7:] == "scale.y": - target.data_path = target.data_path[:-1] + "x" - - fingerlist = ["thumb.01_master", "f_index.01_master", "f_middle.01_master", "f_ring.01_master", "f_pinky.01_master"] - - for side in [".L", ".R"]: - for bone in fingerlist: - rig.pose.bones[bone + side].lock_scale[0] = False - - # Fix face shading being offset 90 degrees - bpy.ops.object.mode_set(mode='OBJECT') - try: - head_driver_obj = bpy.data.objects.get("Head Driver") or bpy.data.objects.get("Head Origin") - bpy.context.view_layer.objects.active = head_driver_obj - bpy.ops.constraint.childof_set_inverse(constraint="Child Of", owner='OBJECT') - except: - pass - - # POST RIGIFY SCRIPT EXECUTION -----------------> - - # Hide metarig (I think you can actually delete it instead?) - bpy.data.objects["metarig"].hide_select = True - bpy.data.objects["metarig"].hide_viewport = True - bpy.data.objects["metarig"].hide_render = True - - # Moves specified param and it's children into the collection - def move_into_collection(object,collection): - - # Get object - this_obj = bpy.context.scene.objects.get(object) - # Get existing collection or make new one - this_coll = bpy.data.collections.get(collection) - if not this_coll: - this_coll = bpy.data.collections.new(collection) - bpy.context.scene.collection.children.link(this_coll) - - # Move object into collection - if this_obj: - # Unlink it from all previous collections before moving it to new one - for coll in this_obj.users_collection: - coll.objects.unlink(this_obj) - - # Move it to our specified collection (This only does the parent obj) - this_coll.objects.link(this_obj) - - # Now we move the children of this object - for child_obj in this_obj.children: - # Same thing, unlink previous collections - for coll in child_obj.users_collection: - coll.objects.unlink(child_obj) - this_coll.objects.link(child_obj) - - # Move the rig into the char name's collection - move_into_collection(char_name+"Rig",char_name) - - # Let's make a new wgt collection inside the char coll. - char_coll = bpy.data.collections.get(char_name) - wgt_coll = bpy.data.collections.new("wgt") - char_coll.children.link(wgt_coll) - - # Rename our WGT collection and put the metarig into it. - for coll in bpy.data.collections: - if coll.name.startswith("WGTS"): - coll.name = "WG" - - move_into_collection("metarig","wgt") - - # Unlink all inner objects from the old WGT collection. We want them inside the new one. - for obj in bpy.data.objects: - if obj.name.startswith("WGT"): - for coll in obj.users_collection: - coll.objects.unlink(obj) - - wgt_coll.objects.link(obj) - - # Remove old unused wgt collection - bpy.data.collections.remove(bpy.data.collections.get("WG")) - - # Obfuscate light driving stuff not needed, keep the main light. - move_into_collection("Face Light Direction","wgt") - move_into_collection("Head Driver",char_name) - move_into_collection("Main Light Direction",char_name) - - # V3 Shader Support - New empty names - move_into_collection("Head Origin",char_name) - move_into_collection("Light Direction",char_name) - - bpy.data.collections["wgt"].hide_select = True - bpy.data.collections["wgt"].hide_viewport = True - bpy.data.collections["wgt"].hide_render = True - - head_driver_obj = bpy.data.objects.get("Head Driver") or bpy.data.objects.get("Head Origin") - if head_driver_obj: - head_driver_obj.hide_select = True - head_driver_obj.hide_viewport = True - head_driver_obj.hide_render = True - - head_forward_obj = bpy.data.objects.get("Head Forward") - head_forward_obj.hide_select = True - head_forward_obj.hide_viewport = True - head_forward_obj.hide_render = True - - head_up_obj = bpy.data.objects.get("Head Up") - head_up_obj.hide_select = True - head_up_obj.hide_viewport = True - head_up_obj.hide_render = True - - # If it exists, gets rid of the default collection. - camera_coll = bpy.data.collections.get("Collection") - if camera_coll: - bpy.data.collections.remove(camera_coll,do_unlink=True) - - # Let's 'exclude' that wgt collection: https://blenderartists.org/t/disable-exlude-from-view-layer-in-collection/1324744 - def recurLayerCollection(layerColl): - found = None - if (layerColl.name == "wgt"): - return layerColl - for layer in layerColl.children: - found = recurLayerCollection(layer) - if found: - return found - layer_collection = bpy.context.view_layer.layer_collection - layerColl = recurLayerCollection(layer_collection) - bpy.context.view_layer.active_layer_collection = layerColl - - layerColl.exclude = True - - # Make our lives easier, display the bones as sticks and make sure we can view from front. - bpy.data.armatures[original_name].display_type = 'STICK' - bpy.data.objects[char_name+"Rig"].show_in_front = True - - # Going into pose mode with our character selected. - bpy.ops.object.select_all(action='DESELECT') - our_char = bpy.data.objects.get(char_name+"Rig") - if our_char: - our_char.select_set(True) - bpy.context.view_layer.objects.active = our_char - - bpy.ops.object.mode_set(mode='POSE') - - # Function to automatically move a bone (if it exists) to the specified bone layer. pass in num+1 than layer desired. - def move_bone(bone_name,to_layers): - armature = bpy.context.active_object - armature_data = armature.data - - if bone_name in armature_data.bones: - bone = armature_data.bones[bone_name] - - for i in range(32): - bone.layers[i] = False - - to_layers = [to_layers] if isinstance(to_layers, int) else to_layers - - for layer in to_layers: - bone.layers[layer] = True - print("enabling layer: " + str(layer) + " for " + bone_name) - - - - if not is_version_4: - # Put away every other bone to the physics layer (22) - for bone in bpy.context.active_object.data.bones: - if bone.layers[0]: # Check if the bone is on layer face - move_bone(bone.name, 25) # Move the bone to layer 23 - - # Let's append our root_shape custom bones - path_to_file = file_path + "/Collection" - - # Bring in our collections: root shapes, face rig, and the eye rig - bpy.ops.wm.append(filename='append_Face Plate', directory=path_to_file) - - bpy.ops.wm.append(filename='append_Root', directory=path_to_file) - - bpy.ops.wm.append(filename='append_Eyes', directory=path_to_file) - - bpy.ops.wm.append(filename='append_Pelvis', directory=path_to_file) - - bpy.ops.wm.append(filename='append_Foot', directory=path_to_file) - - bpy.ops.wm.append(filename='append_Hand', directory=path_to_file) - - this_obj = None - for obj in bpy.data.objects: - if "Rig" in obj.name: - this_obj = obj - - this_obj.pose.bones["root"].custom_shape = bpy.data.objects["root plate.002"] - this_obj.pose.bones["root"].use_custom_shape_bone_size = False - - this_obj.pose.bones["head"].custom_shape_scale_xyz = (1.65,1.65,1.65) - this_obj.pose.bones["head"].custom_shape = bpy.data.objects["neck"] - this_obj.pose.bones["head"].custom_shape_translation = (0.0,0.255,0.0) - this_obj.pose.bones["head"].custom_shape_rotation_euler[0] = 1.5708 - this_obj.pose.bones["head"].use_custom_shape_bone_size = False - - this_obj.pose.bones["neck"].use_custom_shape_bone_size = False - this_obj.pose.bones["neck"].custom_shape = bpy.data.objects["neck"] - this_obj.pose.bones["neck"].custom_shape_scale_xyz = (1,1,1) - this_obj.pose.bones["neck"].custom_shape_translation = (0.0,0.035,0.007) - this_obj.pose.bones["neck"].custom_shape_rotation_euler[0] = 1.5708 - - this_obj.pose.bones["foot_ik.L"].use_custom_shape_bone_size = False - this_obj.pose.bones["foot_ik.R"].use_custom_shape_bone_size = False - this_obj.pose.bones["foot_ik.L"].custom_shape = bpy.data.objects["foot1"] - this_obj.pose.bones["foot_ik.R"].custom_shape = bpy.data.objects["foot1"] - - this_obj.pose.bones["thigh_ik_target.L"].custom_shape = bpy.data.objects["primo-joint"] - this_obj.pose.bones["thigh_ik_target.R"].custom_shape = bpy.data.objects["primo-joint"] - this_obj.pose.bones["upper_arm_ik_target.R"].custom_shape = bpy.data.objects["primo-joint"] - this_obj.pose.bones["upper_arm_ik_target.L"].custom_shape = bpy.data.objects["primo-joint"] - - this_obj.pose.bones["thigh_ik_target.L"].custom_shape_scale_xyz[0] = 0.75 - this_obj.pose.bones["thigh_ik_target.L"].custom_shape_scale_xyz[1] = 0.75 - this_obj.pose.bones["thigh_ik_target.L"].custom_shape_scale_xyz[2] = 0.75 - this_obj.pose.bones["thigh_ik_target.R"].custom_shape_scale_xyz[0] = 0.75 - this_obj.pose.bones["thigh_ik_target.R"].custom_shape_scale_xyz[1] = 0.75 - this_obj.pose.bones["thigh_ik_target.R"].custom_shape_scale_xyz[2] = 0.75 - - this_obj.pose.bones["torso"].custom_shape = bpy.data.objects["pelvis2"] - this_obj.pose.bones["torso"].use_custom_shape_bone_size = False - - this_obj.pose.bones["hips"].custom_shape = bpy.data.objects["hips"] - this_obj.pose.bones["hips"].custom_shape_scale_xyz = (1,1,1) - this_obj.pose.bones["hips"].custom_shape_translation = (0.0,-0.04,0.044) - this_obj.pose.bones["hips"].custom_shape_rotation_euler[0] = 1.309 - this_obj.pose.bones["hips"].use_custom_shape_bone_size = False - - this_obj.pose.bones["chest"].custom_shape = bpy.data.objects["chest"] - this_obj.pose.bones["chest"].custom_shape_scale_xyz = (0.6,0.6,0.6) - this_obj.pose.bones["chest"].custom_shape_translation = (0.0,0.18,0.0) - this_obj.pose.bones["chest"].custom_shape_rotation_euler[0] = 1.5708 - this_obj.pose.bones["chest"].use_custom_shape_bone_size = False - - this_obj.pose.bones["shoulder.L"].custom_shape_scale_xyz = (1.6,1.6,1.6) - this_obj.pose.bones["shoulder.R"].custom_shape_scale_xyz = (1.6,1.6,1.6) - - this_obj.pose.bones["foot_heel_ik.L"].custom_shape_translation = (0.0,0.06,0.0) - this_obj.pose.bones["foot_heel_ik.R"].custom_shape_translation = (0.0,0.06,0.0) - - this_obj.pose.bones["foot_spin_ik.R"].custom_shape_translation = (0.0,-0.05,0.02) - this_obj.pose.bones["foot_spin_ik.L"].custom_shape_translation = (0.0,-0.05,0.02) - - this_obj.pose.bones["toe_ik.L"].custom_shape_translation = (0.0,0.06,0.00) - this_obj.pose.bones["toe_ik.R"].custom_shape_translation = (0.0,0.06,0.00) - this_obj.pose.bones["toe_ik.L"].custom_shape_scale_xyz = (0.781,0.781,0.350) - this_obj.pose.bones["toe_ik.R"].custom_shape_scale_xyz = (0.781,0.781,0.350) - - this_obj.pose.bones["hand_ik.R"].use_custom_shape_bone_size = False - this_obj.pose.bones["hand_ik.R"].custom_shape = bpy.data.objects["wrist"] - - this_obj.pose.bones["hand_ik.L"].use_custom_shape_bone_size = False - this_obj.pose.bones["hand_ik.L"].custom_shape = bpy.data.objects["wrist"] - - this_obj.pose.bones["palm.L"].custom_shape_scale_xyz = (1.2,1.2,1.2) - this_obj.pose.bones["palm.R"].custom_shape_scale_xyz = (1.2,1.2,1.2) - - - # Merge the armatures; go into object mode and make sure nothing is selected - bpy.ops.object.mode_set(mode='OBJECT') - bpy.ops.object.select_all(action='DESELECT') - - # Select custom face armature - face_rig_obj = bpy.data.objects.get("facerig") - if face_rig_obj: - face_rig_obj.select_set(True) - - # Select eye rig - eye_rig_obj = bpy.data.objects.get("eyerig") - if eye_rig_obj: - eye_rig_obj.select_set(True) - - # Select root rig - root_rig_obj = bpy.data.objects.get("rootrig") - if root_rig_obj: - root_rig_obj.select_set(True) - - # Select pelvis rig - pelvis_rig_obj = bpy.data.objects.get("pelvisrig") - if pelvis_rig_obj: - pelvis_rig_obj.select_set(True) - - # Select foot L rig - foot_l_rig_obj = bpy.data.objects.get("footrig-L") - if foot_l_rig_obj: - foot_l_rig_obj.select_set(True) - - # Select foot R rig - foot_r_rig_obj = bpy.data.objects.get("footrig-R") - if foot_r_rig_obj: - foot_r_rig_obj.select_set(True) - - # Select hand R rig - hand_r_rig_obj = bpy.data.objects.get("handrig-R") - if hand_r_rig_obj: - hand_r_rig_obj.select_set(True) - - # Select hand L rig - hand_l_rig_obj = bpy.data.objects.get("handrig-L") - if hand_l_rig_obj: - hand_l_rig_obj.select_set(True) - - # Select char armature - if our_char: - our_char.select_set(True) - - # Join them - bpy.ops.object.join() - - # We want to save all the VG names here, perhaps we can use them to identify weighted def bones. - bpy.context.view_layer.objects.active = bpy.data.objects.get("Body") - vertex_groups_list = [vg.name for vg in bpy.context.object.vertex_groups] - bpy.context.view_layer.objects.active = head_bone_arm_target - - # Get the intersection point of a line with a perpendicular plane - def project_line_in_space(points1, points2, axis): - x1, y1, z1 = points1 - x2, y2, z2 = points2 - - m = (y2 - y1) / (x2 - x1) if (x2 - x1) != 0 else None - b = y1 - m * x1 if m is not None else None - - if m is None: - return None - - # Intersection point - intersection_x = axis - intersection_y = m * intersection_x + b - intersection_z = z1 + (intersection_y - y1) * (z2 - z1) / (y2 - y1) - - intersection_point = (intersection_x, intersection_y, intersection_z) - return intersection_point - - # Select the object then access it's rig (its obj data) - ob = bpy.data.objects[char_name+"Rig"] - armature = ob.data - - # In edit mode, select platebone and head controller and set their parent bones. - bpy.ops.object.mode_set(mode='EDIT') - armature.edit_bones['plate-border'].parent = armature.edit_bones['head'] - armature.edit_bones['plate-settings'].parent = armature.edit_bones['head'] - - armature.edit_bones['plate-border'].head = armature.edit_bones['neck'].head.copy() - armature.edit_bones['plate-border'].tail = armature.edit_bones['neck'].tail.copy() - armature.edit_bones['plate-border'].head.x = 0.33 - armature.edit_bones['plate-border'].head.y = 0 - armature.edit_bones['plate-border'].tail.y = 0 - armature.edit_bones['plate-border'].tail.x = 0.33 - - armature.edit_bones['plate-settings'].head = armature.edit_bones['head'].head.copy() - armature.edit_bones['plate-settings'].tail = armature.edit_bones['head'].head.copy() - armature.edit_bones['plate-settings'].head.y = 0 - armature.edit_bones['plate-settings'].tail.y = 0 - armature.edit_bones['plate-settings'].head.z += 0.5 - armature.edit_bones['plate-settings'].tail.z += 0.6 - - # While here, set inherit scales as needed. - armature.edit_bones['upper_arm_parent.L'].inherit_scale="NONE" - armature.edit_bones['upper_arm_parent.R'].inherit_scale="NONE" - armature.edit_bones['thigh_parent.L'].inherit_scale="NONE" - armature.edit_bones['thigh_parent.R'].inherit_scale="NONE" - armature.edit_bones['torso-outer'].inherit_scale="AVERAGE" - armature.edit_bones['torso-inner'].inherit_scale="FULL" - armature.edit_bones['torso'].inherit_scale="FULL" - # fix the bad rolls of the torso bone - armature.edit_bones['torso'].roll = 0 - armature.edit_bones['torso-inner'].roll = 0 - armature.edit_bones['torso-outer'].roll = 0 - - armature.edit_bones['forearm_tweak-pin.R'].inherit_scale="AVERAGE" - armature.edit_bones['forearm_tweak-pin.L'].inherit_scale="AVERAGE" - armature.edit_bones['shin_tweak-pin.L'].inherit_scale="AVERAGE" - armature.edit_bones['shin_tweak-pin.R'].inherit_scale="AVERAGE" - armature.edit_bones['hand-ik-L'].inherit_scale="AVERAGE" - armature.edit_bones['hand-ik-R'].inherit_scale="AVERAGE" - armature.edit_bones['hand_ik.L'].inherit_scale="FULL" - armature.edit_bones['hand_ik.R'].inherit_scale="FULL" - - # Fixing Foot spin bone pos for chars with generated feet bones. - if not toe_bones_exist: - armature.edit_bones['foot_spin_ik.L'].head.z = 0 - armature.edit_bones['foot_spin_ik.L'].tail.z = 0 - - armature.edit_bones['foot_spin_ik.R'].head.z = 0 - armature.edit_bones['foot_spin_ik.R'].tail.z = 0 - - # SET RELATIONSHIPS as needed after bringing in new bones - armature.edit_bones['root'].parent = armature.edit_bones['root-inner'] - - armature.edit_bones['torso-outer'].parent = armature.edit_bones['MCH-torso.parent'] - armature.edit_bones['torso'].parent = armature.edit_bones['torso-inner'] - armature.edit_bones['torso_pivot.002'].parent = armature.edit_bones['torso'] - armature.edit_bones['hips'].parent = armature.edit_bones['MCH-torso_pivot.002'] - armature.edit_bones['chest'].parent = armature.edit_bones['MCH-torso_pivot.002'] - armature.edit_bones['MCH-spine.001'].parent = armature.edit_bones['MCH-torso_pivot.002'] - armature.edit_bones['MCH-spine.002'].parent = armature.edit_bones['MCH-torso_pivot.002'] - - armature.edit_bones['ik-pivot-L'].parent = armature.edit_bones['foot_ik.L'] - armature.edit_bones['ik-pivot-R'].parent = armature.edit_bones['foot_ik.R'] - armature.edit_bones['foot_spin_ik.L'].parent = armature.edit_bones['ik-target-L'] - armature.edit_bones['foot_spin_ik.R'].parent = armature.edit_bones['ik-target-R'] - - armature.edit_bones['hand-ik-L'].parent = armature.edit_bones['MCH-hand_ik.parent.L'] - armature.edit_bones['hand-ik-R'].parent = armature.edit_bones['MCH-hand_ik.parent.R'] - armature.edit_bones['hand_ik.L'].parent = armature.edit_bones['mch-hand-ik-pivot-L'] - armature.edit_bones['hand_ik.R'].parent = armature.edit_bones['mch-hand-ik-pivot-R'] - armature.edit_bones['mch-hand-ik-wrist-L'].parent = armature.edit_bones['hand_ik.L'] - armature.edit_bones['mch-hand-ik-wrist-R'].parent = armature.edit_bones['hand_ik.R'] - armature.edit_bones['MCH-upper_arm_ik_target.L'].parent = armature.edit_bones['mch-hand-ik-wrist-L'] - armature.edit_bones['MCH-upper_arm_ik_target.R'].parent = armature.edit_bones['mch-hand-ik-wrist-R'] - - armature.edit_bones['shoulder_driver.L'].parent = armature.edit_bones['ORG-spine.003'] - armature.edit_bones['shoulder_driver.R'].parent = armature.edit_bones['ORG-spine.003'] - armature.edit_bones['MCH-shoulder_follow.L'].parent = armature.edit_bones['ORG-spine.003'] - armature.edit_bones['MCH-shoulder_follow.R'].parent = armature.edit_bones['ORG-spine.003'] - armature.edit_bones['shoulder.L'].parent = armature.edit_bones['MCH-shoulder_follow.L'] - armature.edit_bones['shoulder.R'].parent = armature.edit_bones['MCH-shoulder_follow.R'] - - # RENAME imported bones - rename_bones_list = [("root", "root.002")] - rename_bones_list.append(("root-inner", "root.001")) - rename_bones_list.append(("root-outer", "root")) - - rename_bones_list.append(("torso", "torso.002")) - rename_bones_list.append(("torso-inner", "torso.001")) - rename_bones_list.append(("torso-outer", "torso")) - - rename_bones_list.append(("ik-pivot-L", "foot_ik_pivot.L")) - rename_bones_list.append(("mch-ik-pivot-L", "MCH-foot_ik_pivot.L")) - rename_bones_list.append(("ik-sub-pivot-L", "foot_ik_sub.L")) - rename_bones_list.append(("ik-target-L", "MCH-thigh_ik_target_sub.L")) - - rename_bones_list.append(("ik-pivot-R", "foot_ik_pivot.R")) - rename_bones_list.append(("mch-ik-pivot-R", "MCH-foot_ik_pivot.R")) - rename_bones_list.append(("ik-sub-pivot-R", "foot_ik_sub.R")) - rename_bones_list.append(("ik-target-R", "MCH-thigh_ik_target_sub.R")) - - rename_bones_list.append(("hand_ik.L", "hand_ik_wrist.L")) - rename_bones_list.append(("hand-ik-L", "hand_ik.L")) - rename_bones_list.append(("hand-ik-pivot-L", "hand_ik_pivot.L")) - rename_bones_list.append(("mch-hand-ik-pivot-L", "MCH-hand_ik_pivot.L")) - rename_bones_list.append(("mch-hand-ik-wrist-L", "MCH-hand_ik_wrist.L")) - - rename_bones_list.append(("hand_ik.R", "hand_ik_wrist.R")) - rename_bones_list.append(("hand-ik-R", "hand_ik.R")) - rename_bones_list.append(("hand-ik-pivot-R", "hand_ik_pivot.R")) - rename_bones_list.append(("mch-hand-ik-pivot-R", "MCH-hand_ik_pivot.R")) - rename_bones_list.append(("mch-hand-ik-wrist-R", "MCH-hand_ik_wrist.R")) - - - # TORSO POS fixing - # armature.edit_bones['torso'].roll = -1.5708 - torso_head_pos = armature.edit_bones['torso'].head.copy() - torso_tail_pos = armature.edit_bones['torso'].tail.copy() - - armature.edit_bones['torso-inner'].head = torso_head_pos - armature.edit_bones['torso-inner'].tail = torso_tail_pos - armature.edit_bones['torso-inner'].tail.y += 0.05 - - armature.edit_bones['torso-outer'].head = torso_head_pos - armature.edit_bones['torso-outer'].tail = torso_tail_pos - armature.edit_bones['torso-outer'].tail.y += 0.1 - - armature.edit_bones['torso_pivot.002'].head = torso_head_pos - armature.edit_bones['torso_pivot.002'].tail = torso_tail_pos - - armature.edit_bones['MCH-torso_pivot.002'].head = torso_head_pos - armature.edit_bones['MCH-torso_pivot.002'].tail = torso_tail_pos - armature.edit_bones['MCH-torso_pivot.002'].length -= 0.09 - - # FOOT POS fixing: Remember to use old bone names pre renaming - foot_L_z_diff = armature.edit_bones['foot_ik.L'].tail.z - armature.edit_bones['foot_spin_ik.L'].tail.z - foot_R_z_diff = armature.edit_bones['foot_ik.R'].tail.z - armature.edit_bones['foot_spin_ik.R'].tail.z - - armature.edit_bones['ik-sub-pivot-L'].head = armature.edit_bones['foot_ik.L'].head.copy() - armature.edit_bones['ik-sub-pivot-L'].tail = armature.edit_bones['foot_ik.L'].tail.copy() - - armature.edit_bones['ik-sub-pivot-R'].head = armature.edit_bones['foot_ik.R'].head.copy() - armature.edit_bones['ik-sub-pivot-R'].tail = armature.edit_bones['foot_ik.R'].tail.copy() - - armature.edit_bones['ik-pivot-L'].head = armature.edit_bones['MCH-heel.02_roll2.L'].head.copy() - armature.edit_bones['ik-pivot-L'].tail = armature.edit_bones['MCH-heel.02_roll2.L'].tail.copy() - armature.edit_bones['ik-pivot-L'].tail.y += 0.05 - - armature.edit_bones['ik-pivot-R'].head = armature.edit_bones['MCH-heel.02_roll2.R'].head.copy() - armature.edit_bones['ik-pivot-R'].tail = armature.edit_bones['MCH-heel.02_roll2.R'].tail.copy() - armature.edit_bones['ik-pivot-R'].tail.y += 0.05 - - armature.edit_bones['mch-ik-pivot-L'].head = armature.edit_bones['MCH-heel.02_roll2.L'].head.copy() - armature.edit_bones['mch-ik-pivot-L'].tail = armature.edit_bones['MCH-heel.02_roll2.L'].tail.copy() - - armature.edit_bones['mch-ik-pivot-R'].head = armature.edit_bones['MCH-heel.02_roll2.R'].head.copy() - armature.edit_bones['mch-ik-pivot-R'].tail = armature.edit_bones['MCH-heel.02_roll2.R'].tail.copy() - - armature.edit_bones['ik-target-L'].head = armature.edit_bones['foot_tweak.L'].head.copy() - armature.edit_bones['ik-target-L'].tail = armature.edit_bones['foot_tweak.L'].tail.copy() - - armature.edit_bones['ik-target-R'].head = armature.edit_bones['foot_tweak.R'].head.copy() - armature.edit_bones['ik-target-R'].tail = armature.edit_bones['foot_tweak.R'].tail.copy() - - foot_L_x_diff = armature.edit_bones['ik-sub-pivot-L'].tail.x - armature.edit_bones['foot_spin_ik.L'].tail.x - foot_R_x_diff = armature.edit_bones['ik-sub-pivot-R'].tail.x - armature.edit_bones['foot_spin_ik.R'].tail.x - - armature.edit_bones['MCH-shin_tweak-pin.parent.R'].head = armature.edit_bones['MCH-shin_ik.L'].head.copy() - armature.edit_bones['MCH-shin_tweak-pin.parent.R'].tail.z = armature.edit_bones['MCH-shin_ik.L'].tail.z - armature.edit_bones['MCH-shin_tweak-pin.parent.R'].tail.x = armature.edit_bones['MCH-shin_ik.L'].tail.x - armature.edit_bones['MCH-shin_tweak-pin.parent.R'].roll = 0 - armature.edit_bones['MCH-shin_tweak-pin.parent.R'].length = .02 - - armature.edit_bones['shin_tweak-pin.L'].head = armature.edit_bones['MCH-shin_ik.L'].head.copy() - armature.edit_bones['shin_tweak-pin.L'].tail = armature.edit_bones['MCH-shin_ik.L'].tail.copy() - armature.edit_bones['shin_tweak-pin.L'].roll = armature.edit_bones['MCH-shin_ik.L'].roll - armature.edit_bones['shin_tweak-pin.L'].length -= 0.15 - - armature.edit_bones['MCH-shin_tweak-pin.parent.R'].head = armature.edit_bones['MCH-shin_ik.R'].head.copy() - armature.edit_bones['MCH-shin_tweak-pin.parent.R'].tail.z = armature.edit_bones['MCH-shin_ik.R'].tail.z - armature.edit_bones['MCH-shin_tweak-pin.parent.R'].tail.x = armature.edit_bones['MCH-shin_ik.R'].tail.x - armature.edit_bones['MCH-shin_tweak-pin.parent.R'].roll = 0 - armature.edit_bones['MCH-shin_tweak-pin.parent.R'].length = .02 - - armature.edit_bones['shin_tweak-pin.R'].head = armature.edit_bones['MCH-shin_ik.R'].head.copy() - armature.edit_bones['shin_tweak-pin.R'].tail = armature.edit_bones['MCH-shin_ik.R'].tail.copy() - armature.edit_bones['shin_tweak-pin.R'].roll = armature.edit_bones['MCH-shin_ik.R'].roll - armature.edit_bones['shin_tweak-pin.R'].length -= 0.15 - - # HAND POS Fixing - armature.edit_bones['hand-ik-L'].head = armature.edit_bones['hand_ik.L'].head.copy() - armature.edit_bones['hand-ik-L'].tail = armature.edit_bones['hand_ik.L'].tail.copy() - armature.edit_bones['hand-ik-L'].roll = armature.edit_bones['hand_ik.L'].roll - - armature.edit_bones['hand-ik-pivot-L'].head = armature.edit_bones['hand_ik.L'].head.copy() - armature.edit_bones['hand-ik-pivot-L'].tail = armature.edit_bones['hand_ik.L'].tail.copy() - armature.edit_bones['hand-ik-pivot-L'].roll = armature.edit_bones['hand_ik.L'].roll - - armature.edit_bones['mch-hand-ik-pivot-L'].head = armature.edit_bones['hand_ik.L'].head.copy() - armature.edit_bones['mch-hand-ik-pivot-L'].tail = armature.edit_bones['hand_ik.L'].tail.copy() - armature.edit_bones['mch-hand-ik-pivot-L'].roll = armature.edit_bones['hand_ik.L'].roll - armature.edit_bones['mch-hand-ik-pivot-L'].length -= 0.03 - - armature.edit_bones['mch-hand-ik-wrist-L'].head = armature.edit_bones['hand_ik.L'].head.copy() - armature.edit_bones['mch-hand-ik-wrist-L'].tail = armature.edit_bones['hand_ik.L'].tail.copy() - armature.edit_bones['mch-hand-ik-wrist-L'].roll = armature.edit_bones['hand_ik.L'].roll - armature.edit_bones['mch-hand-ik-wrist-L'].length -= 0.04 - - armature.edit_bones['hand-ik-R'].head = armature.edit_bones['hand_ik.R'].head.copy() - armature.edit_bones['hand-ik-R'].tail = armature.edit_bones['hand_ik.R'].tail.copy() - armature.edit_bones['hand-ik-R'].roll = armature.edit_bones['hand_ik.R'].roll - - armature.edit_bones['hand-ik-pivot-R'].head = armature.edit_bones['hand_ik.R'].head.copy() - armature.edit_bones['hand-ik-pivot-R'].tail = armature.edit_bones['hand_ik.R'].tail.copy() - armature.edit_bones['hand-ik-pivot-R'].roll = armature.edit_bones['hand_ik.R'].roll - - armature.edit_bones['mch-hand-ik-pivot-R'].head = armature.edit_bones['hand_ik.R'].head.copy() - armature.edit_bones['mch-hand-ik-pivot-R'].tail = armature.edit_bones['hand_ik.R'].tail.copy() - armature.edit_bones['mch-hand-ik-pivot-R'].roll = armature.edit_bones['hand_ik.R'].roll - armature.edit_bones['mch-hand-ik-pivot-R'].length -= 0.03 - - armature.edit_bones['mch-hand-ik-wrist-R'].head = armature.edit_bones['hand_ik.R'].head.copy() - armature.edit_bones['mch-hand-ik-wrist-R'].tail = armature.edit_bones['hand_ik.R'].tail.copy() - armature.edit_bones['mch-hand-ik-wrist-R'].roll = armature.edit_bones['hand_ik.R'].roll - armature.edit_bones['mch-hand-ik-wrist-R'].length -= 0.04 - - armature.edit_bones['MCH-forearm_tweak-pin.parent.L'].head = armature.edit_bones['MCH-forearm_ik.L'].head.copy() - armature.edit_bones['MCH-forearm_tweak-pin.parent.L'].tail.z = armature.edit_bones['MCH-forearm_ik.L'].tail.z - armature.edit_bones['MCH-forearm_tweak-pin.parent.L'].tail.x = armature.edit_bones['MCH-forearm_ik.L'].tail.x - armature.edit_bones['MCH-forearm_tweak-pin.parent.L'].roll = 0 - armature.edit_bones['MCH-forearm_tweak-pin.parent.L'].length = .02 - - armature.edit_bones['forearm_tweak-pin.L'].head = armature.edit_bones['MCH-forearm_ik.L'].head.copy() - armature.edit_bones['forearm_tweak-pin.L'].tail = armature.edit_bones['MCH-forearm_ik.L'].tail.copy() - armature.edit_bones['forearm_tweak-pin.L'].roll = armature.edit_bones['MCH-forearm_ik.L'].roll - armature.edit_bones['forearm_tweak-pin.L'].length -= 0.15 - - armature.edit_bones['MCH-forearm_tweak-pin.parent.R'].head = armature.edit_bones['MCH-forearm_ik.R'].head.copy() - armature.edit_bones['MCH-forearm_tweak-pin.parent.R'].tail.z = armature.edit_bones['MCH-forearm_ik.R'].tail.z - armature.edit_bones['MCH-forearm_tweak-pin.parent.R'].tail.x = armature.edit_bones['MCH-forearm_ik.R'].tail.x - armature.edit_bones['MCH-forearm_tweak-pin.parent.R'].roll = 0 - armature.edit_bones['MCH-forearm_tweak-pin.parent.R'].length = .02 - - armature.edit_bones['forearm_tweak-pin.R'].head = armature.edit_bones['MCH-forearm_ik.R'].head.copy() - armature.edit_bones['forearm_tweak-pin.R'].tail = armature.edit_bones['MCH-forearm_ik.R'].tail.copy() - armature.edit_bones['forearm_tweak-pin.R'].roll = armature.edit_bones['MCH-forearm_ik.R'].roll - armature.edit_bones['forearm_tweak-pin.R'].length -= 0.15 - - armature.edit_bones['shoulder_driver.L'].head = project_line_in_space(armature.edit_bones['shoulder.L'].head.copy(),armature.edit_bones['shoulder.L'].tail.copy(), armature.edit_bones['hand_ik.L'].head.x) - armature.edit_bones['shoulder_driver.L'].tail = project_line_in_space(armature.edit_bones['shoulder.L'].head.copy(),armature.edit_bones['shoulder.L'].tail.copy(), armature.edit_bones['hand_ik.L'].head.x) - armature.edit_bones['shoulder_driver.L'].tail.y += 0.1 - - armature.edit_bones['shoulder_driver.R'].head = project_line_in_space(armature.edit_bones['shoulder.R'].head.copy(),armature.edit_bones['shoulder.R'].tail.copy(), armature.edit_bones['hand_ik.R'].head.x) - armature.edit_bones['shoulder_driver.R'].tail = project_line_in_space(armature.edit_bones['shoulder.R'].head.copy(),armature.edit_bones['shoulder.R'].tail.copy(), armature.edit_bones['hand_ik.R'].head.x) - armature.edit_bones['shoulder_driver.R'].tail.y += 0.1 - - armature.edit_bones['MCH-shoulder_follow.L'].head = armature.edit_bones['shoulder.L'].head.copy() - armature.edit_bones['MCH-shoulder_follow.L'].tail = armature.edit_bones['shoulder.L'].tail.copy() - - armature.edit_bones['MCH-shoulder_follow.R'].head = armature.edit_bones['shoulder.R'].head.copy() - armature.edit_bones['MCH-shoulder_follow.R'].tail = armature.edit_bones['shoulder.R'].tail.copy() - - - try: - armature.edit_bones["DEF-eye.L"].name = "+EyeBone L A01" - armature.edit_bones["DEF-eye.R"].name = "+EyeBone R A01" - - # Properly finish the parenting of the eye rig we imported! - armature.edit_bones['eyetrack'].parent = armature.edit_bones['head'] - armature.edit_bones['+EyeBone R A01.001'].parent = armature.edit_bones['head'] - armature.edit_bones['+EyeBone L A01.001'].parent = armature.edit_bones['head'] - - # Now we need to position them to the existing bones. - eye_R_head_pos = armature.edit_bones['+EyeBone R A01'].head - eye_L_head_pos = armature.edit_bones['+EyeBone L A01'].head - - - armature.edit_bones['+EyeBone R A01.001'].head = eye_R_head_pos - armature.edit_bones['+EyeBone R A01.001'].tail.x = eye_R_head_pos[0] - armature.edit_bones['+EyeBone R A01.001'].tail.y = armature.edit_bones['+EyeBone R A01'].tail.y - armature.edit_bones['+EyeBone R A01.001'].tail.z = eye_R_head_pos[2] - - armature.edit_bones['+EyeBone L A01.001'].head = eye_L_head_pos - armature.edit_bones['+EyeBone L A01.001'].tail.x = eye_L_head_pos[0] - armature.edit_bones['+EyeBone L A01.001'].tail.y = armature.edit_bones['+EyeBone L A01'].tail.y - armature.edit_bones['+EyeBone L A01.001'].tail.z = eye_L_head_pos[2] - - armature.edit_bones['eyetrack_R'].head.x = eye_R_head_pos[0] - armature.edit_bones['eyetrack_R'].head.z = eye_R_head_pos[2] - - armature.edit_bones['eyetrack_R'].tail.x = eye_R_head_pos[0] - armature.edit_bones['eyetrack_R'].tail.z = eye_R_head_pos[2] + 0.01 - - armature.edit_bones['eyetrack_L'].head.x = eye_L_head_pos[0] - armature.edit_bones['eyetrack_L'].head.z = eye_L_head_pos[2] - - armature.edit_bones['eyetrack_L'].tail.x = eye_L_head_pos[0] - armature.edit_bones['eyetrack_L'].tail.z = eye_L_head_pos[2] + 0.01 - - armature.edit_bones['eyetrack'].head.x = (eye_R_head_pos[0]+eye_L_head_pos[0])/2 - armature.edit_bones['eyetrack'].head.z = (eye_R_head_pos[2]+eye_L_head_pos[2])/2 - - armature.edit_bones['eyetrack'].tail.x = (eye_R_head_pos[0]+eye_L_head_pos[0])/2 - armature.edit_bones['eyetrack'].tail.z = armature.edit_bones['eyetrack_L'].tail.z - except: - pass - - - # Still in edit mode, select Neck/Head bone and extract the Z loc - neck_bone = armature.edit_bones['neck'] - neck_pos = neck_bone.head[2] - - if(use_head_tracker): - # Let's position our head controller bone here. We need it to match our head bone's position - head_bone = armature.edit_bones['head'] - head_pos_head2 = head_bone.head[2] - head_pos_tail2 = head_bone.tail[2] - head_pos_head1 = head_bone.head[1] - head_pos_tail1 = head_bone.tail[1] - - # Select the head controller bone and position w/ head bone's location. - head_cont_bone = armature.edit_bones['head-controller'] - head_cont_bone.head[0] = 0 - head_cont_bone.head[1] = -0.3 - head_cont_bone.head[2] = head_pos_head2 - head_cont_bone.tail[0] = 0 - head_cont_bone.tail[1] = -0.3 - head_cont_bone.tail[2] = head_pos_tail2 - - # Delete ugly lines that connect to the pole bones. - def del_bone(bone_name): - to_del = armature.edit_bones.get(bone_name) - armature.edit_bones.remove(to_del) - - del_bone("VIS_upper_arm_ik_pole.L") - del_bone("VIS_upper_arm_ik_pole.R") - del_bone("VIS_thigh_ik_pole.L") - del_bone("VIS_thigh_ik_pole.R") - - del_bone("palm.L") - del_bone("palm.R") - - # Function that validates bone name given for respective area. (if bone passes checks to be considered front) - def validate_skirt(bone_name, area): - # Below is the list of bone 'prefix's we consider valid to send into the skirt/dress lists - if bone_name.startswith("+Skirt"): - temp_name = bone_name[6:] - elif bone_name.startswith("+Hem"): - temp_name = bone_name[4:] - elif bone_name.startswith("+Overcoat"): - temp_name = bone_name[9:] - elif bone_name.startswith("+VisionPelvis"): - temp_name = bone_name[13:] - else: return False - - if area == "FRONT": - if temp_name[0] == "F": - return True - - elif area == "SIDE": - if temp_name[0] == "S": - return True - - elif area == "BACK": - if temp_name[0] == "B": - return True - - else: return False - # Certain bones with skirt naming exist with pelvis spine as parent, but theyre NOT skirt bones we want. remove them. - def trunc_bad_bones(pb, current=None): - bad = [] - if current is None: - current = pb - - current_bone = armature.edit_bones[current] - - for bone in armature.edit_bones: - if bone.parent == current_bone: - bad.append(bone.name) - bad.extend(trunc_bad_bones(pb, bone.name)) - - return bad - - list_of_bad_bones = trunc_bad_bones("DEF-spine.003") - - # Functions that loop through skirt bones (Front, Sides, Back) each return a list - def identify_children_for_skirt(pb, current=None, excluded_parent="DEF-spine.003"): - child_bones = [] - if current is None: - current = pb - - current_bone = armature.edit_bones[current] - - for bone in armature.edit_bones: - if bone.parent == excluded_parent: - continue - elif bone.parent == current_bone: - child_bones.append(bone) - child_bones.extend(identify_children_for_skirt(pb, bone.name, excluded_parent)) - - return child_bones - - parent_bone_name = "DEF-spine.001" - weird_skeletons = ["Clorinde"] - for s in weird_skeletons: - if s in char_name: - parent_bone_name = "+PelvisTwist CF A01" - - skirt_children = identify_children_for_skirt(parent_bone_name) - - def scan_skirt(area): - skirt_bones = [] - - for edit_bone in skirt_children: - if edit_bone.name not in list_of_bad_bones: - if validate_skirt(edit_bone.name, area): - skirt_bones.append(edit_bone.name) - - return skirt_bones - - # On each list, straighten the bone (Straighten on the head) - front_skirt_bones = scan_skirt("FRONT") - side_skirt_bones = scan_skirt("SIDE") - back_skirt_bones = scan_skirt("BACK") - - def zero_roll(bone_name): - this_bone = armature.edit_bones[bone_name].roll = 0 - for bone in front_skirt_bones: - zero_roll(bone) - - for bone in side_skirt_bones: - zero_roll(bone) - - for bone in back_skirt_bones: - zero_roll(bone) - # In pose mode select the rig, then select the bone - bpy.ops.object.mode_set(mode='POSE') - faceplate_arm = bpy.context.scene.objects[char_name+"Rig"] - selected_bone = faceplate_arm.pose.bones["Plate"] - - # Change the values to what we want, use neckpos to base the height off the ground. - selected_bone.location[0] = .33 - #selected_bone.location[1] = 0.9 - selected_bone.location[2] = neck_pos - selected_bone.rotation_quaternion[1] = 1 - selected_bone.scale[0] = 0.1 - selected_bone.scale[1] = 0.1 - selected_bone.scale[2] = 0.1 - - - - # Begin moving extra wgt bones to the wgt collection while discarding old collections - # 1 Root and Eye Bones - move_into_collection("eye circle","wgt") - move_into_collection("eye controller","wgt") - move_into_collection("root plate","wgt") - move_into_collection("head-control-shape","wgt") - - # 1 Face Bones - to_del_coll = bpy.data.collections.get("wgt.001") - for obj in to_del_coll.objects: - move_into_collection(obj.name,"wgt") - - # 2 Pelvis Bones - to_del_coll = bpy.data.collections.get("wgt.002") - for obj in to_del_coll.objects: - move_into_collection(obj.name,"wgt") - - # 3 feet Bones - to_del_coll = bpy.data.collections.get("wgt.003") - for obj in to_del_coll.objects: - move_into_collection(obj.name,"wgt") - - # 4 hand Bones - to_del_coll = bpy.data.collections.get("wgt.004") - for obj in to_del_coll.objects: - move_into_collection(obj.name,"wgt") - - # idk bro math is wrong delete whatever this is too - to_del_coll = bpy.data.collections.get("wgt.005") - for obj in to_del_coll.objects: - move_into_collection(obj.name,"wgt") - - # After moving into collection, delete the old empty ones. - bpy.data.collections.remove(bpy.data.collections.get("append_Root"),do_unlink=True) - bpy.data.collections.remove(bpy.data.collections.get("append_Face Plate"),do_unlink=True) - bpy.data.collections.remove(bpy.data.collections.get("append_Eyes"),do_unlink=True) - bpy.data.collections.remove(bpy.data.collections.get("append_Pelvis"),do_unlink=True) - bpy.data.collections.remove(bpy.data.collections.get("append_Foot"),do_unlink=True) - bpy.data.collections.remove(bpy.data.collections.get("append_Hand"),do_unlink=True) - - # Adding Shape Key Drivers - ourRig = char_name+"Rig" - - # Loop through skirt bones list. - - # converts deg to calc - def rad(num): - return num * (pi/180) - - # Perform more operations on number if needed. - def calc(num, cut=False): - percent = 0.8 - if cut: - return rad(num*percent) - else: return rad(num) - - # For front bones adjust number by depth - def add_const(skirt_bone, name, bone, expression, driver=True, trans_rot="ROT_X", f_min_x=calc(-1), f_max_x = calc(1), f_min_y = 0, f_max_y = 0, f_min_z = 0, f_max_z = 0, map_x='X', map_y='Y', map_z='Z', t_min_x=0, t_max_x=0, t_min_y=0, t_max_y=0, t_min_z=0, t_max_z=0): - armature = bpy.context.scene.objects[ourRig] - - this_bone = bpy.context.scene.objects[char_name+"Rig"].pose.bones[skirt_bone] - co = this_bone.constraints.new('TRANSFORM') - co.name = name - co.target = our_char - co.subtarget = bone - co.use_motion_extrapolate = True - - if driver and name != "X": - influence_driver = co.driver_add("influence").driver - # DRIVER STUFF - var = influence_driver.variables.new() - var.name = "bone" - var.type = 'TRANSFORMS' - - var.targets[0].id = armature - var.targets[0].bone_target = bone - var.targets[0].transform_space = 'LOCAL_SPACE' - var.targets[0].transform_type = trans_rot - - var2 = influence_driver.variables.new() - var2.name = "toggle" - var2.type = "SINGLE_PROP" - - var2.targets[0].id = armature - var2.targets[0].data_path = "pose.bones[\"plate-settings\"][\"Toggle Skirt Constraints\"]" - - influence_driver.type = 'SCRIPTED' - influence_driver.expression = "(" + expression + ")*toggle" - - depsgraph = bpy.context.evaluated_depsgraph_get() - depsgraph.update() - # END DRIVER STUFF - - # drivers for just the sides - elif driver and name == "X": - influence_driver = co.driver_add("influence").driver - # DRIVER STUFF - var2 = influence_driver.variables.new() - var2.name = "toggle" - var2.type = "SINGLE_PROP" - - var2.targets[0].id = armature - var2.targets[0].data_path = "pose.bones[\"plate-settings\"][\"Toggle Skirt Constraints\"]" - - influence_driver.type = 'SCRIPTED' - influence_driver.expression = "toggle" - - depsgraph = bpy.context.evaluated_depsgraph_get() - depsgraph.update() - - co.target_space = "LOCAL" - co.owner_space = "LOCAL" - co.map_from = "ROTATION" - co.map_to = "ROTATION" - - # Do transform constraint math - # MAP FROM (put in t/e block?) - co.from_min_x_rot = f_min_x - co.from_max_x_rot = f_max_x - - co.from_min_y_rot = f_min_y - co.from_max_y_rot = f_max_y - - co.from_min_z_rot = f_min_z - co.from_max_z_rot = f_max_z - - # MAP TO - co.map_to_x_from = map_x - co.to_min_x_rot = t_min_x - co.to_max_x_rot = t_max_x - - co.map_to_y_from = map_y - co.to_min_y_rot = t_min_y - co.to_max_y_rot = t_max_y - - co.map_to_z_from = map_z - co.to_min_z_rot = t_min_z - co.to_max_z_rot = t_max_z - - - def add_leg_follow_const(bone_name, area): - # skirt_bone, name, bone, f_min_x=calc(-1), f_max_x=calc(1), f_min_y=0, f_max_y=0, f_min_z=0, f_max_z=0, map_x='X', map_y='Y', map_z='Z', t_min_x=0, t_max_x=0, t_min_y=0, t_max_y=0, t_min_z=0, t_max_y=0 - - # FRONT - if area == "FRONT": - # Front Center - if " CF " in bone_name: - if bone_name[-1] == "1": - add_const(bone_name, "Left Leg", "DEF-thigh.L", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="X", map_z="X", t_min_x=calc(-0.125), t_max_x=calc(0.125), t_min_y=calc(0.5), t_max_y=calc(-0.5), t_min_z=calc(0), t_max_z=calc(0)) - add_const(bone_name, "Right Leg", "DEF-thigh.R", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="X", map_z="Z", t_min_x=calc(-0.125), t_max_x=calc(0.125), t_min_y=calc(-0.5), t_max_y=calc(0.5), t_min_z=calc(0), t_max_z=calc(0)) - - elif bone_name[-1] == "2": - add_const(bone_name, "Left Leg", "DEF-thigh.L", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="X", map_z="X", t_min_x=calc(0.125,True), t_max_x=calc(-0.125,True), t_min_y=calc(0.5,True), t_max_y=calc(-0.5,True), t_min_z=calc(-0.125,True), t_max_z=calc(0.125,True)) - add_const(bone_name, "Right Leg", "DEF-thigh.R", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="X", map_z="X", t_min_x=calc(0.125), t_max_x=calc(-0.125), t_min_y=calc(-0.5), t_max_y=calc(0.5), t_min_z=calc(0.125), t_max_z=calc(-0.125)) - - elif bone_name[-1] == "3": - add_const(bone_name, "Left Leg", "DEF-thigh.L", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="X", map_z="X", t_min_x=calc(0), t_max_x=calc(0), t_min_y=calc(0.5,True), t_max_y=calc(-0.5,True), t_min_z=calc(0.125,True), t_max_z=calc(-0.125,True)) - add_const(bone_name, "Right Leg", "DEF-thigh.R", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="X", map_z="Z", t_min_x=calc(0), t_max_x=calc(0), t_min_y=calc(-0.5,True), t_max_y=calc(0.5,True), t_min_z=calc(0), t_max_z=calc(0)) - # Front Left - elif ".L" in bone_name: - if bone_name[-3] == "1": - add_const(bone_name, "X+", "DEF-thigh.L", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="Y", map_z="Z", t_min_x=calc(-0.75,True), t_max_x=calc(0.75,True), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0), t_max_z=calc(0)) - add_const(bone_name, "X-", "DEF-thigh.L", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="Y", map_z="Z", t_min_x=calc(-0.3,True), t_max_x=calc(0.3,True), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0), t_max_z=calc(0)) - add_const(bone_name, "Z+", "DEF-thigh.L", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", f_min_x=0, f_max_x=0, f_min_z=calc(-1), f_max_z=calc(1), map_x="X", map_y="Y", map_z="Z", t_min_x=calc(0), t_max_x=calc(0), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(-0.1,True), t_max_z=calc(0.1,True)) - - elif bone_name[-3] == "2": - add_const(bone_name, "Transformation", "DEF-thigh.L", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="Y", map_z="X", t_min_x=calc(0.25,True), t_max_x=calc(-0.25,True), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0.125,True), t_max_z=calc(0.0)) - elif bone_name[-3] == "3": - add_const(bone_name, "Transformation", "DEF-thigh.L", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="Y", map_z="Z", t_min_x=calc(0.25,True), t_max_x=calc(-0.25,True), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0), t_max_z=calc(0)) - elif " L " in bone_name: - if bone_name[-1] == "1": - add_const(bone_name, "X+", "DEF-thigh.L", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="Y", map_z="Z", t_min_x=calc(-0.75,True), t_max_x=calc(0.75,True), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0), t_max_z=calc(0)) - add_const(bone_name, "X-", "DEF-thigh.L", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="Y", map_z="Z", t_min_x=calc(-0.3,True), t_max_x=calc(0.3,True), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0), t_max_z=calc(0)) - add_const(bone_name, "Z+", "DEF-thigh.L", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", f_min_x=0, f_max_x=0, f_min_z=calc(-1), f_max_z=calc(1), map_x="X", map_y="Y", map_z="Z", t_min_x=calc(0), t_max_x=calc(0), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(-0.1,True), t_max_z=calc(0.1,True)) - - elif bone_name[-1] == "2": - add_const(bone_name, "Transformation", "DEF-thigh.L", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="Y", map_z="X", t_min_x=calc(0.25,True), t_max_x=calc(-0.25,True), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0.125,True), t_max_z=calc(0.0)) - elif bone_name[-1] == "3": - add_const(bone_name, "Transformation", "DEF-thigh.L", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="Y", map_z="Z", t_min_x=calc(0.25,True), t_max_x=calc(-0.25,True), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0), t_max_z=calc(0)) - - # Front Right - elif ".R" in bone_name: - if bone_name[-3] == "1": - add_const(bone_name, "X+", "DEF-thigh.R", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="Y", map_z="Z", t_min_x=calc(-0.75,True), t_max_x=calc(0.75,True), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0), t_max_z=calc(0)) - add_const(bone_name, "X-", "DEF-thigh.R", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="Y", map_z="Z", t_min_x=calc(-0.3,True), t_max_x=calc(0.3,True), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0), t_max_z=calc(0)) - add_const(bone_name, "Z+", "DEF-thigh.R", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", trans_rot="ROT_Z", f_min_x=0, f_max_x=0, f_min_z=calc(-1), f_max_z=calc(1), map_x="X", map_y="Y", map_z="Z", t_min_x=calc(0), t_max_x=calc(0), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(-0.1), t_max_z=calc(0.1,True)) - elif bone_name[-3] == "2": - add_const(bone_name, "Transformation", "DEF-thigh.R", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="Y", map_z="X", t_min_x=calc(0.25,True), t_max_x=calc(-0.25,True), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(-0.125,True), t_max_z=calc(0)) - elif bone_name[-3] == "3": - add_const(bone_name, "Transformation", "DEF-thigh.R", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="Y", map_z="Z", t_min_x=calc(0.25,True), t_max_x=calc(-0.25,True), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0), t_max_z=calc(0)) - elif " R " in bone_name: - if bone_name[-1] == "1": - add_const(bone_name, "X+", "DEF-thigh.R", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="Y", map_z="Z", t_min_x=calc(-0.75,True), t_max_x=calc(0.75,True), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0), t_max_z=calc(0)) - add_const(bone_name, "X-", "DEF-thigh.R", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="Y", map_z="Z", t_min_x=calc(-0.3,True), t_max_x=calc(0.3,True), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0), t_max_z=calc(0)) - add_const(bone_name, "Z+", "DEF-thigh.R", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", trans_rot="ROT_Z", f_min_x=0, f_max_x=0, f_min_z=calc(-1), f_max_z=calc(1), map_x="X", map_y="Y", map_z="Z", t_min_x=calc(0), t_max_x=calc(0), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(-0.1), t_max_z=calc(0.1,True)) - elif bone_name[-1] == "2": - add_const(bone_name, "Transformation", "DEF-thigh.R", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="Y", map_z="X", t_min_x=calc(0.25,True), t_max_x=calc(-0.25,True), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(-0.125,True), t_max_z=calc(0)) - elif bone_name[-1] == "3": - add_const(bone_name, "Transformation", "DEF-thigh.R", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="Y", map_z="Z", t_min_x=calc(0.25,True), t_max_x=calc(-0.25,True), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0), t_max_z=calc(0)) - - # SIDE - elif area == "SIDE": - # Side Left - if ".L" in bone_name: - if bone_name[-3] == "1": - add_const(bone_name, "X", "DEF-thigh.L", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="Y", map_z="Z", t_min_x=calc(-0.15), t_max_x=calc(0.15), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0), t_max_z=calc(0)) - add_const(bone_name, "Z+", "DEF-thigh.L", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", trans_rot="ROT_Z",f_min_x=0,f_max_x=0,f_min_z=calc(-1),f_max_z=calc(1),map_x="X", map_y="Y", map_z="Z", t_min_x=calc(0), t_max_x=calc(0), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(-0.2), t_max_z=calc(0.2)) - - # Side Right - elif ".R" in bone_name: - if bone_name[-3] == "1": - add_const(bone_name, "X", "DEF-thigh.R", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="Y", map_z="Z", t_min_x=calc(-0.15), t_max_x=calc(0.15), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0), t_max_z=calc(0)) - add_const(bone_name, "Z+", "DEF-thigh.R", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", trans_rot="ROT_Z",f_min_x=0,f_max_x=0,f_min_z=calc(-1),f_max_z=calc(1),map_x="X", map_y="Y", map_z="Z", t_min_x=calc(0), t_max_x=calc(0), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(-0.2), t_max_z=calc(0.2)) - elif " L " in bone_name: - if bone_name[-1] == "1": - add_const(bone_name, "X", "DEF-thigh.L", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="Y", map_z="Z", t_min_x=calc(-0.15), t_max_x=calc(0.15), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0), t_max_z=calc(0)) - add_const(bone_name, "Z+", "DEF-thigh.L", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", trans_rot="ROT_Z",f_min_x=0,f_max_x=0,f_min_z=calc(-1),f_max_z=calc(1),map_x="X", map_y="Y", map_z="Z", t_min_x=calc(0), t_max_x=calc(0), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(-0.2), t_max_z=calc(0.2)) - - # Side Right - elif " R " in bone_name: - if bone_name[-1] == "1": - add_const(bone_name, "X", "DEF-thigh.R", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="Y", map_z="Z", t_min_x=calc(-0.15), t_max_x=calc(0.15), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0), t_max_z=calc(0)) - add_const(bone_name, "Z+", "DEF-thigh.R", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", trans_rot="ROT_Z",f_min_x=0,f_max_x=0,f_min_z=calc(-1),f_max_z=calc(1),map_x="X", map_y="Y", map_z="Z", t_min_x=calc(0), t_max_x=calc(0), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(-0.2), t_max_z=calc(0.2)) - - # BACK - elif area == "BACK": - # Back Left - if ".L" in bone_name: - if bone_name[-3] == "1": - add_const(bone_name, "Transformation", "DEF-thigh.L", "0.5 + 0.5 * max(0, min(1, (bone)*3))", map_x="X", map_y="Y", map_z="Z", t_min_x=calc(-0.3), t_max_x=calc(0.3), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0), t_max_z=calc(0)) - - # Back Right - if ".R" in bone_name: - if bone_name[-3] == "1": - add_const(bone_name, "Transformation", "DEF-thigh.R", "0.5 + 0.5 * max(0, min(1, (bone)*3))", map_x="X", map_y="Y", map_z="Z", t_min_x=calc(-0.3), t_max_x=calc(0.3), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0), t_max_z=calc(0)) - # Back Left - elif " L " in bone_name: - if bone_name[-1] == "1": - add_const(bone_name, "Transformation", "DEF-thigh.L", "0.5 + 0.5 * max(0, min(1, (bone)*3))", map_x="X", map_y="Y", map_z="Z", t_min_x=calc(-0.3), t_max_x=calc(0.3), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0), t_max_z=calc(0)) - - # Back Right - elif " R " in bone_name: - if bone_name[-1] == "1": - add_const(bone_name, "Transformation", "DEF-thigh.R", "0.5 + 0.5 * max(0, min(1, (bone)*3))", map_x="X", map_y="Y", map_z="Z", t_min_x=calc(-0.3), t_max_x=calc(0.3), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0), t_max_z=calc(0)) - - # Back Center - if " CB " in bone_name: - if bone_name[-1] == "1": - add_const(bone_name, "Left Leg", "DEF-thigh.L", "0.5 + 0.5 * max(0, min(1, (bone)*3))", map_x="X", map_y="X", map_z="X", t_min_x=calc(-0.125), t_max_x=calc(0.125), t_min_y=calc(0.5), t_max_y=calc(-0.5), t_min_z=calc(0), t_max_z=calc(0)) - add_const(bone_name, "Right Leg", "DEF-thigh.R", "0.5 + 0.5 * max(0, min(1, (bone)*3))", map_x="X", map_y="X", map_z="Z", t_min_x=calc(-0.125), t_max_x=calc(0.125), t_min_y=calc(-0.5), t_max_y=calc(0.5), t_min_z=calc(0), t_max_z=calc(0)) - - - for bone in front_skirt_bones: - add_leg_follow_const(bone, "FRONT") - - for bone in side_skirt_bones: - add_leg_follow_const(bone, "SIDE") - - for bone in back_skirt_bones: - add_leg_follow_const(bone, "BACK") - - # Let's go into object mode and select the three face parts to begin adding shape key drivers - bpy.ops.object.mode_set(mode='OBJECT') - bpy.ops.object.select_all(action='DESELECT') - - bpy.ops.object.select_all(action='DESELECT') - - - def makeCon(shape_key,bone_name,expression,transform): - # Get the bone object by name - armature = bpy.context.scene.objects[ourRig] - bone = armature.pose.bones[bone_name] - - # Create a driver for the shape key - shape_key = obj.data.shape_keys.key_blocks[shape_key] - driver = shape_key.driver_add("value").driver - - # Create variables for the driver - var = driver.variables.new() - var.name = "bone" - var.type = 'TRANSFORMS' - var.targets[0].id = armature - var.targets[0].bone_target = bone_name - var.targets[0].transform_space = 'LOCAL_SPACE' - var.targets[0].transform_type = transform - - # Create the scripted expression driver - driver.type = 'SCRIPTED' - driver.expression = expression - - # Update the dependencies - depsgraph = bpy.context.evaluated_depsgraph_get() - depsgraph.update() - - # BROW SHAPE KEYS - # Get the selected object with the shape key - try: - obj = bpy.data.objects.get("Brow") or (bpy.data.objects.get("Body") if meshes_joined else None) - makeCon("Brow_Down_L","Brow-L-Control","bone * -4","LOC_Y") - makeCon("Brow_Down_R","Brow-R-Control","bone * -4","LOC_Y") - makeCon("Brow_Up_L","Brow-L-Control","bone * 4","LOC_Y") - makeCon("Brow_Up_R","Brow-R-Control","bone * 4","LOC_Y") - makeCon("Brow_Trouble_L", "Brow-Trouble-L-Control", "bone * 2", "LOC_X") - makeCon("Brow_Trouble_R", "Brow-Trouble-R-Control", "bone * 2", "LOC_X") - makeCon("Brow_Smily_R", "Brow-Smily-R-Control", "bone * 2", "LOC_X") - makeCon("Brow_Smily_L", "Brow-Smily-L-Control", "bone * 2", "LOC_X") - makeCon("Brow_Angry_L", "Brow-Angry-L-Control", "bone * 2", "LOC_X") - makeCon("Brow_Angry_R", "Brow-Angry-R-Control", "bone * 2", "LOC_X") - makeCon("Brow_Shy_L", "Brow-Shy-L-Control", "bone * 2", "LOC_X") - makeCon("Brow_Shy_R", "Brow-Shy-R-Control", "bone * 2", "LOC_X") - makeCon("Brow_Squeeze_R", "Brow-R-Control", "bone * 4", "LOC_X") - makeCon("Brow_Squeeze_L", "Brow-L-Control", "bone * -4", "LOC_X") - except: - pass - - try: - # EYE SHAPE KEYS - obj = bpy.data.objects.get("Face_Eye") or (bpy.data.objects.get("Body") if meshes_joined else None) - makeCon("Eye_WinkA_L","WinkA-L-Invis","bone * -.82","LOC_Y") - makeCon("Eye_WinkA_R","WinkA-R-Invis","bone * -.82","LOC_Y") - makeCon("Eye_WinkB_L","WinkB-L-Invis","bone * -.82","LOC_Y") - makeCon("Eye_WinkB_R","WinkB-R-Invis","bone * -.82","LOC_Y") - makeCon("Eye_WinkC_L","WinkC-L-Invis","bone * -.82","LOC_Y") - makeCon("Eye_WinkC_R","WinkC-R-Invis","bone * -.82","LOC_Y") - - makeCon("Eye_Ha","Eye-Ha-Control","bone * -2.22","LOC_Y") - makeCon("Eye_Jito","Eye-Jito-Control","bone * -2.22","LOC_Y") - makeCon("Eye_Wail","Eye-Wail-Control","bone * -2.22","LOC_Y") - makeCon("Eye_Hostility","Eye-Hostility-Control","bone * -2.22","LOC_Y") - makeCon("Eye_Tired","Eye-Tired-Control","bone * -2.22","LOC_Y") - makeCon("Eye_WUp","Eye-Up-Control","bone * -2.22","LOC_Y") - makeCon("Eye_WDown","Eye-Down-Control","bone * -2.22","LOC_Y") - makeCon("Eye_Lowereyelid","Eye-LowerEyelid-Control","bone * -2.22","LOC_Y") - - # Pupils shape key drivers are set up below - obj = bpy.data.objects.get("EyeStar") or (bpy.data.objects.get("Body") if meshes_joined else None) - makeCon("EyeStar","Eye-Star-Control","1+(bone*2.23)","LOC_Y") - - except: - pass - - # MOUTH SHAPE KEYS - obj = bpy.data.objects.get("Face") or (bpy.data.objects.get("Body") if meshes_joined else None) - makeCon("Mouth_Default","Mouth-Default-Control","bone * 1.67","LOC_X") - makeCon("Mouth_A01","Mouth-Control","bone * -1.33","LOC_Y") - makeCon("Mouth_Open01","Mouth-Control","bone * 1.33","LOC_Y") - makeCon("Mouth_Smile01","Mouth-Smile1-Control","bone * 1.67","LOC_X") - makeCon("Mouth_Smile02","Mouth-Smile2-Control","bone * 1.67","LOC_X") - makeCon("Mouth_Angry01","Mouth-Angry1-Control","bone * 1.67","LOC_X") - makeCon("Mouth_Angry02","Mouth-Angry2-Control","bone * 1.67","LOC_X") - makeCon("Mouth_Angry03","Mouth-Angry3-Control","bone * 1.67","LOC_X") - makeCon("Mouth_Fury01","Mouth-Fury1-Control","bone * 1.67","LOC_X") - makeCon("Mouth_Doya01","Mouth-Doya1-Control","bone * 1.67","LOC_X") - makeCon("Mouth_Doya02","Mouth-Doya2-Control","bone * 1.67","LOC_X") - makeCon("Mouth_Pero01","Mouth-Pero1-Control","bone * 1.67","LOC_X") - makeCon("Mouth_Pero02","Mouth-Pero2-Control","bone * 1.67","LOC_X") - makeCon("Mouth_Line01","Mouth-Control","bone * 1.33","LOC_X") - makeCon("Mouth_Line02","Mouth-Control","bone * -1.33","LOC_X") - makeCon("Mouth_Neko01","Mouth-Neko1-Control","bone * 1.67","LOC_X") - - # Special drivers for pushing pupils back on blink - def makeCon2(shape_key,bn1,bn2,bn3,expression,transform): - # Get the bone object by name - armature = bpy.context.scene.objects[ourRig] - bone = armature.pose.bones[bn1] - - # Create a driver for the shape key - shape_key = obj.data.shape_keys.key_blocks[shape_key] - driver = shape_key.driver_add("value").driver - - # Create variables for the driver - var = driver.variables.new() - var.name = "invisA" - var.type = 'TRANSFORMS' - var.targets[0].id = armature - var.targets[0].bone_target = bn1 - var.targets[0].transform_space = 'LOCAL_SPACE' - var.targets[0].transform_type = transform - - # Create variables for the driver - var1 = driver.variables.new() - var1.name = "invisB" - var1.type = 'TRANSFORMS' - var1.targets[0].id = armature - var1.targets[0].bone_target = bn2 - var1.targets[0].transform_space = 'LOCAL_SPACE' - var1.targets[0].transform_type = transform - - # Create variables for the driver - var2 = driver.variables.new() - var2.name = "invisC" - var2.type = 'TRANSFORMS' - var2.targets[0].id = armature - var2.targets[0].bone_target = bn3 - var2.targets[0].transform_space = 'LOCAL_SPACE' - var2.targets[0].transform_type = transform - - # Create the scripted expression driver - driver.type = 'SCRIPTED' - driver.expression = expression - - # Update the dependencies - depsgraph = bpy.context.evaluated_depsgraph_get() - depsgraph.update() - obj = bpy.data.objects.get("Body") - try: - makeCon2("pupil-pushback-R","WinkA-R-Invis","WinkB-R-Invis","WinkC-R-Invis","max(invisA * -1.55, invisB * -1.55, invisC * -1.55)","LOC_Y") # -1.45 - makeCon2("pupil-pushback-L","WinkA-L-Invis","WinkB-L-Invis","WinkC-L-Invis","max(invisA * -1.55, invisB * -1.55, invisC * -1.55)","LOC_Y") - except: - pass - # Pupils shape key driver is set up below. Like Eye Star, the shape key has to be made FIRST before adding a driver - - if(use_head_tracker): - # Since we're still in object mode, here we can add the head pole object in the neck to track head movement - bpy.ops.object.empty_add(type='PLAIN_AXES', align='WORLD', location=(0, 0, 0), scale=(1, 1, 1)) - bpy.data.objects["Empty"].name = "Head_Pole" - bpy.data.objects["Head_Pole"].empty_display_size = 0.01 - bpy.data.objects["Head_Pole"].parent = bpy.data.objects[char_name+"Rig"] - bpy.data.objects["Head_Pole"].parent_type = "BONE" - bpy.data.objects["Head_Pole"].parent_bone = "neck" - - # Let's go into object mode and select the body for the pupil shape keys, and to control our glow sliders. - bpy.ops.object.select_all(action='DESELECT') - obj = bpy.data.objects.get("Body") - bpy.ops.object.select_all(action='DESELECT') - - try: - makeCon("pupils","Eye-Pupil-Control","bone * -2.4","LOC_Y") - except: - pass - - # Going into pose mode with our character selected. - bpy.ops.object.select_all(action='DESELECT') - our_char = bpy.data.objects.get(char_name+"Rig") - if our_char: - our_char.select_set(True) - bpy.context.view_layer.objects.active = our_char - - bpy.ops.object.mode_set(mode='POSE') - - - def add_driver_to_eyelid(): - eyelid_invis_bone = bpy.context.scene.objects[char_name+"Rig"].pose.bones["eyelid-invis-control"] - eyelid_control_driver = eyelid_invis_bone.driver_add('location', 1).driver - # Create variables for the driver - var = eyelid_control_driver.variables.new() - var.name = "bone" - var.type = 'TRANSFORMS' - var.targets[0].id = bpy.data.objects.get(ourRig) - var.targets[0].bone_target = "eyetrack" - var.targets[0].transform_space = 'LOCAL_SPACE' - var.targets[0].transform_type = "LOC_Y" - - # Create the scripted expression driver - eyelid_control_driver.type = 'SCRIPTED' - eyelid_control_driver.expression = "bone * 5" - - # Update the dependencies - depsgraph = bpy.context.evaluated_depsgraph_get() - depsgraph.update() - - try: - add_driver_to_eyelid() - except: - pass - - # Disable IK Stretching & Turn on IK Poles. Toggle manually as needed. - if disallow_leg_ik_stretch: - bpy.data.objects[char_name+"Rig"].pose.bones["thigh_parent.L"]["IK_Stretch"] = 0.0 - bpy.data.objects[char_name+"Rig"].pose.bones["thigh_parent.R"]["IK_Stretch"] = 0.0 - - if disallow_arm_ik_stretch: - bpy.data.objects[char_name+"Rig"].pose.bones["upper_arm_parent.L"]["IK_Stretch"] = 0.0 - bpy.data.objects[char_name+"Rig"].pose.bones["upper_arm_parent.R"]["IK_Stretch"] = 0.0 - - if use_arm_ik_poles: - bpy.data.objects[char_name+"Rig"].pose.bones["upper_arm_parent.L"]["pole_vector"] = 1 - bpy.data.objects[char_name+"Rig"].pose.bones["upper_arm_parent.R"]["pole_vector"] = 1 - - if use_leg_ik_poles: - bpy.data.objects[char_name+"Rig"].pose.bones["thigh_parent.L"]["pole_vector"] = 1 - bpy.data.objects[char_name+"Rig"].pose.bones["thigh_parent.R"]["pole_vector"] = 1 - - bpy.data.objects[char_name+"Rig"].pose.bones["torso"]["head_follow"] = 1.0 - bpy.data.objects[char_name+"Rig"].pose.bones["upper_arm_parent.L"]["IK_parent"] = 4 - bpy.data.objects[char_name+"Rig"].pose.bones["upper_arm_parent.R"]["IK_parent"] = 4 - - def add_shoulder_const(follow, driver, hand): - armature = bpy.context.scene.objects[ourRig] - - # make shoulder follow driver bone - this_bone = bpy.context.scene.objects[char_name+"Rig"].pose.bones[follow] - co = this_bone.constraints.new('DAMPED_TRACK') - co.target = our_char - co.subtarget = driver - - # make driver bone follow hand - drive = bpy.context.scene.objects[char_name+"Rig"].pose.bones[driver] - co2 = drive.constraints.new('COPY_LOCATION') - co2.target = our_char - co2.subtarget = hand - co2.target_space = "LOCAL_OWNER_ORIENT" - co2.owner_space = "LOCAL" - - # make driver to control influence - driver = co.driver_add("influence").driver - var = driver.variables.new() - var.name = "bone" - var.type = 'SINGLE_PROP' - - var.targets[0].id = armature - var.targets[0].data_path = "pose.bones[\"plate-settings\"][\"Toggle Shoulder Constraints\"]" - driver.type = 'SCRIPTED' - driver.expression = "(bone * 0.4)" - - depsgraph = bpy.context.evaluated_depsgraph_get() - depsgraph.update() - - - add_shoulder_const("MCH-shoulder_follow.L","shoulder_driver.L","hand-ik-L") - add_shoulder_const("MCH-shoulder_follow.R","shoulder_driver.R","hand-ik-R") - - def add_eye_bone_const(bone_name, to_bone): - this_bone = bpy.context.scene.objects[char_name+"Rig"].pose.bones[bone_name] - co = this_bone.constraints.new('COPY_ROTATION') - co.target = our_char - co.subtarget = to_bone - co.target_space = "LOCAL_OWNER_ORIENT" - co.owner_space = "LOCAL" - - try: - add_eye_bone_const("+EyeBone R A01", "+EyeBone R A01.001") - add_eye_bone_const("+EyeBone L A01", "+EyeBone L A01.001") - except: - pass - - # Let's add empty 'child of' constraints to limbs, torso and root. Ready to use in case char holds obj/stands on obj - def add_child_of(bone_name): - this_bone = bpy.context.scene.objects[char_name+"Rig"].pose.bones[bone_name] - co = this_bone.constraints.new('CHILD_OF') - - if add_child_of_constraints: - add_child_of("hand-ik-L") - add_child_of("hand-ik-R") - add_child_of("foot_ik.R") - add_child_of("foot_ik.L") - add_child_of("torso-outer") - add_child_of("root") - - - if(use_head_tracker): - - # Here we can set up the two damped track constraints to make the head follow the controller bone. - # This makes the head bone follow the controller - head_controller = bpy.context.scene.objects[char_name+"Rig"].pose.bones["head"] - co = head_controller.constraints.new('DAMPED_TRACK') - head_track_const = bpy.data.objects[char_name+"Rig"].pose.bones["head"].constraints["Damped Track"] - head_track_const.target = our_char - head_track_const.subtarget = "head-controller" - head_track_const.track_axis = "TRACK_Z" - - # This makes the controller follow the obj in the neck to keep it 'on' the head. - head_pole_cont = bpy.context.scene.objects[char_name+"Rig"].pose.bones["head-controller"] - co2 = head_pole_cont.constraints.new('DAMPED_TRACK') - head_pole_const = bpy.data.objects[char_name+"Rig"].pose.bones["head-controller"].constraints["Damped Track"] - head_pole_const.target = bpy.data.objects.get("Head_Pole") - head_pole_const.track_axis = "TRACK_NEGATIVE_Z" - - # We can now make our final bone groups look good! (Both 3.6 and 4.0 functionality.) - def assign_bone_to_group(bone_name, group_name): - # Perform old functionality to make BGs to then color. - if not is_version_4: - # Switch to object mode - bpy.ops.object.mode_set(mode='OBJECT') - - # Get the armature object - armature_obj = our_char - if not armature_obj or armature_obj.type != 'ARMATURE': - return - - # Switch to pose mode - bpy.context.view_layer.objects.active = armature_obj - bpy.ops.object.mode_set(mode='POSE') - - # Get the pose bone - pose_bone = armature_obj.pose.bones.get(bone_name) - if not pose_bone: - return - - # Get the bone group - bone_group = armature_obj.pose.bone_groups.get(group_name) - if not bone_group: - # Create a new bone group if it doesn't exist - bone_group = armature_obj.pose.bone_groups.new(name=group_name) - - # Assign the bone to the bone group - pose_bone.bone_group = bone_group - - # New 4.0 functionality: change the bone itself to the color of the group it was originally assigned to. - else: - # 4.0: Armature bones or Pose bones? - bone = bpy.context.object.pose.bones[bone_name] - - if group_name == "Root": - bone.color.palette = 'CUSTOM' - bone.color.custom.normal = (0,1,0.169) - bone.color.custom.select = (0.184,1,0.713) - bone.color.custom.active = (0.125,0.949,0.816) - elif group_name == "Torso": - bone.color.palette = 'CUSTOM' - bone.color.custom.normal = (1,0.867,0) - bone.color.custom.select = (1,0.671,0.502) - bone.color.custom.active = (0.949,0.431,0) - elif group_name == "Limbs L": - bone.color.palette = 'CUSTOM' - bone.color.custom.normal = (1,0,1) - bone.color.custom.select = (1,0.129,0.467) - bone.color.custom.active = (1,0.518,0.969) - elif group_name == "Limbs R": - bone.color.palette = 'CUSTOM' - bone.color.custom.normal = (0,0.839,1) - bone.color.custom.select = (0.227,0.357,0.902) - bone.color.custom.active = (0.035,0.333,0.878) - elif group_name == "Face": - bone.color.palette = 'CUSTOM' - bone.color.custom.normal = (1,0,0) - bone.color.custom.select = (0.506,0.902,0.078) - bone.color.custom.active = (0.094,0.714,0.878) - - # Root BG - assign_bone_to_group("root", "Root") - assign_bone_to_group("root-outer", "Root") - assign_bone_to_group("root-inner", "Root") - - # Torso BG - assign_bone_to_group("torso", "Torso") - assign_bone_to_group("torso-inner", "Torso") - assign_bone_to_group("torso-outer", "Torso") - assign_bone_to_group("torso_pivot.002", "Torso") - assign_bone_to_group("hips", "Torso") - assign_bone_to_group("chest", "Torso") - assign_bone_to_group("neck", "Torso") - assign_bone_to_group("head-controller", "Torso") - assign_bone_to_group("head", "Torso") - - # Left Arm BG - assign_bone_to_group("hand_ik.L", "Limbs L") - assign_bone_to_group("upper_arm_ik_target.L", "Limbs L") - assign_bone_to_group("shoulder.L", "Limbs L") - assign_bone_to_group("hand-ik-pivot-L", "Limbs L") - assign_bone_to_group("hand-ik-L", "Limbs L") - assign_bone_to_group("upper_arm_parent.L", "Limbs L") - assign_bone_to_group("forearm_tweak-pin.L", "Limbs L") - if not use_arm_ik_poles: - assign_bone_to_group("upper_arm_ik.L", "Limbs L") - - # Right Arm BG - assign_bone_to_group("hand_ik.R", "Limbs R") - assign_bone_to_group("upper_arm_ik_target.R", "Limbs R") - assign_bone_to_group("shoulder.R", "Limbs R") - assign_bone_to_group("hand-ik-pivot-R", "Limbs R") - assign_bone_to_group("hand-ik-R", "Limbs R") - assign_bone_to_group("upper_arm_parent.R", "Limbs R") - assign_bone_to_group("forearm_tweak-pin.R", "Limbs R") - if not use_arm_ik_poles: - assign_bone_to_group("upper_arm_ik.R", "Limbs R") - - # Left Foot BG - assign_bone_to_group("foot_ik.L", "Limbs L") - assign_bone_to_group("toe_ik.L", "Limbs L") - assign_bone_to_group("foot_spin_ik.L", "Limbs L") - assign_bone_to_group("foot_heel_ik.L", "Limbs L") - assign_bone_to_group("thigh_ik_target.L", "Limbs L") - assign_bone_to_group("ik-pivot-L", "Limbs L") - assign_bone_to_group("ik-sub-pivot-L", "Limbs L") - assign_bone_to_group("thigh_parent.L", "Limbs L") - assign_bone_to_group("shin_tweak-pin.L", "Limbs L") - if not use_leg_ik_poles: - assign_bone_to_group("thigh_ik.L", "Limbs L") - - # Right Foot BG - assign_bone_to_group("foot_ik.R", "Limbs R") - assign_bone_to_group("toe_ik.R", "Limbs R") - assign_bone_to_group("foot_spin_ik.R", "Limbs R") - assign_bone_to_group("foot_heel_ik.R", "Limbs R") - assign_bone_to_group("thigh_ik_target.R", "Limbs R") - assign_bone_to_group("ik-pivot-R", "Limbs R") - assign_bone_to_group("ik-sub-pivot-R", "Limbs R") - assign_bone_to_group("thigh_parent.R", "Limbs R") - assign_bone_to_group("shin_tweak-pin.R", "Limbs R") - if not use_leg_ik_poles: - assign_bone_to_group("thigh_ik.R", "Limbs R") - - # Face BG - assign_bone_to_group("Mouth-Control", "Face") - assign_bone_to_group("Mouth-Smile1-Control", "Face") - assign_bone_to_group("Mouth-Smile2-Control", "Face") - assign_bone_to_group("Mouth-Angry1-Control", "Face") - assign_bone_to_group("Mouth-Angry2-Control", "Face") - assign_bone_to_group("Mouth-Angry3-Control", "Face") - assign_bone_to_group("Mouth-Fury1-Control", "Face") - assign_bone_to_group("Mouth-Doya1-Control", "Face") - assign_bone_to_group("Mouth-Doya2-Control", "Face") - assign_bone_to_group("Mouth-Pero1-Control", "Face") - assign_bone_to_group("Mouth-Pero2-Control", "Face") - assign_bone_to_group("Mouth-Neko1-Control", "Face") - assign_bone_to_group("Mouth-Default-Control", "Face") - assign_bone_to_group("plate-settings", "Face") - - assign_bone_to_group("Eye-Down-Control", "Face") - assign_bone_to_group("Eye-Up-Control", "Face") - assign_bone_to_group("Eye-Jito-Control", "Face") - assign_bone_to_group("Eye-Tired-Control", "Face") - assign_bone_to_group("Eye-Hostility-Control", "Face") - assign_bone_to_group("Eye-Wail-Control", "Face") - assign_bone_to_group("Eye-LowerEyelid-Control", "Face") - assign_bone_to_group("Eye-Ha-Control", "Face") - assign_bone_to_group("Eye-WinkA-Control", "Face") - assign_bone_to_group("Eye-WinkB-Control", "Face") - assign_bone_to_group("Eye-WinkC-Control", "Face") - assign_bone_to_group("Eye-Star-Control", "Face") - assign_bone_to_group("Eye-Pupil-Control", "Face") - assign_bone_to_group("eyetrack", "Face") - assign_bone_to_group("eyetrack_L", "Face") - assign_bone_to_group("eyetrack_R", "Face") - - assign_bone_to_group("Wink-Control-R", "Face") - assign_bone_to_group("Wink-Control-L", "Face") - assign_bone_to_group("Brow-Trouble-L-Control", "Face") - assign_bone_to_group("Brow-Trouble-R-Control", "Face") - assign_bone_to_group("Brow-Shy-R-Control", "Face") - assign_bone_to_group("Brow-Shy-L-Control", "Face") - assign_bone_to_group("Brow-Angry-R-Control", "Face") - assign_bone_to_group("Brow-Angry-L-Control", "Face") - assign_bone_to_group("Brow-Smily-R-Control", "Face") - assign_bone_to_group("Brow-Smily-L-Control", "Face") - assign_bone_to_group("Brow-R-Control", "Face") - assign_bone_to_group("Brow-L-Control", "Face") - - try: - this_obj.pose.bones["eyetrack_L"].custom_shape_scale_xyz = (2,2,2) - this_obj.pose.bones["eyetrack_R"].custom_shape_scale_xyz = (2,2,2) - this_obj.pose.bones["eyetrack"].custom_shape_scale_xyz = (6.5,5,1) - except: - pass - - # Default bone group colors are ugly. We can change them. - def change_bone_group_colors(bone_group_name, color1, color2, color3): - active_bg = bpy.context.active_object.pose.bone_groups[bone_group_name] - active_bg.color_set = "CUSTOM" - active_bg.colors.normal = Color((color1)) - active_bg.colors.select = Color((color2)) - active_bg.colors.active = Color((color3)) - - if not is_version_4: - change_bone_group_colors('Root',(0,1,0.169),(0.184,1,0.713),(0.125,0.949,0.816)) - change_bone_group_colors('Torso',(1,0.867,0),(1,0.671,0.502),(0.949,0.431,0)) - change_bone_group_colors('Limbs L',(1,0,1),(1,0.129,0.467),(1,0.518,0.969)) - change_bone_group_colors('Limbs R',(0,0.839,1),(0.227,0.357,0.902),(0.035,0.333,0.878)) - change_bone_group_colors('Face',(1,0,0),(0.506,0.902,0.078),(0.094,0.714,0.878)) - - - # Automatically builds the constraint stuff for SWITCH PARENT. DO NOT FORGET TO REENABLE THE CONSTRAINTS BELOW!!!!!! - def generate_switch_parent_constraints(toggle_parent, location_of_switcher): - const = this_obj.pose.bones[toggle_parent].constraints["SWITCH PARENT"] - const.targets[0].target = bpy.data.objects[char_name+"Rig"] - const.targets[0].subtarget = "root" - - const.targets[1].target = bpy.data.objects[char_name+"Rig"] - const.targets[1].subtarget = "root.001" - - const.targets[2].target = bpy.data.objects[char_name+"Rig"] - const.targets[2].subtarget = "root.002" - - const.targets[3].target = bpy.data.objects[char_name+"Rig"] - const.targets[3].subtarget = "torso.002" - - const.targets[4].target = bpy.data.objects[char_name+"Rig"] - const.targets[4].subtarget = "chest" - - location_str = "pose.bones[\"" + location_of_switcher + "\"][\"parent_switch\"]" - - for x in range(5): - driver = const.targets[x].driver_add("weight").driver - var = driver.variables.new() - var.name = "toggle" - var.type = 'SINGLE_PROP' - var.targets[0].id = bpy.context.scene.objects[ourRig] - var.targets[0].data_path = location_str - - driver.type = 'SCRIPTED' - driver.expression = "toggle == " + str(x+1) - - depsgraph = bpy.context.evaluated_depsgraph_get() - depsgraph.update() - - # Toggle the constraint off, we HAVE to reenable it later to work!! - const.enabled = False - - - # REENABLE CONSTRAINTS BELOW - - if use_head_tracker: - generate_switch_parent_constraints("MCH-head-controller-parent","head-controller") - - # REENABLE THE CONSTRAINT BELOW. - generate_switch_parent_constraints("MCH-forearm_tweak-pin.parent.L","forearm_tweak-pin.L") - generate_switch_parent_constraints("MCH-forearm_tweak-pin.parent.R","forearm_tweak-pin.R") - generate_switch_parent_constraints("MCH-shin_tweak-pin.parent.L","shin_tweak-pin.L") - generate_switch_parent_constraints("MCH-shin_tweak-pin.parent.R","shin_tweak-pin.R") - - # For each tweak bone, we make the custom property, the constraint and driver. - def prepare_tweak_bone(tweak_bone, pin_bone): - # Make Custom Property - cust_bone = this_obj.pose.bones[tweak_bone] - cust_bone["tweak_pin"] = 0.00 - # Setting the min/max ranges: https://blender.stackexchange.com/a/258099 - id_prop = cust_bone.id_properties_ui("tweak_pin") - id_prop.update(min=0.0,max=1.0) - - # Make Constraint - con = this_obj.pose.bones[tweak_bone].constraints.new('COPY_LOCATION') - con.target = our_char - con.subtarget = pin_bone - - path_str = "pose.bones[\"" + tweak_bone+"\"][\"tweak_pin\"]" - - driver = con.driver_add("influence").driver - driver.type = 'SUM' - var = driver.variables.new() - var.name = "bone" - var.type = 'SINGLE_PROP' - var.targets[0].id = bpy.context.scene.objects[ourRig] - var.targets[0].data_path = path_str - depsgraph = bpy.context.evaluated_depsgraph_get() - depsgraph.update() - - prepare_tweak_bone("forearm_tweak.L", "forearm_tweak-pin.L") - prepare_tweak_bone("forearm_tweak.R", "forearm_tweak-pin.R") - prepare_tweak_bone("shin_tweak.L", "shin_tweak-pin.L") - prepare_tweak_bone("shin_tweak.R", "shin_tweak-pin.R") - - # To repair the now missing custom property, let's remake it. - def make_torso_custom(): - cust_bone = this_obj.pose.bones["torso-outer"] - cust_bone["torso_parent"] = 1 - id_prop = cust_bone.id_properties_ui("torso_parent") - id_prop.update(min=0,max=2) - - make_torso_custom() - - # Adjustments to positioning - this_obj.pose.bones["foot_ik.L"].custom_shape_transform = bpy.data.objects[char_name+"Rig"].pose.bones["mch-ik-pivot-L"] - this_obj.pose.bones["foot_ik.R"].custom_shape_transform = bpy.data.objects[char_name+"Rig"].pose.bones["mch-ik-pivot-R"] - this_obj.pose.bones["hand-ik-L"].custom_shape_transform = bpy.data.objects[char_name+"Rig"].pose.bones["mch-hand-ik-pivot-L"] - this_obj.pose.bones["hand-ik-R"].custom_shape_transform = bpy.data.objects[char_name+"Rig"].pose.bones["mch-hand-ik-pivot-R"] - - this_obj.pose.bones["ik-sub-pivot-L"].custom_shape_translation = (foot_L_x_diff*-1.0, 0.0, foot_L_z_diff*-1.0) - this_obj.pose.bones["ik-sub-pivot-R"].custom_shape_translation = (foot_R_x_diff*-1.0, 0.0, foot_R_z_diff*-1.0) - - - # Penultimate: Rename bones as needed - for oldname, newname in rename_bones_list: - bone = bpy.context.object.pose.bones.get(oldname) - if bone is None: - continue - bone.name = newname - - # We have to nuke the existing driver in the torso. - def nuke_old_torso_const(): - const = this_obj.pose.bones["MCH-torso.parent"].constraints - to_del = [c for c in const] - for c in to_del: - const.remove(c) - - new = const.new('ARMATURE') - new.name = 'SWITCH_PARENT' - # add target - new.targets.new() - new.targets[0].target = bpy.data.objects[char_name+"Rig"] - new.targets[0].subtarget = "root.002" - - location_str = "pose.bones[\"torso\"][\"torso_parent\"]" - - driver = new.targets[0].driver_add("weight").driver - for variable in driver.variables: - if variable.type == 'SINGLE_PROP': - variable.targets[0].data_path = location_str - - driver.expression = "var == 1" - - depsgraph = bpy.context.evaluated_depsgraph_get() - depsgraph.update() - - # Toggle the constraint off, we HAVE to reenable it later to work!! - new.enabled = False - - nuke_old_torso_const() - - # Use this to swap a variable in a constraint - def swap_const_follow_in_const(bone, constraint_type, new_var): - const = this_obj.pose.bones[bone].constraints - for c in const: - if c.type == constraint_type: - const.remove(c) - - new = const.new(constraint_type) - new.target = bpy.data.objects[char_name+"Rig"] - new.subtarget = "torso.002" - - driver = new.driver_add("influence").driver - driver.type = 'SUM' - for variable in driver.variables: - if variable.type == 'SINGLE_PROP': - variable.targets[0].data_path = new_var - - depsgraph = bpy.context.evaluated_depsgraph_get() - depsgraph.update() - - swap_const_follow_in_const("MCH-ROT-head","COPY_ROTATION","pose.bones[\"plate-settings\"][\"Head Follow\"]") - swap_const_follow_in_const("MCH-ROT-neck","COPY_ROTATION","pose.bones[\"plate-settings\"][\"Neck Follow\"]") - - # Delete all existing bone collections, and make new ones. - if is_version_4: - armature = bpy.context.object.data - collections = armature.collections - for coll in collections: - collections.remove(coll) - - collections.new("Tweaks") - collections.new("Pivots & Pins") - collections.new("Offsets") - collections.new("Face") - collections.new("Torso (IK)") - collections.new("Torso (FK)") - collections.new("Fingers") - collections.new("Fingers (Detail)") - collections.new("Arm.L (IK)") - collections.new("Arm.R (IK)") - collections.new("Arm.L (FK)") - collections.new("Arm.R (FK)") - collections.new("Leg.L (IK)") - collections.new("Leg.R (IK)") - collections.new("Leg.L (FK)") - collections.new("Leg.R (FK)") - collections.new("Root") - collections.new("Physics") - collections.new("Cage") - collections.new("Other") - - for bone in armature.bones: - collections["Other"].assign(bone) - - #Thanks Enthralpy for the code to ensure that the arm/leg "gears" are moveable. - for bone in ['thigh_parent.L', 'thigh_parent.R', 'upper_arm_parent.L', 'upper_arm_parent.R']: - this_obj.pose.bones[bone].custom_shape_transform = None - this_obj.pose.bones[bone].lock_location[0] = False - this_obj.pose.bones[bone].lock_location[1] = False - this_obj.pose.bones[bone].lock_location[2] = False - this_obj.pose.bones[bone].lock_rotation_w = False - this_obj.pose.bones[bone].lock_rotation[0] = False - this_obj.pose.bones[bone].lock_rotation[1] = False - this_obj.pose.bones[bone].lock_rotation[2] = False - this_obj.pose.bones[bone].lock_scale[0] = False - this_obj.pose.bones[bone].lock_scale[1] = False - this_obj.pose.bones[bone].lock_scale[2] = False - - # Customize bones - this_obj.pose.bones[bone].custom_shape = bpy.data.objects["setting-circle"] - this_obj.pose.bones[bone].custom_shape_scale_xyz=(0.5,0.5,0.5) - this_obj.pose.bones[bone].use_custom_shape_bone_size = False - - if "upper_arm" in bone: - if ".L" in bone: - this_obj.pose.bones[bone].custom_shape_translation=(-0.05,0.0,0.0) - this_obj.pose.bones[bone].custom_shape_rotation_euler=(0,-1.5708,0) - this_obj.pose.bones[bone].custom_shape_transform = this_obj.pose.bones["MCH-upper_arm_parent_widget.L"] - else: - this_obj.pose.bones[bone].custom_shape_translation=(0.05,0.0,0.0) - this_obj.pose.bones[bone].custom_shape_rotation_euler=(0,-1.5708,0) - this_obj.pose.bones[bone].custom_shape_transform = this_obj.pose.bones["MCH-upper_arm_parent_widget.R"] - else: - if ".L" in bone: - this_obj.pose.bones[bone].custom_shape_translation=(0.1,0,0) - this_obj.pose.bones[bone].custom_shape_rotation_euler=(-0.0820305, -1.5708, 0) - this_obj.pose.bones[bone].custom_shape_transform = this_obj.pose.bones["MCH-thigh_parent_widget.L"] - else: - this_obj.pose.bones[bone].custom_shape_translation=(-0.1,0,0) - this_obj.pose.bones[bone].custom_shape_rotation_euler=(-0.0820305, 1.5708, 0) - this_obj.pose.bones[bone].custom_shape_transform = this_obj.pose.bones["MCH-thigh_parent_widget.R"] - - # ENABLE CONSTRAINTS AGAIN HERE - if use_head_tracker: - this_obj.pose.bones["MCH-head-controller-parent"].constraints[0].enabled = True - this_obj.pose.bones["MCH-forearm_tweak-pin.parent.L"].constraints[0].enabled = True - this_obj.pose.bones["MCH-forearm_tweak-pin.parent.R"].constraints[0].enabled = True - this_obj.pose.bones["MCH-shin_tweak-pin.parent.L"].constraints[0].enabled = True - this_obj.pose.bones["MCH-shin_tweak-pin.parent.R"].constraints[0].enabled = True - this_obj.pose.bones["MCH-torso.parent"].constraints[0].enabled = True - - # Deselect everything, we're done. - for bone in bpy.context.active_object.pose.bones: - bone.bone.select = False - - # EDITING ui.py TEXT FILE -------------------------------------------- - rig_file = bpy.data.texts[original_name+'_ui.py'] # Rig script for this char in question - - # Convert it to text - rig_text = rig_file.as_string() - complete_rig_text = rig_text - # My disclaimer, out of respect for modifying Rigify core's script - rig_text_disclaimer = "\n# This RigUI script has been modified by Llama for use with Genshin Impact characters using a custom made rig. Any issues arising as a result of these modifications are my own fault and are not indicitive of Rigify's original functionalities. \n# Rigify's writers bare no responsibility for issues/errors made here. Additionally, these modifications have been made for the sole reason of improving the custom made rigs for Genshin Impact characters, meaning that\n# attempting to use this script elsewhere for characters/models/skeletons it was NOT intended to be used with, could yield improper or erroneous results - of which neither Rigify's development team nor I, am responsible for. \n\n# Otherwise, if you are seeing this disclaimer with a Genshin Impact character made with the proper addons, run this as needed. (Such as after appending to build the rig layers)\n# Do NOT however, attempt to use this rig in another version of blender than what it was made in. (3.6.X rigs will NOT work adequately in 4.X or beyond; and 4.X rigs will not work in previous versions before 4.0)\n" - - # MODIFICATIONS to the text file are made here: - # Get the ID of this char's rig ui script. - rig_char_id = rig_text.split("rig_id = \"")[1].split("\"")[0] - - def make_layer_str(text, layer, version): - string3 = "row.prop(context.active_object.data, 'layers', index="+str(layer)+", toggle=True, text='"+text+"')" - string4 = "row.prop(collection[\""+text+"\"], 'is_visible', toggle=True, text='"+text+"')" - - if version == 4: - return string4 - else: - return string3 - - def layers_to_generate(vers): - str = "\n row=col.row()\n "+make_layer_str("Tweaks", 2, vers)+"\n row=col.row()\n "+make_layer_str("Pivots & Pins", 19, vers)+"\n row = col.row()\n "+make_layer_str("Offsets", 26, vers)+"\n row = col.row()\n row.separator()\n row = col.row()\n row.separator()\n row = col.row()\n "+make_layer_str("Face", 0, vers)+"\n row = col.row()\n "+make_layer_str("Torso (IK)", 3, vers)+"\n row = col.row()\n "+make_layer_str("Torso (FK)",4,vers)+"\n row = col.row()\n "+make_layer_str("Fingers", 5, vers)+"\n row = col.row()\n "+make_layer_str("Fingers (Detail)", 6, vers)+"\n row = col.row()\n "+make_layer_str("Arm.L (IK)", 7, vers)+"\n "+make_layer_str("Arm.R (IK)", 10, vers)+"\n row = col.row()\n "+make_layer_str("Arm.L (FK)", 8, vers)+"\n "+make_layer_str("Arm.R (FK)", 11, vers)+"\n row = col.row()\n "+make_layer_str("Leg.L (IK)", 13, vers)+"\n "+make_layer_str("Leg.R (IK)", 16, vers)+"\n row = col.row()\n "+make_layer_str("Leg.L (FK)", 14, vers)+"\n "+make_layer_str("Leg.R (FK)", 17, vers)+"\n row = col.row()\n row.separator()\n row = col.row()\n row.separator()\n row = col.row()\n "+make_layer_str("Root", 28, vers)+"\n row = col.row()\n "+make_layer_str("Physics", 20, vers)+"\n row = col.row()\n "+make_layer_str("Cage", 24, vers)+"\n "+make_layer_str("Other", 25, vers) - - return str - - # Function to add layer to rigUI. This should add it to both 3.6 and 4.0 versions of the UI. - def generate_rig_layers(): - # Add the physics button to the UI # text=v_str+" rig for " + char_name - rig_add_layer_code = "\n layout = self.layout\n col = layout.column()\n row = col.row()\n v_str = \""+bpy.app.version_string+"\"\n if not v_str[0] == \"4\" and bpy.app.version_string[0] == \"3\":\n row.label(text=v_str+\" rig for "+char_name.split("Costume")[0]+"\")\n "+layers_to_generate(3)+"\n elif v_str[0] == \"4\" and bpy.app.version_string[0] == \"4\":\n row.label(text=v_str+\" rig for "+char_name.split("Costume")[0]+"\")\n # If you have duplicate armatures of the same character (if you see .001 or similar) in one scene,\n # Please change the name below to what it is in the Outliner so that you can rig all your characters :)\n # (It's the green person symbol in your rig)\n collection = bpy.data.armatures[\""+original_name+"\"].collections\n "+layers_to_generate(4)+"\n else:\n row.label(text=\"ERROR: Version mismatch!\")\n row = col.row()\n row.label(text=\"Your rig was made in a version of Blender/Goo Engine that is not compatible!\")\n row = col.row()\n row.label(text=\"Please remake your rig for this version!\")" - cut_rig_layer = rig_text.split("class RigLayers(bpy.types.Panel):") - separate_draw_func = cut_rig_layer[1].split("def draw(self, context):") - separate_draw_end = separate_draw_func[1].split("def register():") - - merged_layer_code = cut_rig_layer[0]+"class RigLayers(bpy.types.Panel):"+separate_draw_func[0]+"def draw(self, context):"+rig_add_layer_code+"\ndef register():"+separate_draw_end[1] - - return merged_layer_code - - complete_rig_text = generate_rig_layers() - - # These functions make it easy to quickly write to the text file. Use as needed. - def generate_string_for_limb_pin(pin_bone, gear_bone, tweak_bone, text): - str = "\n if is_selected({'"+pin_bone+"'}):\n layout.prop(pose_bones['"+tweak_bone+"'], '[\"tweak_pin\"]', text='"+text+"', slider=True)\n if is_selected({'"+gear_bone+"'}):\n layout.prop(pose_bones['"+tweak_bone+"'], '[\"tweak_pin\"]', text='"+text+"', slider=True)" - return str - - def generate_string_for_parent_switch(bone): - str = "\n if is_selected({'"+bone+"'}):\n group1 = layout.row(align=True)\n group2 = group1.split(factor=0.75, align=True)\n props = group2.operator('pose.rigify_switch_parent_"+rig_char_id+"\', text=\'Parent Switch\', icon=\'DOWNARROW_HLT\')\n props.bone = \'"+bone+"\'\n props.prop_bone = \'"+bone+"\'\n props.prop_id=\'parent_switch\'\n props.parent_names = '[\"None\", \"root\", \"root.001\", \"root.002\", \"torso\", \"chest\"]'\n props.locks = (False, False, False)\n group2.prop(pose_bones['"+bone+"'], '[\"parent_switch\"]', text='')\n props = group1.operator('pose.rigify_switch_parent_bake_"+rig_char_id+"', text='', icon='ACTION_TWEAK')\n props.bone = '"+bone+"'\n props.prop_bone='"+bone+"'\n props.prop_id='parent_switch'\n props.parent_names='[\"None\", \"root\", \"root.001\", \"root.002\", \"torso\", \"chest\"]'\n props.locks = (False, False, False)" - return str - # Used for already existing bones (torso and limbs) - def generate_string_for_ik_switch(bone, prop1, prop2): - str = "\n if is_selected({'"+bone+"'}):\n group1 = layout.row(align=True)\n group2 = group1.split(factor=0.75, align=True)\n props = group2.operator('pose.rigify_switch_parent_"+rig_char_id+"\', text=\'Parent Switch\', icon=\'DOWNARROW_HLT\')\n props.bone = \'"+prop1+"\'\n props.prop_bone = \'"+prop2+"\'\n props.prop_id=\'IK_parent\'\n props.parent_names = '[\"None\", \"root\", \"root.001\", \"root.002\", \"torso\", \"chest\"]'\n props.locks = (False, False, False)\n group2.prop(pose_bones['"+prop2+"'], '[\"IK_parent\"]', text='')\n props = group1.operator('pose.rigify_switch_parent_bake_"+rig_char_id+"', text='', icon='ACTION_TWEAK')\n props.bone = '"+prop1+"'\n props.prop_bone='"+prop2+"'\n props.prop_id='IK_parent'\n props.parent_names='[\"None\", \"root\", \"root.001\", \"root.002\", \"torso\", \"chest\"]'\n props.locks = (False, False, False)" - return str - - # because rigify makes the rig ui before i get to it, we have to change this stuff for the torso sliders below. - def torso_str(): - torso="\n props.bone = 'torso.002'\n props.prop_bone = 'torso.002'\n props.prop_id = 'torso_parent'\n props.parent_names = '[\"None\", \"Root\"]'\n props.locks = (False, False, False)\n group2.prop(pose_bones['torso.002'], '[\"torso_parent\"]', text='')\n props = group1.operator('pose.rigify_switch_parent_bake_"+rig_char_id+"', text='', icon='ACTION_TWEAK')\n props.bone = 'torso.002'\n props.prop_bone = 'torso.002'\n props.prop_id = 'torso_parent'\n props.parent_names = '[\"None\", \"Root\"]'\n props.locks = (False, False, False)" - return torso - - def torso_repair(): - cut = complete_rig_text.split("props = group2.operator('pose.rigify_switch_parent_"+rig_char_id+"', text='Torso Parent', icon='DOWNARROW_HLT')") - second_str = "if is_selected({'foot_fk.L', 'foot_ik.L', 'thigh_ik_target.L', 'foot_tweak.L', 'shin_tweak.L', 'foot_heel_ik.L', 'thigh_ik.L', 'VIS_thigh_ik_pole.L', 'toe_fk.L', 'shin_fk.L', 'thigh_parent.L', 'foot_spin_ik.L', 'thigh_fk.L', 'toe_ik.L', 'thigh_tweak.L', 'thigh_tweak.L.001', 'shin_tweak.L.001'}):" - second_half = cut[1] - new_cut = second_half.split(second_str) - final = new_cut[1] - - merged_text = cut[0]+"props = group2.operator('pose.rigify_switch_parent_"+rig_char_id+"', text='Torso Parent', icon='DOWNARROW_HLT')"+torso_str()+second_str+final - - return merged_text - - # give this a position in the text file (a string to look for), after that position it'll add the text passed in - def splice_into_text(divider, text): - split = complete_rig_text.split(divider) - return split[0]+divider+text+split[1] - - # If head controller, add the rig main controls for it. - if use_head_tracker: - complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_parent_switch("head-controller")) - - # Make the limb edits - # Below is the emergency cut for the torso repair. (WHY rigify?!?!?) - - #complete_rig_text = complete_rig_text.replace("props.bone = 'torso'","props.bone = 'torso.002'").replace("props.prop_bone = 'torso'","props.prop_bone = 'torso.002'").replace("group2.prop(pose_bones['torso'], '[\"torso_parent\"]', text='')","group2.prop(pose_bones['torso.002'], '[\"torso_parent\"]', text='')") - - complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_parent_switch("forearm_tweak-pin.L")) - complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_limb_pin("forearm_tweak-pin.L","upper_arm_parent.L","forearm_tweak.L","Elbow Pin")) - complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_parent_switch("forearm_tweak-pin.R")) - complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_limb_pin("forearm_tweak-pin.R","upper_arm_parent.R","forearm_tweak.R","Elbow Pin")) - - complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_ik_switch("hand_ik_pivot.L","hand_ik.L","upper_arm_parent.L")) - complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_ik_switch("hand_ik_pivot.R","hand_ik.R","upper_arm_parent.R")) - complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_ik_switch("foot_ik_pivot.L","foot_ik.L","thigh_parent.L")) - complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_ik_switch("foot_ik_pivot.R","foot_ik.R","thigh_parent.R")) - - - complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_parent_switch("shin_tweak-pin.L")) - complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_limb_pin("shin_tweak-pin.L","thigh_parent.L","shin_tweak.L","Knee Pin")) - complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_parent_switch("shin_tweak-pin.R")) - complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_limb_pin("shin_tweak-pin.R","thigh_parent.R","shin_tweak.R","Knee Pin")) - - # Clear the text from the text block, reassemble it as needed with strings and modifications. - rig_file.clear() - rig_file.write(complete_rig_text) - rig_file.write(rig_text_disclaimer) - - - # After all text block modifications, run the new edited script. - ctx = bpy.context.copy() - ctx['edit_text'] = rig_file - with bpy.context.temp_override(edit_text=rig_file): - bpy.ops.text.run_script() - - # DONE MODIFYING ui.py FILE -------------------------------------------- - - # Post modification, Adjustment of bone layers/collections. - if not is_version_4: - for x in range(29): - if x>0: - bpy.context.object.data.layers[x] = False - - # Disable/Enable Rig UI layers we care about - bpy.context.object.data.layers[0] = True - bpy.context.object.data.layers[3] = True - bpy.context.object.data.layers[4] = False - bpy.context.object.data.layers[5] = True - bpy.context.object.data.layers[6] = False - bpy.context.object.data.layers[7] = True - bpy.context.object.data.layers[8] = False - bpy.context.object.data.layers[10] = True - bpy.context.object.data.layers[11] = False - bpy.context.object.data.layers[13] = True - bpy.context.object.data.layers[14] = False - bpy.context.object.data.layers[16] = True - bpy.context.object.data.layers[17] = False - bpy.context.object.data.layers[28] = True - bpy.context.object.data.layers[26] = True - else: - bpy.context.object.data.collections["Tweaks"].is_visible = False - bpy.context.object.data.collections["Pivots & Pins"].is_visible = False - bpy.context.object.data.collections["Torso (FK)"].is_visible = False - bpy.context.object.data.collections["Fingers (Detail)"].is_visible = False - bpy.context.object.data.collections["Arm.L (FK)"].is_visible = False - bpy.context.object.data.collections["Arm.R (FK)"].is_visible = False - bpy.context.object.data.collections["Leg.L (FK)"].is_visible = False - bpy.context.object.data.collections["Leg.R (FK)"].is_visible = False - bpy.context.object.data.collections["Physics"].is_visible = False - bpy.context.object.data.collections["Cage"].is_visible = False - bpy.context.object.data.collections["Other"].is_visible = False - - # Send the given bone to its new location for either version. Adjusted for actual layer num. - # MOVING OF BONES BELOW ------------------------------- - def bone_to_layer(bone, layer, collection, second_coll="None"): - arm = bpy.context.object - if bone in arm.data.bones: - if is_version_4: - if collection == "Other": - bpy.context.object.data.collections[collection].assign(bpy.context.object.data.bones[bone]) - else: - bpy.context.object.data.collections[collection].assign(bpy.context.object.data.bones[bone]) - bpy.context.object.data.collections["Other"].unassign(bpy.context.object.data.bones[bone]) - if second_coll != "None": - bpy.context.object.data.collections[second_coll].assign(bpy.context.object.data.bones[bone]) - else: - move_bone(bone,layer) - - # Since we've looped through ever 4.0 bone to place in 'other' above, we'll have to do so as well for 3.6 - if not is_version_4: - for bone in bpy.context.active_object.pose.bones: - bone_to_layer(bone.name, 25, "Other") - - loop_arm = bpy.context.object.data - for bone in loop_arm.bones: - if "tweak" in bone.name and "MCH" not in bone.name and "pin" not in bone.name: - bone_to_layer(bone.name, 2, "Tweaks") - - # Moving to Tweaks (werent catched in loop) - bone_to_layer("tweak_spine", 2, "Tweaks") - bone_to_layer("tweak_spine.001", 2, "Tweaks") - bone_to_layer("tweak_spine.002", 2, "Tweaks") - bone_to_layer("tweak_spine.003", 2, "Tweaks") - bone_to_layer("tweak_spine.004", 2, "Tweaks") - bone_to_layer("tweak_spine.005", 2, "Tweaks") - # MOVING PIVOTS AND PINS - bone_to_layer("torso_pivot.002", 19, "Pivots & Pins") - bone_to_layer("forearm_tweak-pin.L", 19, "Pivots & Pins") - bone_to_layer("hand_ik_pivot.L", 19, "Pivots & Pins") - bone_to_layer("hand_ik_pivot.R", 19, "Pivots & Pins") - bone_to_layer("forearm_tweak-pin.R", 19, "Pivots & Pins") - bone_to_layer("shin_tweak-pin.L", 19, "Pivots & Pins") - bone_to_layer("shin_tweak-pin.R", 19, "Pivots & Pins") - bone_to_layer("foot_ik_pivot.L", 19, "Pivots & Pins") - bone_to_layer("foot_ik_pivot.R", 19, "Pivots & Pins") - - # MOVING FACE - bone_to_layer("plate-settings", 0, "Face") - bone_to_layer("plate-border", 0, "Face") - bone_to_layer("Plate", 0, "Face") - bone_to_layer("eyetrack", 0, "Face") - if use_head_tracker: - bone_to_layer("head-controller", 0, "Face") - else: - bone_to_layer("head-controller", 25, "Other") - bone_to_layer("eyetrack_L", 0, "Face") - bone_to_layer("eyetrack_R", 0, "Face") - - # Disable selection of face bone - selected_bone = faceplate_arm.pose.bones["Plate"] - selected_bone.bone.hide_select = True - - bone_to_layer("Brow-Trouble-R-Control", 0, "Face") - bone_to_layer("Brow-Trouble-L-Control", 0, "Face") - bone_to_layer("Brow-Shy-R-Control", 0, "Face") - bone_to_layer("Brow-Shy-L-Control", 0, "Face") - bone_to_layer("Brow-Angry-R-Control", 0, "Face") - bone_to_layer("Brow-Angry-L-Control", 0, "Face") - bone_to_layer("Brow-Smily-R-Control", 0, "Face") - bone_to_layer("Brow-Smily-L-Control", 0, "Face") - bone_to_layer("Brow-R-Control", 0, "Face") - bone_to_layer("Brow-L-Control", 0, "Face") - - bone_to_layer("Eye-Up-Control", 0, "Face") - bone_to_layer("Eye-Tired-Control", 0, "Face") - bone_to_layer("Eye-Wail-Control", 0, "Face") - bone_to_layer("Eye-Ha-Control", 0, "Face") - bone_to_layer("Wink-Control-R", 0, "Face") - bone_to_layer("Eye-WinkA-Control", 0, "Face") - bone_to_layer("Eye-WinkB-Control", 0, "Face") - bone_to_layer("Eye-WinkC-Control", 0, "Face") - bone_to_layer("Wink-Control-L", 0, "Face") - bone_to_layer("Eye-Down-Control", 0, "Face") - bone_to_layer("Eye-Jito-Control", 0, "Face") - bone_to_layer("Eye-Hostility-Control", 0, "Face") - bone_to_layer("Eye-LowerEyelid-Control", 0, "Face") - bone_to_layer("Eye-Star-Control", 0, "Face") - bone_to_layer("Eye-Pupil-Control", 0, "Face") - - bone_to_layer("Mouth-Control", 0, "Face") - bone_to_layer("Mouth-Smile1-Control", 0, "Face") - bone_to_layer("Mouth-Smile2-Control", 0, "Face") - bone_to_layer("Mouth-Angry1-Control", 0, "Face") - bone_to_layer("Mouth-Angry2-Control", 0, "Face") - bone_to_layer("Mouth-Angry3-Control", 0, "Face") - bone_to_layer("Mouth-Fury1-Control", 0, "Face") - bone_to_layer("Mouth-Doya1-Control", 0, "Face") - bone_to_layer("Mouth-Doya2-Control", 0, "Face") - bone_to_layer("Mouth-Pero1-Control", 0, "Face") - bone_to_layer("Mouth-Pero2-Control", 0, "Face") - bone_to_layer("Mouth-Neko1-Control", 0, "Face") - bone_to_layer("Mouth-Default-Control", 0, "Face") - - # Moving Torso - bone_to_layer("head", 3, "Torso (IK)") - bone_to_layer("neck", 3, "Torso (IK)") - bone_to_layer("chest", 3, "Torso (IK)") - bone_to_layer("torso", 3, "Torso (IK)") - bone_to_layer("torso.001", 26, "Offsets") - bone_to_layer("torso.002", 26, "Offsets") - bone_to_layer("hips", 3, "Torso (IK)") - - bone_to_layer("spine_fk.003", 4, "Torso (FK)") - bone_to_layer("spine_fk.002", 4, "Torso (FK)") - bone_to_layer("spine_fk.001", 4, "Torso (FK)") - bone_to_layer("spine_fk", 4, "Torso (FK)") - - # Moving Fingers - bone_to_layer("thumb.01_master.L", 5, "Fingers") - bone_to_layer("thumb.01_master.R", 5, "Fingers") - bone_to_layer("f_index.01_master.L", 5, "Fingers") - bone_to_layer("f_index.01_master.R", 5, "Fingers") - bone_to_layer("f_middle.01_master.L", 5, "Fingers") - bone_to_layer("f_middle.01_master.R", 5, "Fingers") - bone_to_layer("f_ring.01_master.L", 5, "Fingers") - bone_to_layer("f_ring.01_master.R", 5, "Fingers") - bone_to_layer("f_pinky.01_master.L", 5, "Fingers") - bone_to_layer("f_pinky.01_master.R", 5, "Fingers") - - bone_to_layer("thumb.01.L", 6, "Fingers (Detail)") - bone_to_layer("thumb.01.R", 6, "Fingers (Detail)") - bone_to_layer("thumb.02.L", 6, "Fingers (Detail)") - bone_to_layer("thumb.02.R", 6, "Fingers (Detail)") - bone_to_layer("thumb.03.L", 6, "Fingers (Detail)") - bone_to_layer("thumb.03.R", 6, "Fingers (Detail)") - bone_to_layer("thumb.01.L.001", 6, "Fingers (Detail)") - bone_to_layer("thumb.01.R.001", 6, "Fingers (Detail)") - bone_to_layer("f_index.01.L", 6, "Fingers (Detail)") - bone_to_layer("f_index.01.R", 6, "Fingers (Detail)") - bone_to_layer("f_index.02.L", 6, "Fingers (Detail)") - bone_to_layer("f_index.02.R", 6, "Fingers (Detail)") - bone_to_layer("f_index.03.L", 6, "Fingers (Detail)") - bone_to_layer("f_index.03.R", 6, "Fingers (Detail)") - bone_to_layer("f_index.01.L.001", 6, "Fingers (Detail)") - bone_to_layer("f_index.01.R.001", 6, "Fingers (Detail)") - bone_to_layer("f_middle.01.L", 6, "Fingers (Detail)") - bone_to_layer("f_middle.01.R", 6, "Fingers (Detail)") - bone_to_layer("f_middle.02.L", 6, "Fingers (Detail)") - bone_to_layer("f_middle.02.R", 6, "Fingers (Detail)") - bone_to_layer("f_middle.03.L", 6, "Fingers (Detail)") - bone_to_layer("f_middle.03.R", 6, "Fingers (Detail)") - bone_to_layer("f_middle.01.L.001", 6, "Fingers (Detail)") - bone_to_layer("f_middle.01.R.001", 6, "Fingers (Detail)") - bone_to_layer("f_ring.01.L", 6, "Fingers (Detail)") - bone_to_layer("f_ring.01.R", 6, "Fingers (Detail)") - bone_to_layer("f_ring.02.L", 6, "Fingers (Detail)") - bone_to_layer("f_ring.02.R", 6, "Fingers (Detail)") - bone_to_layer("f_ring.03.L", 6, "Fingers (Detail)") - bone_to_layer("f_ring.03.R", 6, "Fingers (Detail)") - bone_to_layer("f_ring.01.L.001", 6, "Fingers (Detail)") - bone_to_layer("f_ring.01.R.001", 6, "Fingers (Detail)") - bone_to_layer("f_pinky.01.L", 6, "Fingers (Detail)") - bone_to_layer("f_pinky.01.R", 6, "Fingers (Detail)") - bone_to_layer("f_pinky.02.L", 6, "Fingers (Detail)") - bone_to_layer("f_pinky.02.R", 6, "Fingers (Detail)") - bone_to_layer("f_pinky.03.L", 6, "Fingers (Detail)") - bone_to_layer("f_pinky.03.R", 6, "Fingers (Detail)") - bone_to_layer("f_pinky.01.L.001", 6, "Fingers (Detail)") - bone_to_layer("f_pinky.01.R.001", 6, "Fingers (Detail)") - - # Pass in a list, all of those bones will be moved accordingly. - def fast_bone_move(bone_list, layer, collection): - for bone in bone_list: - bone_to_layer(bone, layer, collection) - - # Refactoring old bone move functionalities - list_move_to_other = ["+UpperArmTwistA02.L","+UpperArmTwistA01.L","+UpperArmTwistA01.R","+UpperArmTwistA02.R","eye.R","eye.L","+ToothBone D A01","+ToothBone U A01","+ToothBone A A01"] - fast_bone_move(list_move_to_other, 25, "Other") - - if toe_bones_exist: - bone_to_layer("toe_ik.L", 13, "Leg.L (IK)") - bone_to_layer("toe_ik.R", 16, "Leg.R (IK)") - else: - bone_to_layer("toe_ik.L", 25, "Other") - bone_to_layer("toe_ik.R", 25, "Other") - - if use_arm_ik_poles: - bone_to_layer("upper_arm_ik.L", 25, "Other") - bone_to_layer("upper_arm_ik.R", 25, "Other") - else: - bone_to_layer("upper_arm_ik.L", 7, "Arm.L (IK)") - bone_to_layer("upper_arm_ik.R", 10, "Arm.R (IK)") - - if use_leg_ik_poles: - bone_to_layer("thigh_ik.L", 25, "Other") - bone_to_layer("thigh_ik.R", 25, "Other") - else: - bone_to_layer("thigh_ik.L", 13, "Leg.L (IK)") - bone_to_layer("thigh_ik.R", 16, "Leg.R (IK)") - - try: - bone_to_layer("+EyeBone L A01.001", 25, "Other") - bone_to_layer("+EyeBone R A01.001", 25, "Other") - except: - pass - - if not use_head_tracker: - bone_to_layer("head-controller", 25, "Other") - - if no_eyes: - bone_to_layer("eyetrack",25,"Other") - bone_to_layer("eyetrack_L",25,"Other") - bone_to_layer("eyetrack_R",25,"Other") - - # New bones, post append - list_to_send_other = ["MCH-thigh_ik_target_sub.L","MCH-thigh_ik_target_sub.R","MCH-foot_ik_pivot.L","MCH-foot_ik_pivot.R","MCH-hand_ik_pivot.L","MCH-hand_ik_pivot.R","MCH-hand_ik_wrist.L","MCH-hand_ik_wrist.R","MCH-torso_pivot.002","shoulder_driver.R","shoulder_driver.L","MCH-shoulder_follow.R","MCH-shoulder_follow.L"] - - fast_bone_move(list_to_send_other,25,"Other") - - send_to_pivots = ["foot_ik_pivot.L","foot_ik_pivot.R","hand_ik_pivot.L","hand_ik_pivot.R","torso_pivot.002","forearm_tweak-pin.L","forearm_tweak-pin.R","shin_tweak-pin.L","shin_tweak-pin.R"] - fast_bone_move(send_to_pivots, 19, "Pivots & Pins") - - bone_to_layer("root.002", 28, "Root") - bone_to_layer("root.001", 28, "Root") - bone_to_layer("root", 28, "Root") - - bone_to_layer("hand_ik.L",7,"Arm.L (IK)") - bone_to_layer("hand_ik_wrist.L",26,"Offsets") - bone_to_layer("upper_arm_parent.L",[7,8],"Arm.L (IK)","Arm.L (FK)") - bone_to_layer("upper_arm_ik_target.L",7,"Arm.L (IK)") - bone_to_layer("shoulder.L",[7,8],"Arm.L (IK)","Arm.L (FK)") - - bone_to_layer("hand_ik.R",10,"Arm.R (IK)") - bone_to_layer("upper_arm_parent.R",[10,11],"Arm.R (IK)","Arm.R (FK)") - bone_to_layer("hand_ik_wrist.R",26,"Offsets") - bone_to_layer("upper_arm_ik_target.R",10,"Arm.R (IK)") - bone_to_layer("shoulder.R",[10,11],"Arm.R (IK)","Arm.R (FK)") - - bone_to_layer("upper_arm_fk.L",8,"Arm.L (FK)") - bone_to_layer("forearm_fk.L",8,"Arm.L (FK)") - bone_to_layer("hand_fk.L",8,"Arm.L (FK)") - - bone_to_layer("upper_arm_fk.R",11,"Arm.R (FK)") - bone_to_layer("forearm_fk.R",11,"Arm.R (FK)") - bone_to_layer("hand_fk.R",11,"Arm.R (FK)") - - bone_to_layer("foot_ik.L",13,"Leg.L (IK)") - bone_to_layer("thigh_parent.L",[13,14],"Leg.L (IK)","Leg.L (FK)") - bone_to_layer("thigh_ik_target.L",13,"Leg.L (IK)") - bone_to_layer("foot_ik_sub.L",26,"Offsets") - bone_to_layer("foot_spin_ik.L",13,"Leg.L (IK)") - bone_to_layer("foot_heel_ik.L",13,"Leg.L (IK)") - - bone_to_layer("thigh_fk.L",14,"Leg.L (FK)") - bone_to_layer("shin_fk.L",14,"Leg.L (FK)") - bone_to_layer("foot_fk.L",14,"Leg.L (FK)") - bone_to_layer("toe_fk.L",14,"Leg.L (FK)") - - bone_to_layer("foot_ik.R",16,"Leg.R (IK)") - bone_to_layer("thigh_parent.R",[16,17],"Leg.R (IK)","Leg.R (FK)") - bone_to_layer("thigh_ik_target.R",16,"Leg.R (IK)") - bone_to_layer("foot_ik_sub.R",26,"Offsets") - bone_to_layer("foot_spin_ik.R",16,"Leg.R (IK)") - bone_to_layer("foot_heel_ik.R",16,"Leg.R (IK)") - - bone_to_layer("thigh_fk.R",17,"Leg.R (FK)") - bone_to_layer("shin_fk.R",17,"Leg.R (FK)") - bone_to_layer("foot_fk.R",17,"Leg.R (FK)") - bone_to_layer("toe_fk.R",17,"Leg.R (FK)") - - bone_to_layer("breast.L",20,"Physics") - bone_to_layer("breast.R",20,"Physics") - - def loop_place_physics(): - if is_version_4: - armature = bpy.context.object.data - collections = armature.collections - - for bone in armature.bones: - # The gods of the universe have blessed us with every physics bone starting with "+". We just do some extra filtering and we got what we need. - if bone.name[0] == "+" and "Twist" not in bone.name and "ToothBone" not in bone.name and "EyeBone" not in bone.name: - bone_to_layer(bone.name,20,"Physics") - else: - for bone in bpy.context.active_object.pose.bones: - if bone.name[0] == "+" and "Twist" not in bone.name and "ToothBone" not in bone.name and "EyeBone" not in bone.name: - bone_to_layer(bone.name,20,"Physics") - - loop_place_physics() - - def loop_place_def(): - # Handpicked bones to serve as the def layer. - list_custom_skel = ["DEF-thigh.L", "DEF-thigh.R","DEF-shin.L","DEF-shin.R","DEF-foot.L","DEF-foot.R","DEF-spine.001","DEF-spine.002","DEF-spine.003","DEF-spine.004","DEF-spine.006","+UpperArmTwistA02.L","+UpperArmTwistA02.R","DEF-forearm.L","DEF-forearm.R","DEF-hand.R","DEF-hand.L","DEF-shoulder.R","DEF-shoulder.L"] - - for bone in list_custom_skel: - bone_to_layer(bone,24,"Cage") - - # Otherwise, anything picked up by VG scan, enable below and disable above. - #for bone in armature.bones: - # if bone.name in vertex_groups_list: - # bone_to_layer(bone.name,24,"Cage") - - - loop_place_def() - - # MOVING OF BONES END ------------------------------- - -def setup_neck_and_head_follow(neck_follow_value, head_follow_value): - bpy.context.object.pose.bones["torso"]["neck_follow"] = neck_follow_value - bpy.context.object.pose.bones["torso"]["head_follow"] = head_follow_value - - -# Make it so that the finger scale controls can be scaled on the X axis to curl in just the fingertips instead of the entire finger. -def setup_finger_scale_controls_on_x_axis_to_curl_just_the_fingertips(rigified_rig): - bpy.ops.object.mode_set(mode='POSE') - - for oDrv in rigified_rig.animation_data.drivers: - for variable in oDrv.driver.variables: - for target in variable.targets: - if ".03" in oDrv.data_path and target.data_path[-7:] == "scale.y": - target.data_path = target.data_path[:-1] + "x" - - - fingerlist = ["thumb.01_master", "f_index.01_master", "f_middle.01_master", "f_ring.01_master", "f_pinky.01_master"] - for side in [".L", ".R"]: - for bone in fingerlist: - rigified_rig.pose.bones[bone + side].lock_scale[0] = False From 0e86a4396b34d1aa5849934976d7a8a8b3ccba15 Mon Sep 17 00:00:00 2001 From: Mark Allain <62905048+OctavoPE@users.noreply.github.com> Date: Mon, 6 May 2024 15:45:05 -0600 Subject: [PATCH 3/4] Delete setup_wizard/character_rig_setup/npc_rig_script.py --- .../character_rig_setup/npc_rig_script.py | 2523 ----------------- 1 file changed, 2523 deletions(-) delete mode 100644 setup_wizard/character_rig_setup/npc_rig_script.py diff --git a/setup_wizard/character_rig_setup/npc_rig_script.py b/setup_wizard/character_rig_setup/npc_rig_script.py deleted file mode 100644 index c32cba8..0000000 --- a/setup_wizard/character_rig_setup/npc_rig_script.py +++ /dev/null @@ -1,2523 +0,0 @@ -# Authors: enthralpy, Llama.jpg -# Setup Wizard Integration by michael-gh1 - -import bpy -import os -from mathutils import Color, Vector -from math import pi - -def rig_character( - file_path, - disallow_arm_ik_stretch, - disallow_leg_ik_stretch, - use_arm_ik_poles, - use_leg_ik_poles, - add_child_of_constraints, - use_head_tracker, - meshes_joined=False): - - # Firstly, let's make a flag to identify the blender version. - is_version_4 = False - version_string = bpy.app.version_string - if version_string[0] == "4": - is_version_4 = True - - head_bone_arm_target = bpy.context.active_object - temp_armature = head_bone_arm_target.data - - bpy.ops.object.mode_set(mode='EDIT') - - # Check if toe bones exist - toe_bones_exist = True - if "Bip001 L Toe0" not in temp_armature.edit_bones: - toe_bones_exist = False - - # Check if eyes exist: - left_eye_exists = True - if "+EyeBone L A02" not in temp_armature.edit_bones: - left_eye_exists = False - - right_eye_exists = True - if "+EyeBone R A02" not in temp_armature.edit_bones: - right_eye_exists = False - - no_eyes = False - if not left_eye_exists and not right_eye_exists: - no_eyes = True - - # Hoyo models have inconsistent head bone shapes. I'm correcting them to my standard. (This stabilizes the head track bone) - # My logic: Line up the head bone's tail's X & Y to the head bone's head (so that it's straight up), and use the eye bone's head's Z as the height. - Llama - if not no_eyes: - if left_eye_exists: - eye_bone_head = temp_armature.edit_bones['+EyeBone L A02'] - elif right_eye_exists: - eye_bone_head = temp_armature.edit_bones['+EyeBone R A02'] - eye_bone_head_z = eye_bone_head.head[2] - - head_bone_temp = temp_armature.edit_bones['Bip001 Head'] - head_bone_head_x = head_bone_temp.head[0] - head_bone_head_y = head_bone_temp.head[1] - - head_bone_temp.tail[0] = head_bone_head_x - head_bone_temp.tail[1] = head_bone_head_y - head_bone_temp.tail[2] = eye_bone_head_z - - # If they dont have eye bones (Dottore), we can hardcode a reasonable value to use to repair the head. - else: - head_bone_temp = temp_armature.edit_bones['Bip001 Head'] - head_bone_head_x = head_bone_temp.head[0] - head_bone_head_y = head_bone_temp.head[1] - - head_bone_temp.tail[0] = head_bone_head_x - head_bone_temp.tail[1] = head_bone_head_y - head_bone_temp.tail[2] = head_bone_temp.head[2] + 0.0538 - - left_eye_2 = [] - left_eye_1 = [] - right_eye_2 = [] - right_eye_1 = [] - - if left_eye_exists: - left_eye_2.append(temp_armature.edit_bones['+EyeBone L A02'].head[0]) - left_eye_2.append(temp_armature.edit_bones['+EyeBone L A02'].head[1]) - left_eye_2.append(temp_armature.edit_bones['+EyeBone L A02'].head[2]) - - left_eye_1.append(temp_armature.edit_bones['+EyeBone L A01'].head[0]) - left_eye_1.append(temp_armature.edit_bones['+EyeBone L A01'].head[1]) - left_eye_1.append(temp_armature.edit_bones['+EyeBone L A01'].head[2]) - if right_eye_exists: - right_eye_2.append(temp_armature.edit_bones['+EyeBone R A02'].head[0]) - right_eye_2.append(temp_armature.edit_bones['+EyeBone R A02'].head[1]) - right_eye_2.append(temp_armature.edit_bones['+EyeBone R A02'].head[2]) - - right_eye_1.append(temp_armature.edit_bones['+EyeBone R A01'].head[0]) - right_eye_1.append(temp_armature.edit_bones['+EyeBone R A01'].head[1]) - right_eye_1.append(temp_armature.edit_bones['+EyeBone R A01'].head[2]) - - bpy.ops.object.mode_set(mode='OBJECT') - - # THANK YOU: https://blenderartists.org/t/how-to-bpy-ops-transform-resize-in-edit-mode-using-pivot/560381/2 - def get_override(area_type, region_type): - for area in bpy.context.screen.areas: - if area.type == area_type: - for region in area.regions: - if region.type == region_type: - override = {'area': area, 'region': region} - return override - #error message if the area or region wasn't found - raise RuntimeError("Wasn't able to find", region_type," in area ", area_type, " Make sure it's open while executing script.") - - #we need to override the context of our operator - override = get_override( 'VIEW_3D', 'WINDOW' ) - - # Function to create shape keys from given arguments: Works with only one element in vg to parse - def create_shape_key(obj_get, is_basis, shape_name, shape_index, transform_pivot, vertex_groups_to_parse, transform_type, transformation_1, transformation_2=0, use_eye_1=False): - bpy.context.view_layer.objects.active = head_bone_arm_target - bpy.ops.object.mode_set(mode='EDIT') - for this_group in vertex_groups_to_parse: - if use_eye_1: - if " R " in this_group: - if right_eye_exists: - bpy.context.scene.cursor.location = (right_eye_1[0],right_eye_1[1],right_eye_1[2]) - elif " L " in this_group: - if left_eye_exists: - bpy.context.scene.cursor.location = (left_eye_1[0],left_eye_1[1],left_eye_1[2]) - else: - if " R " in this_group: - if right_eye_exists: - bpy.context.scene.cursor.location = (right_eye_2[0],right_eye_2[1],right_eye_2[2]) - elif " L " in this_group: - if left_eye_exists: - bpy.context.scene.cursor.location = (left_eye_2[0],left_eye_2[1],left_eye_2[2]) - - # AFTER MOVING 3D CURSOR - this_obj = bpy.data.objects.get(obj_get) - bpy.context.view_layer.objects.active = this_obj - - if is_basis: - this_obj.shape_key_add(name='Basis') - - this_obj.shape_key_add(from_mix=False) - sk = this_obj.data.shape_keys.key_blocks[-1] - sk.name = shape_name - sk.value = 1 - bpy.context.object.active_shape_key_index = shape_index - - bpy.ops.object.mode_set(mode='EDIT') - bpy.ops.mesh.select_all(action='DESELECT') - bpy.context.tool_settings.transform_pivot_point = "CURSOR" - - try: - bpy.ops.object.vertex_group_set_active(group=this_group) - bpy.ops.object.vertex_group_select() - - if transform_type == "RESIZE": - bpy.ops.transform.resize(override, value=(transformation_1), orient_type='LOCAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='LOCAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) - bpy.ops.object.vertex_group_deselect() - elif transform_type == "TRANSLATE": - bpy.ops.transform.translate(override, value=transformation_1, orient_type='LOCAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='LOCAL', constraint_axis=(False, True, False), mirror=True, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) - bpy.ops.transform.resize(override, value=transformation_2) - bpy.ops.object.vertex_group_deselect() - except: - pass - - bpy.ops.object.vertex_group_deselect() - bpy.ops.mesh.select_all(action='DESELECT') - bpy.ops.object.mode_set(mode='OBJECT') - sk.value = 0.0 - bpy.context.scene.cursor.location = (0.0,0.0,0.0) - - # Function to create shape keys that works with 2 elementsa - def create_shape_key2(obj_get, is_basis, shape_name, shape_index, transform_pivot, vertex_groups_to_parse, transform_type, transformation_1, transformation_2=0, use_eye_1=False): - bpy.context.view_layer.objects.active = head_bone_arm_target - bpy.ops.object.mode_set(mode='EDIT') - if use_eye_1: - if " R " in vertex_groups_to_parse[0]: - if right_eye_exists: - bpy.context.scene.cursor.location = (right_eye_1[0],right_eye_1[1],right_eye_1[2]) - elif " L " in vertex_groups_to_parse[0]: - if left_eye_exists: - bpy.context.scene.cursor.location = (left_eye_1[0],left_eye_1[1],left_eye_1[2]) - else: - if " R " in vertex_groups_to_parse[0]: - if right_eye_exists: - bpy.context.scene.cursor.location = (right_eye_2[0],right_eye_2[1],right_eye_2[2]) - elif " L " in vertex_groups_to_parse[0]: - if left_eye_exists: - bpy.context.scene.cursor.location = (left_eye_2[0],left_eye_2[1],left_eye_2[2]) - - # AFTER MOVING 3D CURSOR - this_obj = bpy.data.objects.get(obj_get) - bpy.context.view_layer.objects.active = this_obj - - if is_basis: - this_obj.shape_key_add(name='Basis') - - this_obj.shape_key_add(from_mix=False) - sk = this_obj.data.shape_keys.key_blocks[-1] - sk.name = shape_name - sk.value = 1 - bpy.context.object.active_shape_key_index = shape_index - - bpy.ops.object.mode_set(mode='EDIT') - bpy.ops.mesh.select_all(action='DESELECT') - bpy.context.tool_settings.transform_pivot_point = "CURSOR" - - try: - bpy.ops.object.vertex_group_set_active(group=vertex_groups_to_parse[0]) - bpy.ops.object.vertex_group_select() - - if transform_type == "RESIZE": - bpy.ops.transform.resize(override, value=(transformation_1), orient_type='LOCAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='LOCAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) - bpy.ops.object.vertex_group_deselect() - elif transform_type == "TRANSLATE": - bpy.ops.transform.translate(override, value=transformation_1, orient_type='LOCAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='LOCAL', constraint_axis=(False, True, False), mirror=True, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) - bpy.ops.transform.resize(override, value=transformation_2) - bpy.ops.object.vertex_group_deselect() - except: - pass - - bpy.ops.mesh.select_all(action='DESELECT') - bpy.ops.object.mode_set(mode='OBJECT') - - # REPEAT FOR SECOND BONE! - - bpy.context.view_layer.objects.active = head_bone_arm_target - bpy.ops.object.mode_set(mode='EDIT') - if use_eye_1: - if " R " in vertex_groups_to_parse[1]: - if right_eye_exists: - bpy.context.scene.cursor.location = (right_eye_1[0],right_eye_1[1],right_eye_1[2]) - elif " L " in vertex_groups_to_parse[1]: - if left_eye_exists: - bpy.context.scene.cursor.location = (left_eye_1[0],left_eye_1[1],left_eye_1[2]) - else: - if " R " in vertex_groups_to_parse[1]: - if right_eye_exists: - bpy.context.scene.cursor.location = (right_eye_2[0],right_eye_2[1],right_eye_2[2]) - elif " L " in vertex_groups_to_parse[1]: - if left_eye_exists: - bpy.context.scene.cursor.location = (left_eye_2[0],left_eye_2[1],left_eye_2[2]) - - # AFTER MOVING 3D CURSOR - this_obj = bpy.data.objects.get(obj_get) - bpy.context.view_layer.objects.active = this_obj - - bpy.ops.object.mode_set(mode='EDIT') - bpy.ops.mesh.select_all(action='DESELECT') - - try: - bpy.ops.object.vertex_group_set_active(group=vertex_groups_to_parse[1]) - bpy.ops.object.vertex_group_select() - - if transform_type == "RESIZE": - bpy.ops.transform.resize(override, value=(transformation_1), orient_type='LOCAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='LOCAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) - bpy.ops.object.vertex_group_deselect() - elif transform_type == "TRANSLATE": - bpy.ops.transform.translate(override, value=transformation_1, orient_type='LOCAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='LOCAL', constraint_axis=(False, True, False), mirror=True, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) - bpy.ops.transform.resize(override, value=transformation_2) - bpy.ops.object.vertex_group_deselect() - except: - pass - - bpy.ops.mesh.select_all(action='DESELECT') - bpy.ops.object.mode_set(mode='OBJECT') - - # DONE - sk.value = 0.0 - bpy.context.scene.cursor.location = (0.0,0.0,0.0) - - - # Shape key to shrink pupils - #create_shape_key2("Body", True, "pupils", 1, "CURSOR", ["+EyeBoneA02.L","+EyeBoneA02.R"], "RESIZE", (0.5,0.5,0.5)) - # Shape keys to adjust eye during blink - #create_shape_key("Body", False, "pupil-pushback-R", 2, "CURSOR", ["+EyeBoneA02.R"], "TRANSLATE", (0, 0.00703, 0), (1.1,1.1,1.1),use_eye_1=True) # 0.0069, 70 - #create_shape_key("Body", False, "pupil-pushback-L", 3, "CURSOR", ["+EyeBoneA02.L"], "TRANSLATE", (0, 0.00703, 0), (1.1,1.1,1.1),use_eye_1=True) - - bpy.context.tool_settings.transform_pivot_point = "MEDIAN_POINT" - - bpy.context.view_layer.objects.active = head_bone_arm_target - bpy.ops.object.mode_set(mode='EDIT') - - if not toe_bones_exist: - r_foot_bone = temp_armature.edit_bones["Bip001 R Foot"] - r_foot_bone.tail = (-0.040187,-0.078244,0.005803) # X, Y, Z - r_foot_bone.roll = 1.5708 - - l_foot_bone = temp_armature.edit_bones["Bip001 L Foot"] - l_foot_bone.tail = (0.040187,-0.078244,0.005803) - l_foot_bone.roll = 1.5708 - - bpy.ops.object.mode_set(mode='OBJECT') - bpy.context.view_layer.objects.active = head_bone_arm_target - - # Let's let the RigUI script that poke made execute. - - context = bpy.context - obj = context.object - if obj.name[-4:] == ".001": - obj.name = obj.name[:-4] - print("New Run\n\n") - ## Rename all bones in selected armature to ORG - original_name = obj.name - abadidea = { - 'Bip001 Pelvis': 'spine', - 'Bip001 L Thigh': 'thigh.L', - 'Bip001 L Calf': 'shin.L', - 'Bip001 L Foot': 'foot.L', - 'Bip001 L Toe0': 'toe.L', - 'Bip001 R Thigh': 'thigh.R', - 'Bip001 R Calf': 'shin.R', - 'Bip001 R Foot': 'foot.R', - 'Bip001 R Toe0': 'toe.R', - 'Bip001 Spine': 'spine.001', - 'Bip001 Spine1': 'spine.002', - 'Bip001 L Clavicle': 'shoulder.L', - 'Bip001 L UpperArm': 'upper_arm.L', - 'Bip001 L Forearm': 'forearm.L', - 'Bip001 L Hand': 'hand.L', - 'Bip001 L Finger0': 'thumb.01.L', - 'DMZ L 01': 'thumb.01.L', ##WHERE DO THESE SIX COME FROM LMAO - 'DMZ L 02': 'thumb.02.L', - 'DMZ L 03': 'thumb.03.L', - 'DMZ R 01': 'thumb.01.R', - 'DMZ R 02': 'thumb.02.R', - 'DMZ R 03': 'thumb.03.R', - 'Bip001 L Finger01': 'thumb.02.L', - 'Bip001 L Finger02': 'thumb.03.L', - 'Bip001 L Finger1': 'f_index.01.L', - 'Bip001 L Finger11': 'f_index.02.L', - 'Bip001 L Finger12': 'f_index.03.L', - 'Bip001 L Finger2': 'f_middle.01.L', - 'Bip001 L Finger21': 'f_middle.02.L', - 'Bip001 L Finger22': 'f_middle.03.L', - 'Bip001 L Finger3': 'f_ring.01.L', - 'Bip001 L Finger31': 'f_ring.02.L', - 'Bip001 L Finger32': 'f_ring.03.L', - 'Bip001 L Finger4': 'f_pinky.01.L', - 'Bip001 L Finger41': 'f_pinky.02.L', - 'Bip001 L Finger42': 'f_pinky.03.L', - 'Bip001 Neck': 'spine.004', #YO - 'Bip001 Head': 'spine.006', #RUHROH - 'Bip001 R Clavicle': 'shoulder.R', - 'Bip001 R UpperArm': 'upper_arm.R', - 'Bip001 R Forearm': 'forearm.R', - 'Bip001 R Hand': 'hand.R', - 'Bip001 R Finger0': 'thumb.01.R', - 'Bip001 R Finger01': 'thumb.02.R', - 'Bip001 R Finger02': 'thumb.03.R', - 'Bip001 R Finger1': 'f_index.01.R', - 'Bip001 R Finger11': 'f_index.02.R', - 'Bip001 R Finger12': 'f_index.03.R', - 'Bip001 R Finger2': 'f_middle.01.R', - 'Bip001 R Finger21': 'f_middle.02.R', - 'Bip001 R Finger22': 'f_middle.03.R', - 'Bip001 R Finger3': 'f_ring.01.R', - 'Bip001 R Finger31': 'f_ring.02.R', - 'Bip001 R Finger32': 'f_ring.03.R', - 'Bip001 R Finger4': 'f_pinky.01.R', - 'Bip001 R Finger41': 'f_pinky.02.R', - 'Bip001 R Finger42': 'f_pinky.03.R', - '+EyeBone R A01': 'eye.R', - '+EyeBone L A01': 'eye.L', - '+Breast L A01': 'breast.L', - '+Breast R A01': 'breast.R', - } - if not toe_bones_exist: - del abadidea['Bip001 L Toe0'] - del abadidea['Bip001 R Toe0'] - - bpy.ops.object.mode_set(mode='EDIT') - armature = bpy.context.selected_objects[0].data - - bpy.ops.armature.select_all(action='DESELECT') - def select_bone(bone): - bone.select = True - bone.select_head = True - bone.select_tail = True - - # Disconnect the eyes because it'll throw an error if I don't, disconnect the spines so the hip wiggle bone in the rigify rig works properly - try: - select_bone(armature.edit_bones["+EyeBone L A02"]) - select_bone(armature.edit_bones["+EyeBone R A02"]) - except: - pass - select_bone(armature.edit_bones["Bip001 Spine"]) - select_bone(armature.edit_bones["Bip001 Spine1"]) - bpy.ops.armature.parent_clear(type='DISCONNECT') - bpy.ops.armature.select_all(action='DESELECT') - - try: - select_bone(armature.edit_bones["+Breast R A02"]) - select_bone(armature.edit_bones["+Breast L A02"]) - bpy.ops.armature.parent_clear(type='DISCONNECT') - bpy.ops.armature.select_all(action='DESELECT') - except: - pass - - bones_list = obj.pose.bones - for bone in bones_list: - if bone.name in abadidea: - bone.name = abadidea[bone.name] - - - #Aw shit here we go again. This second loop is for making it possible to symmetrize pose bones properly. - for bone in bones_list: - if ".L" in bone.name: - whee = bone.name[:-2] + ".R" - armature.edit_bones[bone.name].roll = -armature.edit_bones[whee].roll - - - - armature.edit_bones["shoulder.L"].roll += 3.14 - armature.edit_bones["shoulder.R"].roll -= 3.14 - - - - - for bone in armature.edit_bones: - if "thumb" in bone.name or "index" in bone.name or "middle" in bone.name or "ring" in bone.name or "pinky" in bone.name: - if ".L" in bone.name: - armature.edit_bones[bone.name].roll -= 1.571 - else: - armature.edit_bones[bone.name].roll += 1.571 - ## Not sure why this bone exist but it's gotta go lmao - if bone.name == "Bip001": - for childbone in bone.children: - if childbone.name != "spine": - armature.edit_bones[childbone.name].parent = armature.edit_bones['spine'] - armature.edit_bones.remove(bone) - elif ".L" not in bone.name and ".R" not in bone.name: - armature.edit_bones[bone.name].roll = 0 - - - ## Fixes the weirdass pelvis/spine bone. Sets the spine's head and tail X to 0. - def realign(bone): - bone.head.x = 0 - bone.tail.x = 0 - realign(armature.edit_bones['spine']) - realign(armature.edit_bones['spine.006']) - - - ## Attaches the feet to the toes and the upperarms to lowerarms - def attachfeets(foot, toe): - armature.edit_bones[foot].tail.x = armature.edit_bones[toe].head.x - armature.edit_bones[foot].tail.y = armature.edit_bones[toe].head.y - armature.edit_bones[foot].tail.z = armature.edit_bones[toe].head.z - - if toe_bones_exist: - attachfeets('foot.L', 'toe.L') - attachfeets('foot.R', 'toe.R') - - attachfeets('upper_arm.L', 'forearm.L') - attachfeets('upper_arm.R', 'forearm.R') - attachfeets('thigh.L', 'shin.L') - attachfeets('thigh.R', 'shin.R') - attachfeets('forearm.L', 'hand.L') - attachfeets('forearm.R', 'hand.R') - attachfeets('spine', 'spine.001') - attachfeets('spine.001', 'spine.002') - attachfeets('spine.002', 'spine.004') - attachfeets('spine.004', 'spine.006') - - ## Points toe bones in correct direction - if toe_bones_exist: - armature.edit_bones['toe.L'].tail.z = 0 - armature.edit_bones['toe.L'].tail.y -= 0.05 - - armature.edit_bones['toe.R'].tail.z = 0 - armature.edit_bones['toe.R'].tail.y -= 0.05 - - bpy.ops.armature.select_all(action='DESELECT') - try: - select_bone(armature.edit_bones["breast.L"]) - bpy.ops.armature.symmetrize() - bpy.ops.armature.select_all(action='DESELECT') - - except Exception: - pass - - try: - armature.edit_bones["eye.L"].name = "DEF-eye.L" - armature.edit_bones["eye.R"].name = "DEF-eye.R" - except: - pass - - bpy.ops.object.mode_set(mode='POSE') - - bpy.ops.object.expykit_convert_bone_names(src_preset='Rigify_Metarig.py', trg_preset='Rigify_Deform.py') - bpy.ops.object.expykit_extract_metarig(rig_preset='Rigify_Metarig.py', assign_metarig=True) - - - - ## Fixes the tiddy bones. Expykit, why did you neglect them - - metarm = bpy.data.objects["metarig"].data - bpy.ops.object.mode_set(mode='EDIT') - armature = bpy.data.objects[obj.name].data - - ## Left side first, right side's xyz is same as left, but x is negative - def getboob(bone, tip): - if tip == "head": - return armature.edit_bones[bone].head.x, armature.edit_bones[bone].head.y, armature.edit_bones[bone].head.z - else: - return armature.edit_bones[bone].tail.x, armature.edit_bones[bone].tail.y, armature.edit_bones[bone].tail.z - - - try: - xh, yh, zh = getboob("breast.L", "head") - xt, yt, zt = getboob("breast.L", "tail") - - ## Change the meta arm's boob positions - - def fixboob(bone, xh, yh, zh, xt, yt, zt): - bone.head.x = xh - bone.head.y = yh - bone.head.z = zh - bone.tail.x = xt - bone.tail.y = yt - bone.tail.z = zt - - boobL = metarm.edit_bones["breast.L"] - fixboob(boobL, xh, yh, zh, xt, yt, zt) - boobR = metarm.edit_bones["breast.R"] - fixboob(boobR, -xh, yh, zh, -xt, yt, zt) - - boobL.roll = armature.edit_bones["breast.L"].roll - boobR.roll = -boobL.roll - except Exception: - # If breast bones dont exist in the orig rig, then delete from the meta rig - metarm.edit_bones.remove(metarm.edit_bones["breast.L"]) - metarm.edit_bones.remove(metarm.edit_bones["breast.R"]) - - - - # Fixes the finger rolls - bpy.ops.object.mode_set(mode='OBJECT') - metapose = bpy.data.objects['metarig'].pose - metapose.bones["thumb.01.L"].rigify_parameters.primary_rotation_axis = '-X' - metapose.bones["thumb.01.R"].rigify_parameters.primary_rotation_axis = '-X' - - - ## This part corrects metarm finger rolls - bpy.ops.object.mode_set(mode='OBJECT') - bpy.ops.object.select_all(action='DESELECT') - - armature = obj.data - - for o in bpy.data.objects: - # Check for given object names - if o.name in ("metarig", armature.name): - o.select_set(True) - - - bpy.ops.object.mode_set(mode='EDIT') - for bone in metarm.edit_bones: - if "f_" in bone.name or "thumb" in bone.name: - try: - bone.roll = armature.edit_bones["DEF-"+bone.name].roll - except: - pass - - # Fix hand bones being rotated 90 degrees sideways and arm deformation bones being wonky - if "Child" in obj.name: - metarm.edit_bones["upper_arm.L"].tail.y += .003 - metarm.edit_bones["upper_arm.R"].tail.y += .003 - - ########### DETACH PHYSICS BONES, - - metanames = ['eye.L', 'eye.R', 'spine', 'thigh.L', 'shin.L', 'foot.L', 'toe.L', 'thigh.R', 'shin.R', 'foot.R', 'toe.R', 'spine.001', 'spine.002', 'spine.003', 'breast.L', 'breast.R', 'shoulder.L', 'upper_arm.L', 'forearm.L', 'hand.L', 'thumb.01.L', 'thumb.02.L', 'thumb.03.L', 'f_index.01.L', 'f_index.02.L', 'f_index.03.L', 'f_middle.01.L', 'f_middle.02.L', 'f_middle.03.L', 'f_ring.01.L', 'f_ring.02.L', 'f_ring.03.L', 'f_pinky.01.L', 'f_pinky.02.L', 'f_pinky.03.L', 'spine.004', 'spine.006', 'shoulder.R', 'upper_arm.R', 'forearm.R', 'hand.R', 'thumb.01.R', 'thumb.02.R', 'thumb.03.R', 'f_index.01.R', 'f_index.02.R', 'f_index.03.R', 'f_middle.01.R', 'f_middle.02.R', 'f_middle.03.R', 'f_ring.01.R', 'f_ring.02.R', 'f_ring.03.R', 'f_pinky.01.R', 'f_pinky.02.R', 'f_pinky.03.R'] - if not toe_bones_exist: - metanames.remove("toe.L") - metanames.remove("toe.R") - - - pre_res = ["DEF-" + bonename for bonename in metanames] - armature = obj.data ## Original char rig - - - ## Make a dictionary. Key is a main body bone that exists in the Rigify (arm, leg, spine, etc), and the value is a list of all the children bones that aren't other main body bones (usually hair, clothes, deform, etc.) - savethechildren = { - - } - bpy.ops.object.mode_set(mode='EDIT') - for bone in armature.edit_bones: - if bone.name in pre_res: - childlist = [] - for childbone in armature.edit_bones[bone.name].children: - if childbone.name not in pre_res: # Adds only non-main body bones, avoids like forearm or knee etc - childlist.append(childbone.name) - if childlist: # If list isn't empty, add it to dict - wtf = bone.name - savethechildren[wtf] = childlist - - - ## Duplicates the physics bones - bpy.ops.object.mode_set(mode='EDIT') - bpy.ops.armature.select_all(action='DESELECT') - bones = armature.edit_bones[:] - for bone in bones: - if bone.name not in pre_res: - #this is a physics bone, so duplicate it. - bone.select = True - bone.select_tail = True - bone.select_head = True - - bpy.ops.armature.separate() - # Generates rigify rig and renames it to 'rigify' - bpy.ops.pose.rigify_generate() - bpy.data.objects[obj.name].name = "rigify" - - rig_obj_name = "rigify" - bpy.context.view_layer.objects.active = bpy.data.objects[armature.name + ".001"] # assumes rig obj is named rigify, ifn -> rename accordingly - - - for o in bpy.data.objects: - # Check for given object names - if o.name in ("rigify", armature.name + ".001"): - o.select_set(True) - - # THEN REATTACH PHYSICS - - bpy.ops.object.mode_set(mode='OBJECT') - ### BLENDER ARE U GOOD LMAO WTF IS THIS (this joins two objects together) - newrig = armature.name + ".001" ## New temporary armature with the physics bones. Hopefully you didnt touch any names lmao - - ## Why's the list for selected objects ordered alphabetically instead of by selection order - objList = bpy.context.selected_objects - unselected = [obj for obj in objList if obj != context.active_object] - rigifyr = unselected[0] ## Rigified Rig - - obs = [bpy.data.objects.get("rigify"), bpy.data.objects.get(newrig)] - c={} - - c["object"] = c["active_object"] = bpy.data.objects.get("rigify") - - c["selected_objects"] = c["selected_editable_objects"] = obs - bpy.ops.object.mode_set(mode='OBJECT') - bpy.ops.object.select_all(action='DESELECT') - - with bpy.context.temp_override(active_object=bpy.data.objects.get("rigify"), selected_editable_objects=obs): - bpy.ops.object.join() - - - bpy.context.view_layer.objects.active = bpy.data.objects["rigify"] - - setup_neck_and_head_follow(neck_follow_value=1.0, head_follow_value=1.0) - setup_finger_scale_controls_on_x_axis_to_curl_just_the_fingertips(rigifyr) - bpy.ops.object.mode_set(mode='EDIT') - - #### whats this for??? - #oh i think it's useless now bc there's only one rig LMAOLMAO - #for bone in bones_list: - # armature.edit_bones[bone.name].roll = rigifyr.data.edit_bones[bone.name].roll - #### - - ## Reattach the physics bones to their parents - #Go back into rigify, find the main body bones, and reattach every bone in the corresponding dict list - for mainbone in savethechildren: - for childbone in savethechildren[mainbone]: - rigifyr.data.edit_bones[childbone].parent = rigifyr.data.edit_bones[mainbone] - - print("donelol\n") - bpy.ops.object.mode_set(mode='OBJECT') - bpy.data.objects["rigify"].show_in_front = True - - # Symmetrize clothes/hair bones - bpy.ops.object.mode_set(mode='EDIT') - for bone in rigifyr.data.edit_bones: - if " L " in bone.name: # Finds clothes/hair bones with symmetrical bones - y = bone.name.find(' L ') # Finds index of "Hair L 1" - orgname = bone.name - try: - oppbone = orgname[:y] + " R " + orgname[y+3:] # oppbone = "Hair R 1" - bone.name = orgname[:y] + orgname[y+3:] + ".L" #Rename bones to "Hair 1.L/R" so Blender - rigifyr.data.edit_bones[oppbone].name = orgname[:y] + orgname[y+3:] + ".R" # goes ":o symmetry" - except: - pass - - #rigifyr.pose.bones["upper_arm_parent.L"]["pole_parent"] = 2 - #rigifyr.pose.bones["upper_arm_parent.R"]["pole_parent"] = 2 - #rigifyr.pose.bones["thigh_parent.L"]["pole_parent"] = 2 - #rigifyr.pose.bones["thigh_parent.R"]["pole_parent"] = 2 - - #bpy.ops.object.mode_set(mode='OBJECT') - ##change active object to rigifyr - - #bpy.context.view_layer.objects.active = bpy.data.objects["rigify"] - - #bpy.ops.object.mode_set(mode='OBJECT') - - # This part puts all the main bones I use into the secoond bone layer - listofbones = ["root", "foot_heel_ik.R", "foot_heel_ik.L", "toe_ik.R", "toe_ik.L", "foot_ik.R", "foot_ik.L", "thigh_ik_target.R", "thigh_ik_target.L", "hips", "torso", "chest", "neck", "head", "shoulder.L", "shoulder.R", "upper_arm_fk.L", "upper_arm_fk.R", "forearm_fk.L", "forearm_fk.R", "hand_fk.L", "hand_fk.R", "upper_arm_ik_target.L", "upper_arm_ik_target.R", "hand_ik.R", "hand_ik.L", ] - rigifyr = obj - if not toe_bones_exist: - listofbones.remove("toe_ik.R") - listofbones.remove("toe_ik.L") - if not is_version_4: - for bone in listofbones: - bpy.context.active_object.pose.bones[bone].bone.layers[1] = True - - #x = original_name.split("_") - char_name = original_name - bpy.data.objects["rigify"].name = char_name - - - bpy.ops.object.mode_set(mode='POSE') - bpy.ops.pose.select_all(action='DESELECT') - bones_list = obj.pose.bones - - # Creates selection sets for FK arms + shoulders, hair bones, and clothes bones. Selection Sets is an addon that comes with Blender. - try: - bpy.ops.object.mode_set(mode='POSE') - - arms = ['upper_arm_fk', 'forearm_fk', 'hand_fk', 'shoulder'] - bpy.ops.pose.select_all(action='DESELECT') - for side in ['.L', '.R']: - for bone in arms: - bonename = bone + side - rigifyr.pose.bones[bonename].bone.select= True - bpy.ops.pose.selection_set_add() - bpy.ops.pose.selection_set_assign() - bpy.ops.pose.select_all(action='DESELECT') - - ## Hair - for bone in bones_list: - if "Hair" in bone.name: - rigifyr.pose.bones[bone.name].bone.select = True - bpy.ops.pose.selection_set_add() - bpy.ops.pose.selection_set_assign() - bpy.ops.pose.select_all(action='DESELECT') - - ## Clothes - for bone in bones_list: - if "Amice" in bone.name or ("fk" not in bone.name and "tweak" not in bone.name and "Twist" not in bone.name and "Hair" not in bone.name and (bone.name[-1].isdigit() or bone.name[-3].isdigit())): - rigifyr.pose.bones[bone.name].bone.select = True - bpy.ops.pose.selection_set_add() - bpy.ops.pose.selection_set_assign() - bpy.ops.pose.select_all(action='DESELECT') - bpy.context.object.selection_sets[0].name = "FK Arms" - bpy.context.object.selection_sets[1].name = "Hair" - bpy.context.object.selection_sets[2].name = "Clothes...and teeth and eyes lmao" - except: - pass - - bpy.ops.object.mode_set(mode='EDIT') - # Deletes the extra useless finger bones - eatthis = ['f_index.03.L', 'f_index.01.L.001', 'thumb.03.L', 'thumb.01.L.001', 'f_middle.03.L', 'f_middle.01.L.001', 'f_ring.01_master.L', 'f_ring.01.L', 'f_ring.02.L', 'f_ring.03.L', 'f_ring.01.L.001', 'f_pinky.01_master.L', 'f_pinky.01.L', 'f_pinky.02.L', 'f_pinky.03.L', 'f_pinky.01.L.001', 'palm.L', 'f_index.03.R', 'f_index.01.R.001', 'thumb.03.R', 'thumb.01.R.001', 'f_middle.03.R', 'f_middle.01.R.001', 'f_ring.01_master.R', 'f_ring.01.R', 'f_ring.02.R', 'f_ring.03.R', 'f_ring.01.R.001', 'f_pinky.01_master.R', 'f_pinky.01.R', 'f_pinky.02.R', 'f_pinky.03.R', 'f_pinky.01.R.001', 'palm.R'] - for this in eatthis: - ugh = rigifyr.data.edit_bones[this] - rigifyr.data.edit_bones.remove(ugh) - - # This workaround is for an issue so stupid i dont even want to explain this lmao - bpy.ops.object.mode_set(mode='POSE') - wtf = ['MCH-f_index.02.L', 'MCH-thumb.02.L', 'MCH-f_middle.02.L', 'MCH-f_index.02.R', 'MCH-thumb.02.R', 'MCH-f_middle.02.R', 'MCH-f_index.03.L', 'MCH-thumb.03.L', 'MCH-f_middle.03.L', 'MCH-f_index.03.R', 'MCH-thumb.03.R', 'MCH-f_middle.03.R'] - for this in wtf: - rigifyr.pose.bones[this].constraints[0].enabled = False - - - bpy.ops.object.mode_set(mode='EDIT') - # The scale controls for the fingers are big as hell lmao what. - sizethis = ['thumb.01_master.L', 'f_index.01_master.L', 'f_middle.01_master.L', 'thumb.01_master.R', 'f_index.01_master.R', 'f_middle.01_master.R'] - for this in sizethis: - rigifyr.data.edit_bones[this].length *= .25 - - # This corrects the drivers on the superscale control. Without this fix, the scales operate opposite to how they should. - bpy.ops.object.mode_set(mode='POSE') - for oDrv in rigifyr.animation_data.drivers: - for variable in oDrv.driver.variables: - for target in variable.targets: - if "MCH-f_middle.02_drv" in oDrv.data_path or "MCH-f_index.02_drv" in oDrv.data_path: - oDrv.driver.expression += "* -1" - - bpy.ops.object.mode_set(mode='OBJECT') - try: - head_driver_obj = bpy.data.objects.get("Head Driver") or bpy.data.objects.get("Head Origin") - bpy.context.view_layer.objects.active = head_driver_obj - bpy.ops.constraint.childof_set_inverse(constraint="Child Of", owner='OBJECT') - except: - pass - - # POST RIGIFY SCRIPT EXECUTION -----------------> - - # Hide metarig (I think you can actually delete it instead?) - bpy.data.objects["metarig"].hide_select = True - bpy.data.objects["metarig"].hide_viewport = True - bpy.data.objects["metarig"].hide_render = True - - # Moves specified param and it's children into the collection - def move_into_collection(object,collection): - - # Get object - this_obj = bpy.context.scene.objects.get(object) - # Get existing collection or make new one - this_coll = bpy.data.collections.get(collection) - if not this_coll: - this_coll = bpy.data.collections.new(collection) - bpy.context.scene.collection.children.link(this_coll) - - # Move object into collection - if this_obj: - # Unlink it from all previous collections before moving it to new one - for coll in this_obj.users_collection: - coll.objects.unlink(this_obj) - - # Move it to our specified collection (This only does the parent obj) - this_coll.objects.link(this_obj) - - # Now we move the children of this object - for child_obj in this_obj.children: - # Same thing, unlink previous collections - for coll in child_obj.users_collection: - coll.objects.unlink(child_obj) - this_coll.objects.link(child_obj) - - # Move the rig into the char name's collection - move_into_collection(char_name,char_name) - - # Let's make a new wgt collection inside the char coll. - char_coll = bpy.data.collections.get(char_name) - wgt_coll = bpy.data.collections.new("wgt") - char_coll.children.link(wgt_coll) - - # Rename our WGT collection and put the metarig into it. - for coll in bpy.data.collections: - if coll.name.startswith("WGTS"): - coll.name = "WG" - - move_into_collection("metarig","wgt") - - # Unlink all inner objects from the old WGT collection. We want them inside the new one. - for obj in bpy.data.objects: - if obj.name.startswith("WGT"): - for coll in obj.users_collection: - coll.objects.unlink(obj) - - wgt_coll.objects.link(obj) - - # Remove old unused wgt collection - bpy.data.collections.remove(bpy.data.collections.get("WG")) - - # Obfuscate light driving stuff not needed, keep the main light. - move_into_collection("Face Light Direction","wgt") - move_into_collection("Head Driver",char_name) - move_into_collection("Main Light Direction",char_name) - - # V3 Shader Support - New empty names - move_into_collection("Head Origin",char_name) - move_into_collection("Light Direction",char_name) - - bpy.data.collections["wgt"].hide_select = True - bpy.data.collections["wgt"].hide_viewport = True - bpy.data.collections["wgt"].hide_render = True - - head_driver_obj = bpy.data.objects.get("Head Driver") or bpy.data.objects.get("Head Origin") - if head_driver_obj: - head_driver_obj.hide_select = True - head_driver_obj.hide_viewport = True - head_driver_obj.hide_render = True - - head_forward_obj = bpy.data.objects.get("Head Forward") - head_forward_obj.hide_select = True - head_forward_obj.hide_viewport = True - head_forward_obj.hide_render = True - - head_up_obj = bpy.data.objects.get("Head Up") - head_up_obj.hide_select = True - head_up_obj.hide_viewport = True - head_up_obj.hide_render = True - - # If it exists, gets rid of the default collection. - camera_coll = bpy.data.collections.get("Collection") - if camera_coll: - bpy.data.collections.remove(camera_coll,do_unlink=True) - - # Let's 'exclude' that wgt collection: https://blenderartists.org/t/disable-exlude-from-view-layer-in-collection/1324744 - def recurLayerCollection(layerColl): - found = None - if (layerColl.name == "wgt"): - return layerColl - for layer in layerColl.children: - found = recurLayerCollection(layer) - if found: - return found - layer_collection = bpy.context.view_layer.layer_collection - layerColl = recurLayerCollection(layer_collection) - bpy.context.view_layer.active_layer_collection = layerColl - - layerColl.exclude = True - - # Make our lives easier, display the bones as sticks and make sure we can view from front. - bpy.data.armatures[original_name].display_type = 'STICK' - bpy.data.objects[char_name].show_in_front = True - - # Going into pose mode with our character selected. - bpy.ops.object.select_all(action='DESELECT') - our_char = bpy.data.objects.get(char_name) - if our_char: - our_char.select_set(True) - bpy.context.view_layer.objects.active = our_char - - bpy.ops.object.mode_set(mode='POSE') - - # Function to automatically move a bone (if it exists) to the specified bone layer - def move_bone(bone_name,to_layers): - armature = bpy.context.active_object - armature_data = armature.data - - if bone_name in armature_data.bones: - bone = armature_data.bones[bone_name] - - for i in range(32): - bone.layers[i] = False - - to_layers = [to_layers] if isinstance(to_layers, int) else to_layers - - for layer in to_layers: - bone.layers[layer] = True - print("enabling layer: " + str(layer) + " for " + bone_name) - - - if not is_version_4: - # Put away every other bone to the physics layer (22) - for bone in bpy.context.active_object.data.bones: - if bone.layers[0]: # Check if the bone is on layer face - move_bone(bone.name, 25) # Move the bone to layer 23 - - # Let's append our root_shape custom bones - path_to_file = file_path + "/Collection" - - # Bring in our collections: root shapes, face rig, and the eye rig - bpy.ops.wm.append(filename='append_NPC Plate', directory=path_to_file) - - bpy.ops.wm.append(filename='append_Root', directory=path_to_file) - - bpy.ops.wm.append(filename='append_Eyes', directory=path_to_file) - - bpy.ops.wm.append(filename='append_Pelvis', directory=path_to_file) - - bpy.ops.wm.append(filename='append_Foot', directory=path_to_file) - - bpy.ops.wm.append(filename='append_Hand', directory=path_to_file) - - this_obj = our_char - - this_obj.pose.bones["root"].custom_shape = bpy.data.objects["root plate.002"] - this_obj.pose.bones["root"].use_custom_shape_bone_size = False - - this_obj.pose.bones["head"].custom_shape_scale_xyz = (1.65,1.65,1.65) - this_obj.pose.bones["head"].custom_shape = bpy.data.objects["neck"] - this_obj.pose.bones["head"].custom_shape_translation = (0.0,0.255,0.0) - this_obj.pose.bones["head"].custom_shape_rotation_euler[0] = 1.5708 - this_obj.pose.bones["head"].use_custom_shape_bone_size = False - - this_obj.pose.bones["neck"].use_custom_shape_bone_size = False - this_obj.pose.bones["neck"].custom_shape = bpy.data.objects["neck"] - this_obj.pose.bones["neck"].custom_shape_scale_xyz = (1,1,1) - this_obj.pose.bones["neck"].custom_shape_translation = (0.0,0.035,0.007) - this_obj.pose.bones["neck"].custom_shape_rotation_euler[0] = 1.5708 - - this_obj.pose.bones["foot_ik.L"].use_custom_shape_bone_size = False - this_obj.pose.bones["foot_ik.R"].use_custom_shape_bone_size = False - this_obj.pose.bones["foot_ik.L"].custom_shape = bpy.data.objects["foot1"] - this_obj.pose.bones["foot_ik.R"].custom_shape = bpy.data.objects["foot1"] - - this_obj.pose.bones["thigh_ik_target.L"].custom_shape = bpy.data.objects["npc_primo"] - this_obj.pose.bones["thigh_ik_target.R"].custom_shape = bpy.data.objects["npc_primo"] - this_obj.pose.bones["upper_arm_ik_target.R"].custom_shape = bpy.data.objects["npc_primo"] - this_obj.pose.bones["upper_arm_ik_target.L"].custom_shape = bpy.data.objects["npc_primo"] - - this_obj.pose.bones["thigh_ik_target.L"].custom_shape_scale_xyz[0] = 0.75 - this_obj.pose.bones["thigh_ik_target.L"].custom_shape_scale_xyz[1] = 0.75 - this_obj.pose.bones["thigh_ik_target.L"].custom_shape_scale_xyz[2] = 0.75 - this_obj.pose.bones["thigh_ik_target.R"].custom_shape_scale_xyz[0] = 0.75 - this_obj.pose.bones["thigh_ik_target.R"].custom_shape_scale_xyz[1] = 0.75 - this_obj.pose.bones["thigh_ik_target.R"].custom_shape_scale_xyz[2] = 0.75 - - this_obj.pose.bones["torso"].custom_shape = bpy.data.objects["pelvis2"] - this_obj.pose.bones["torso"].use_custom_shape_bone_size = False - - this_obj.pose.bones["hips"].custom_shape = bpy.data.objects["hips"] - this_obj.pose.bones["hips"].custom_shape_scale_xyz = (1,1,1) - this_obj.pose.bones["hips"].custom_shape_translation = (0.0,-0.04,0.044) - this_obj.pose.bones["hips"].custom_shape_rotation_euler[0] = 1.309 - this_obj.pose.bones["hips"].use_custom_shape_bone_size = False - - this_obj.pose.bones["chest"].custom_shape = bpy.data.objects["chest"] - this_obj.pose.bones["chest"].custom_shape_scale_xyz = (0.6,0.6,0.6) - this_obj.pose.bones["chest"].custom_shape_translation = (0.0,0.18,0.0) - this_obj.pose.bones["chest"].custom_shape_rotation_euler[0] = 1.5708 - this_obj.pose.bones["chest"].use_custom_shape_bone_size = False - - this_obj.pose.bones["shoulder.L"].custom_shape_scale_xyz = (1.6,1.6,1.6) - this_obj.pose.bones["shoulder.R"].custom_shape_scale_xyz = (1.6,1.6,1.6) - - this_obj.pose.bones["foot_heel_ik.L"].custom_shape_translation = (0.0,0.06,0.0) - this_obj.pose.bones["foot_heel_ik.R"].custom_shape_translation = (0.0,0.06,0.0) - - this_obj.pose.bones["foot_spin_ik.R"].custom_shape_translation = (0.0,-0.05,0.02) - this_obj.pose.bones["foot_spin_ik.L"].custom_shape_translation = (0.0,-0.05,0.02) - - this_obj.pose.bones["toe_ik.L"].custom_shape_translation = (0.0,0.06,0.00) - this_obj.pose.bones["toe_ik.R"].custom_shape_translation = (0.0,0.06,0.00) - this_obj.pose.bones["toe_ik.L"].custom_shape_scale_xyz = (0.781,0.781,0.350) - this_obj.pose.bones["toe_ik.R"].custom_shape_scale_xyz = (0.781,0.781,0.350) - - this_obj.pose.bones["hand_ik.R"].use_custom_shape_bone_size = False - this_obj.pose.bones["hand_ik.R"].custom_shape = bpy.data.objects["wrist"] - - this_obj.pose.bones["hand_ik.L"].use_custom_shape_bone_size = False - this_obj.pose.bones["hand_ik.L"].custom_shape = bpy.data.objects["wrist"] - - #this_obj.pose.bones["palm.L"].custom_shape_scale_xyz = (1.2,1.2,1.2) - #this_obj.pose.bones["palm.R"].custom_shape_scale_xyz = (1.2,1.2,1.2) - - - # Merge the armatures; go into object mode and make sure nothing is selected - bpy.ops.object.mode_set(mode='OBJECT') - bpy.ops.object.select_all(action='DESELECT') - - # Select custom face armature - face_rig_obj = bpy.data.objects.get("npc_facerig") - if face_rig_obj: - face_rig_obj.select_set(True) - - # Select eye rig - eye_rig_obj = bpy.data.objects.get("eyerig") - if eye_rig_obj: - eye_rig_obj.select_set(True) - - # Select root rig - root_rig_obj = bpy.data.objects.get("rootrig") - if root_rig_obj: - root_rig_obj.select_set(True) - - # Select pelvis rig - pelvis_rig_obj = bpy.data.objects.get("pelvisrig") - if pelvis_rig_obj: - pelvis_rig_obj.select_set(True) - - # Select foot L rig - foot_l_rig_obj = bpy.data.objects.get("footrig-L") - if foot_l_rig_obj: - foot_l_rig_obj.select_set(True) - - # Select foot R rig - foot_r_rig_obj = bpy.data.objects.get("footrig-R") - if foot_r_rig_obj: - foot_r_rig_obj.select_set(True) - - # Select hand R rig - hand_r_rig_obj = bpy.data.objects.get("handrig-R") - if hand_r_rig_obj: - hand_r_rig_obj.select_set(True) - - # Select hand L rig - hand_l_rig_obj = bpy.data.objects.get("handrig-L") - if hand_l_rig_obj: - hand_l_rig_obj.select_set(True) - - # Select char armature - if our_char: - our_char.select_set(True) - - # Join them - bpy.ops.object.join() - - # Get the intersection point of a line with a perpendicular plane - def project_line_in_space(points1, points2, axis): - x1, y1, z1 = points1 - x2, y2, z2 = points2 - - m = (y2 - y1) / (x2 - x1) if (x2 - x1) != 0 else None - b = y1 - m * x1 if m is not None else None - - if m is None: - return None - - # Intersection point - intersection_x = axis - intersection_y = m * intersection_x + b - intersection_z = z1 + (intersection_y - y1) * (z2 - z1) / (y2 - y1) - - intersection_point = (intersection_x, intersection_y, intersection_z) - return intersection_point - - # Select the object then access it's rig (its obj data) - ob = bpy.data.objects[char_name] - armature = ob.data - - # In edit mode, select platebone and head controller and set their parent bones. - bpy.ops.object.mode_set(mode='EDIT') - armature.edit_bones['plate-border'].parent = armature.edit_bones['head'] - armature.edit_bones['plate-settings'].parent = armature.edit_bones['head'] - - armature.edit_bones['plate-border'].head = armature.edit_bones['neck'].head.copy() - armature.edit_bones['plate-border'].tail = armature.edit_bones['neck'].tail.copy() - armature.edit_bones['plate-border'].head.x = 0.33 - armature.edit_bones['plate-border'].head.y = 0 - armature.edit_bones['plate-border'].tail.y = 0 - armature.edit_bones['plate-border'].tail.x = 0.33 - - armature.edit_bones['plate-settings'].head = armature.edit_bones['head'].head.copy() - armature.edit_bones['plate-settings'].tail = armature.edit_bones['head'].head.copy() - armature.edit_bones['plate-settings'].head.y = 0 - armature.edit_bones['plate-settings'].tail.y = 0 - armature.edit_bones['plate-settings'].head.z += 0.5 - armature.edit_bones['plate-settings'].tail.z += 0.6 - # While here, set inherit scale of limb gears. - armature.edit_bones['upper_arm_parent.L'].inherit_scale="NONE" - armature.edit_bones['upper_arm_parent.R'].inherit_scale="NONE" - armature.edit_bones['thigh_parent.L'].inherit_scale="NONE" - armature.edit_bones['thigh_parent.R'].inherit_scale="NONE" - armature.edit_bones['torso-outer'].inherit_scale="AVERAGE" - - # fix the bad rolls of the torso bone - armature.edit_bones['torso'].roll = 0 - armature.edit_bones['torso-inner'].roll = 0 - armature.edit_bones['torso-outer'].roll = 0 - - armature.edit_bones['torso-inner'].inherit_scale="FULL" - armature.edit_bones['torso'].inherit_scale="FULL" - armature.edit_bones['forearm_tweak-pin.R'].inherit_scale="AVERAGE" - armature.edit_bones['forearm_tweak-pin.L'].inherit_scale="AVERAGE" - armature.edit_bones['shin_tweak-pin.L'].inherit_scale="AVERAGE" - armature.edit_bones['shin_tweak-pin.R'].inherit_scale="AVERAGE" - armature.edit_bones['hand-ik-L'].inherit_scale="AVERAGE" - armature.edit_bones['hand-ik-R'].inherit_scale="AVERAGE" - armature.edit_bones['hand_ik.L'].inherit_scale="FULL" - armature.edit_bones['hand_ik.R'].inherit_scale="FULL" - - if(use_head_tracker): - armature.edit_bones['head-controller'].parent = armature.edit_bones['root'] - - # Fixing Foot spin bone pos for chars with generated feet bones. - if not toe_bones_exist: - armature.edit_bones['foot_spin_ik.L'].head.z = 0 - armature.edit_bones['foot_spin_ik.L'].tail.z = 0 - - armature.edit_bones['foot_spin_ik.R'].head.z = 0 - armature.edit_bones['foot_spin_ik.R'].tail.z = 0 - - # SET RELATIONSHIPS as needed after bringing in new bones - armature.edit_bones['root'].parent = armature.edit_bones['root-inner'] - - armature.edit_bones['torso-outer'].parent = armature.edit_bones['MCH-torso.parent'] - armature.edit_bones['torso'].parent = armature.edit_bones['torso-inner'] - armature.edit_bones['torso_pivot.002'].parent = armature.edit_bones['torso'] - armature.edit_bones['hips'].parent = armature.edit_bones['MCH-torso_pivot.002'] - armature.edit_bones['chest'].parent = armature.edit_bones['MCH-torso_pivot.002'] - armature.edit_bones['MCH-spine.001'].parent = armature.edit_bones['MCH-torso_pivot.002'] - armature.edit_bones['MCH-spine.002'].parent = armature.edit_bones['MCH-torso_pivot.002'] - - armature.edit_bones['ik-pivot-L'].parent = armature.edit_bones['foot_ik.L'] - armature.edit_bones['ik-pivot-R'].parent = armature.edit_bones['foot_ik.R'] - armature.edit_bones['foot_spin_ik.L'].parent = armature.edit_bones['ik-target-L'] - armature.edit_bones['foot_spin_ik.R'].parent = armature.edit_bones['ik-target-R'] - - armature.edit_bones['hand-ik-L'].parent = armature.edit_bones['MCH-hand_ik.parent.L'] - armature.edit_bones['hand-ik-R'].parent = armature.edit_bones['MCH-hand_ik.parent.R'] - armature.edit_bones['hand_ik.L'].parent = armature.edit_bones['mch-hand-ik-pivot-L'] - armature.edit_bones['hand_ik.R'].parent = armature.edit_bones['mch-hand-ik-pivot-R'] - armature.edit_bones['mch-hand-ik-wrist-L'].parent = armature.edit_bones['hand_ik.L'] - armature.edit_bones['mch-hand-ik-wrist-R'].parent = armature.edit_bones['hand_ik.R'] - armature.edit_bones['MCH-upper_arm_ik_target.L'].parent = armature.edit_bones['mch-hand-ik-wrist-L'] - armature.edit_bones['MCH-upper_arm_ik_target.R'].parent = armature.edit_bones['mch-hand-ik-wrist-R'] - - - armature.edit_bones['shoulder_driver.L'].parent = armature.edit_bones['ORG-spine.002'] - armature.edit_bones['shoulder_driver.R'].parent = armature.edit_bones['ORG-spine.002'] - armature.edit_bones['MCH-shoulder_follow.L'].parent = armature.edit_bones['ORG-spine.002'] - armature.edit_bones['MCH-shoulder_follow.R'].parent = armature.edit_bones['ORG-spine.002'] - armature.edit_bones['shoulder.L'].parent = armature.edit_bones['MCH-shoulder_follow.L'] - armature.edit_bones['shoulder.R'].parent = armature.edit_bones['MCH-shoulder_follow.R'] - # RENAME imported bones - rename_bones_list = [("root", "root.002")] - rename_bones_list.append(("root-inner", "root.001")) - rename_bones_list.append(("root-outer", "root")) - - rename_bones_list.append(("torso", "torso.002")) - rename_bones_list.append(("torso-inner", "torso.001")) - rename_bones_list.append(("torso-outer", "torso")) - - rename_bones_list.append(("ik-pivot-L", "foot_ik_pivot.L")) - rename_bones_list.append(("mch-ik-pivot-L", "MCH-foot_ik_pivot.L")) - rename_bones_list.append(("ik-sub-pivot-L", "foot_ik_sub.L")) - rename_bones_list.append(("ik-target-L", "MCH-thigh_ik_target_sub.L")) - - rename_bones_list.append(("ik-pivot-R", "foot_ik_pivot.R")) - rename_bones_list.append(("mch-ik-pivot-R", "MCH-foot_ik_pivot.R")) - rename_bones_list.append(("ik-sub-pivot-R", "foot_ik_sub.R")) - rename_bones_list.append(("ik-target-R", "MCH-thigh_ik_target_sub.R")) - - rename_bones_list.append(("hand_ik.L", "hand_ik_wrist.L")) - rename_bones_list.append(("hand-ik-L", "hand_ik.L")) - rename_bones_list.append(("hand-ik-pivot-L", "hand_ik_pivot.L")) - rename_bones_list.append(("mch-hand-ik-pivot-L", "MCH-hand_ik_pivot.L")) - rename_bones_list.append(("mch-hand-ik-wrist-L", "MCH-hand_ik_wrist.L")) - - rename_bones_list.append(("hand_ik.R", "hand_ik_wrist.R")) - rename_bones_list.append(("hand-ik-R", "hand_ik.R")) - rename_bones_list.append(("hand-ik-pivot-R", "hand_ik_pivot.R")) - rename_bones_list.append(("mch-hand-ik-pivot-R", "MCH-hand_ik_pivot.R")) - rename_bones_list.append(("mch-hand-ik-wrist-R", "MCH-hand_ik_wrist.R")) - - - # TORSO POS fixing - #armature.edit_bones['torso'].roll = -1.5708 - torso_head_pos = armature.edit_bones['torso'].head.copy() - torso_tail_pos = armature.edit_bones['torso'].tail.copy() - - armature.edit_bones['torso-inner'].head = torso_head_pos - armature.edit_bones['torso-inner'].tail = torso_tail_pos - armature.edit_bones['torso-inner'].tail.y += 0.05 - - armature.edit_bones['torso-outer'].head = torso_head_pos - armature.edit_bones['torso-outer'].tail = torso_tail_pos - armature.edit_bones['torso-outer'].tail.y += 0.1 - - armature.edit_bones['torso_pivot.002'].head = torso_head_pos - armature.edit_bones['torso_pivot.002'].tail = torso_tail_pos - - armature.edit_bones['MCH-torso_pivot.002'].head = torso_head_pos - armature.edit_bones['MCH-torso_pivot.002'].tail = torso_tail_pos - armature.edit_bones['MCH-torso_pivot.002'].length -= 0.09 - - # FOOT POS fixing: Remember to use old bone names pre renaming - foot_L_z_diff = armature.edit_bones['foot_ik.L'].tail.z - armature.edit_bones['foot_spin_ik.L'].tail.z - foot_R_z_diff = armature.edit_bones['foot_ik.R'].tail.z - armature.edit_bones['foot_spin_ik.R'].tail.z - - armature.edit_bones['ik-sub-pivot-L'].head = armature.edit_bones['foot_ik.L'].head.copy() - armature.edit_bones['ik-sub-pivot-L'].tail = armature.edit_bones['foot_ik.L'].tail.copy() - - armature.edit_bones['ik-sub-pivot-R'].head = armature.edit_bones['foot_ik.R'].head.copy() - armature.edit_bones['ik-sub-pivot-R'].tail = armature.edit_bones['foot_ik.R'].tail.copy() - - armature.edit_bones['ik-pivot-L'].head = armature.edit_bones['MCH-heel.02_roll2.L'].head.copy() - armature.edit_bones['ik-pivot-L'].tail = armature.edit_bones['MCH-heel.02_roll2.L'].tail.copy() - armature.edit_bones['ik-pivot-L'].tail.y += 0.05 - - armature.edit_bones['ik-pivot-R'].head = armature.edit_bones['MCH-heel.02_roll2.R'].head.copy() - armature.edit_bones['ik-pivot-R'].tail = armature.edit_bones['MCH-heel.02_roll2.R'].tail.copy() - armature.edit_bones['ik-pivot-R'].tail.y += 0.05 - - armature.edit_bones['mch-ik-pivot-L'].head = armature.edit_bones['MCH-heel.02_roll2.L'].head.copy() - armature.edit_bones['mch-ik-pivot-L'].tail = armature.edit_bones['MCH-heel.02_roll2.L'].tail.copy() - - armature.edit_bones['mch-ik-pivot-R'].head = armature.edit_bones['MCH-heel.02_roll2.R'].head.copy() - armature.edit_bones['mch-ik-pivot-R'].tail = armature.edit_bones['MCH-heel.02_roll2.R'].tail.copy() - - armature.edit_bones['ik-target-L'].head = armature.edit_bones['foot_tweak.L'].head.copy() - armature.edit_bones['ik-target-L'].tail = armature.edit_bones['foot_tweak.L'].tail.copy() - - armature.edit_bones['ik-target-R'].head = armature.edit_bones['foot_tweak.R'].head.copy() - armature.edit_bones['ik-target-R'].tail = armature.edit_bones['foot_tweak.R'].tail.copy() - - foot_L_x_diff = armature.edit_bones['ik-sub-pivot-L'].tail.x - armature.edit_bones['foot_spin_ik.L'].tail.x - foot_R_x_diff = armature.edit_bones['ik-sub-pivot-R'].tail.x - armature.edit_bones['foot_spin_ik.R'].tail.x - - armature.edit_bones['MCH-shin_tweak-pin.parent.R'].head = armature.edit_bones['MCH-shin_ik.L'].head.copy() - armature.edit_bones['MCH-shin_tweak-pin.parent.R'].tail.z = armature.edit_bones['MCH-shin_ik.L'].tail.z - armature.edit_bones['MCH-shin_tweak-pin.parent.R'].tail.x = armature.edit_bones['MCH-shin_ik.L'].tail.x - armature.edit_bones['MCH-shin_tweak-pin.parent.R'].roll = 0 - armature.edit_bones['MCH-shin_tweak-pin.parent.R'].length = .02 - - armature.edit_bones['shin_tweak-pin.L'].head = armature.edit_bones['MCH-shin_ik.L'].head.copy() - armature.edit_bones['shin_tweak-pin.L'].tail = armature.edit_bones['MCH-shin_ik.L'].tail.copy() - armature.edit_bones['shin_tweak-pin.L'].roll = armature.edit_bones['MCH-shin_ik.L'].roll - armature.edit_bones['shin_tweak-pin.L'].length -= 0.15 - - armature.edit_bones['MCH-shin_tweak-pin.parent.R'].head = armature.edit_bones['MCH-shin_ik.R'].head.copy() - armature.edit_bones['MCH-shin_tweak-pin.parent.R'].tail.z = armature.edit_bones['MCH-shin_ik.R'].tail.z - armature.edit_bones['MCH-shin_tweak-pin.parent.R'].tail.x = armature.edit_bones['MCH-shin_ik.R'].tail.x - armature.edit_bones['MCH-shin_tweak-pin.parent.R'].roll = 0 - armature.edit_bones['MCH-shin_tweak-pin.parent.R'].length = .02 - - armature.edit_bones['shin_tweak-pin.R'].head = armature.edit_bones['MCH-shin_ik.R'].head.copy() - armature.edit_bones['shin_tweak-pin.R'].tail = armature.edit_bones['MCH-shin_ik.R'].tail.copy() - armature.edit_bones['shin_tweak-pin.R'].roll = armature.edit_bones['MCH-shin_ik.R'].roll - armature.edit_bones['shin_tweak-pin.R'].length -= 0.15 - - # HAND POS Fixing - armature.edit_bones['hand-ik-L'].head = armature.edit_bones['hand_ik.L'].head.copy() - armature.edit_bones['hand-ik-L'].tail = armature.edit_bones['hand_ik.L'].tail.copy() - armature.edit_bones['hand-ik-L'].roll = armature.edit_bones['hand_ik.L'].roll - - armature.edit_bones['hand-ik-pivot-L'].head = armature.edit_bones['hand_ik.L'].head.copy() - armature.edit_bones['hand-ik-pivot-L'].tail = armature.edit_bones['hand_ik.L'].tail.copy() - armature.edit_bones['hand-ik-pivot-L'].roll = armature.edit_bones['hand_ik.L'].roll - - armature.edit_bones['mch-hand-ik-pivot-L'].head = armature.edit_bones['hand_ik.L'].head.copy() - armature.edit_bones['mch-hand-ik-pivot-L'].tail = armature.edit_bones['hand_ik.L'].tail.copy() - armature.edit_bones['mch-hand-ik-pivot-L'].roll = armature.edit_bones['hand_ik.L'].roll - armature.edit_bones['mch-hand-ik-pivot-L'].length -= 0.03 - - armature.edit_bones['mch-hand-ik-wrist-L'].head = armature.edit_bones['hand_ik.L'].head.copy() - armature.edit_bones['mch-hand-ik-wrist-L'].tail = armature.edit_bones['hand_ik.L'].tail.copy() - armature.edit_bones['mch-hand-ik-wrist-L'].roll = armature.edit_bones['hand_ik.L'].roll - armature.edit_bones['mch-hand-ik-wrist-L'].length -= 0.04 - - armature.edit_bones['hand-ik-R'].head = armature.edit_bones['hand_ik.R'].head.copy() - armature.edit_bones['hand-ik-R'].tail = armature.edit_bones['hand_ik.R'].tail.copy() - armature.edit_bones['hand-ik-R'].roll = armature.edit_bones['hand_ik.R'].roll - - armature.edit_bones['hand-ik-pivot-R'].head = armature.edit_bones['hand_ik.R'].head.copy() - armature.edit_bones['hand-ik-pivot-R'].tail = armature.edit_bones['hand_ik.R'].tail.copy() - armature.edit_bones['hand-ik-pivot-R'].roll = armature.edit_bones['hand_ik.R'].roll - - armature.edit_bones['mch-hand-ik-pivot-R'].head = armature.edit_bones['hand_ik.R'].head.copy() - armature.edit_bones['mch-hand-ik-pivot-R'].tail = armature.edit_bones['hand_ik.R'].tail.copy() - armature.edit_bones['mch-hand-ik-pivot-R'].roll = armature.edit_bones['hand_ik.R'].roll - armature.edit_bones['mch-hand-ik-pivot-R'].length -= 0.03 - - armature.edit_bones['mch-hand-ik-wrist-R'].head = armature.edit_bones['hand_ik.R'].head.copy() - armature.edit_bones['mch-hand-ik-wrist-R'].tail = armature.edit_bones['hand_ik.R'].tail.copy() - armature.edit_bones['mch-hand-ik-wrist-R'].roll = armature.edit_bones['hand_ik.R'].roll - armature.edit_bones['mch-hand-ik-wrist-R'].length -= 0.04 - - armature.edit_bones['MCH-forearm_tweak-pin.parent.L'].head = armature.edit_bones['MCH-forearm_ik.L'].head.copy() - armature.edit_bones['MCH-forearm_tweak-pin.parent.L'].tail.z = armature.edit_bones['MCH-forearm_ik.L'].tail.z - armature.edit_bones['MCH-forearm_tweak-pin.parent.L'].tail.x = armature.edit_bones['MCH-forearm_ik.L'].tail.x - armature.edit_bones['MCH-forearm_tweak-pin.parent.L'].roll = 0 - armature.edit_bones['MCH-forearm_tweak-pin.parent.L'].length = .02 - - armature.edit_bones['forearm_tweak-pin.L'].head = armature.edit_bones['MCH-forearm_ik.L'].head.copy() - armature.edit_bones['forearm_tweak-pin.L'].tail = armature.edit_bones['MCH-forearm_ik.L'].tail.copy() - armature.edit_bones['forearm_tweak-pin.L'].roll = armature.edit_bones['MCH-forearm_ik.L'].roll - armature.edit_bones['forearm_tweak-pin.L'].length -= 0.15 - - armature.edit_bones['MCH-forearm_tweak-pin.parent.R'].head = armature.edit_bones['MCH-forearm_ik.R'].head.copy() - armature.edit_bones['MCH-forearm_tweak-pin.parent.R'].tail.z = armature.edit_bones['MCH-forearm_ik.R'].tail.z - armature.edit_bones['MCH-forearm_tweak-pin.parent.R'].tail.x = armature.edit_bones['MCH-forearm_ik.R'].tail.x - armature.edit_bones['MCH-forearm_tweak-pin.parent.R'].roll = 0 - armature.edit_bones['MCH-forearm_tweak-pin.parent.R'].length = .02 - - armature.edit_bones['forearm_tweak-pin.R'].head = armature.edit_bones['MCH-forearm_ik.R'].head.copy() - armature.edit_bones['forearm_tweak-pin.R'].tail = armature.edit_bones['MCH-forearm_ik.R'].tail.copy() - armature.edit_bones['forearm_tweak-pin.R'].roll = armature.edit_bones['MCH-forearm_ik.R'].roll - armature.edit_bones['forearm_tweak-pin.R'].length -= 0.15 - - armature.edit_bones['shoulder_driver.L'].head = project_line_in_space(armature.edit_bones['shoulder.L'].head.copy(),armature.edit_bones['shoulder.L'].tail.copy(), armature.edit_bones['hand_ik.L'].head.x) - armature.edit_bones['shoulder_driver.L'].tail = project_line_in_space(armature.edit_bones['shoulder.L'].head.copy(),armature.edit_bones['shoulder.L'].tail.copy(), armature.edit_bones['hand_ik.L'].head.x) - armature.edit_bones['shoulder_driver.L'].tail.y += 0.1 - - armature.edit_bones['shoulder_driver.R'].head = project_line_in_space(armature.edit_bones['shoulder.R'].head.copy(),armature.edit_bones['shoulder.R'].tail.copy(), armature.edit_bones['hand_ik.R'].head.x) - armature.edit_bones['shoulder_driver.R'].tail = project_line_in_space(armature.edit_bones['shoulder.R'].head.copy(),armature.edit_bones['shoulder.R'].tail.copy(), armature.edit_bones['hand_ik.R'].head.x) - armature.edit_bones['shoulder_driver.R'].tail.y += 0.1 - - armature.edit_bones['MCH-shoulder_follow.L'].head = armature.edit_bones['shoulder.L'].head.copy() - armature.edit_bones['MCH-shoulder_follow.L'].tail = armature.edit_bones['shoulder.L'].tail.copy() - - armature.edit_bones['MCH-shoulder_follow.R'].head = armature.edit_bones['shoulder.R'].head.copy() - armature.edit_bones['MCH-shoulder_follow.R'].tail = armature.edit_bones['shoulder.R'].tail.copy() - - try: - armature.edit_bones["DEF-eye.L"].name = "+EyeBone L A01" - armature.edit_bones["DEF-eye.R"].name = "+EyeBone R A01" - - # Properly finish the parenting of the eye rig we imported! - armature.edit_bones['eyetrack'].parent = armature.edit_bones['head'] - armature.edit_bones['+EyeBone R A01.001'].parent = armature.edit_bones['head'] - armature.edit_bones['+EyeBone L A01.001'].parent = armature.edit_bones['head'] - - # Now we need to position them to the existing bones. - eye_R_head_pos = armature.edit_bones['+EyeBone R A01'].head - eye_L_head_pos = armature.edit_bones['+EyeBone L A01'].head - - - armature.edit_bones['+EyeBone R A01.001'].head = eye_R_head_pos - armature.edit_bones['+EyeBone R A01.001'].tail.x = eye_R_head_pos[0] - armature.edit_bones['+EyeBone R A01.001'].tail.y = armature.edit_bones['+EyeBone R A01'].tail.y - armature.edit_bones['+EyeBone R A01.001'].tail.z = eye_R_head_pos[2] - - armature.edit_bones['+EyeBone L A01.001'].head = eye_L_head_pos - armature.edit_bones['+EyeBone L A01.001'].tail.x = eye_L_head_pos[0] - armature.edit_bones['+EyeBone L A01.001'].tail.y = armature.edit_bones['+EyeBone L A01'].tail.y - armature.edit_bones['+EyeBone L A01.001'].tail.z = eye_L_head_pos[2] - - armature.edit_bones['eyetrack_R'].head.x = eye_R_head_pos[0] - armature.edit_bones['eyetrack_R'].head.z = eye_R_head_pos[2] - - armature.edit_bones['eyetrack_R'].tail.x = eye_R_head_pos[0] - armature.edit_bones['eyetrack_R'].tail.z = eye_R_head_pos[2] + 0.01 - - armature.edit_bones['eyetrack_L'].head.x = eye_L_head_pos[0] - armature.edit_bones['eyetrack_L'].head.z = eye_L_head_pos[2] - - armature.edit_bones['eyetrack_L'].tail.x = eye_L_head_pos[0] - armature.edit_bones['eyetrack_L'].tail.z = eye_L_head_pos[2] + 0.01 - - armature.edit_bones['eyetrack'].head.x = (eye_R_head_pos[0]+eye_L_head_pos[0])/2 - armature.edit_bones['eyetrack'].head.z = (eye_R_head_pos[2]+eye_L_head_pos[2])/2 - - armature.edit_bones['eyetrack'].tail.x = (eye_R_head_pos[0]+eye_L_head_pos[0])/2 - armature.edit_bones['eyetrack'].tail.z = armature.edit_bones['eyetrack_L'].tail.z - except: - pass - - - # Still in edit mode, select Neck/Head bone and extract the Z loc - neck_bone = armature.edit_bones['neck'] - neck_pos = neck_bone.head[2] - - if(use_head_tracker): - # Let's position our head controller bone here. We need it to match our head bone's position - head_bone = armature.edit_bones['head'] - head_pos_head2 = head_bone.head[2] - head_pos_tail2 = head_bone.tail[2] - head_pos_head1 = head_bone.head[1] - head_pos_tail1 = head_bone.tail[1] - - # Select the head controller bone and position w/ head bone's location. - head_cont_bone = armature.edit_bones['head-controller'] - head_cont_bone.head[0] = 0 - head_cont_bone.head[1] = -0.3 - head_cont_bone.head[2] = head_pos_head2 - head_cont_bone.tail[0] = 0 - head_cont_bone.tail[1] = -0.3 - head_cont_bone.tail[2] = head_pos_tail2 - - # Delete ugly lines that connect to the pole bones. - def del_bone(bone_name): - to_del = armature.edit_bones.get(bone_name) - armature.edit_bones.remove(to_del) - - del_bone("VIS_upper_arm_ik_pole.L") - del_bone("VIS_upper_arm_ik_pole.R") - del_bone("VIS_thigh_ik_pole.L") - del_bone("VIS_thigh_ik_pole.R") - - # In pose mode select the rig, then select the bone - bpy.ops.object.mode_set(mode='POSE') - faceplate_arm = bpy.context.scene.objects[char_name] - selected_bone = faceplate_arm.pose.bones["Plate"] - - # Change the values to what we want, use neckpos to base the height off the ground. - selected_bone.location[0] = .33 - #selected_bone.location[1] = 0.9 - selected_bone.location[2] = neck_pos - selected_bone.rotation_quaternion[1] = 1 - selected_bone.scale[0] = 0.1 - selected_bone.scale[1] = 0.1 - selected_bone.scale[2] = 0.1 - - # Begin moving extra wgt bones to the wgt collection while discarding old collections - # 1 Root and Eye Bones - move_into_collection("eye circle","wgt") - move_into_collection("eye controller","wgt") - move_into_collection("root plate","wgt") - move_into_collection("head-control-shape","wgt") - - # 1 Face Bones - to_del_coll = bpy.data.collections.get("wgt.001") - for obj in to_del_coll.objects: - move_into_collection(obj.name,"wgt") - - # 2 Pelvis Bones - to_del_coll = bpy.data.collections.get("wgt.002") - for obj in to_del_coll.objects: - move_into_collection(obj.name,"wgt") - - # 3 feet Bones - to_del_coll = bpy.data.collections.get("wgt.003") - for obj in to_del_coll.objects: - move_into_collection(obj.name,"wgt") - - # 4 hand Bones - to_del_coll = bpy.data.collections.get("wgt.004") - for obj in to_del_coll.objects: - move_into_collection(obj.name,"wgt") - # 5 NPC widgt - to_del_coll = bpy.data.collections.get("wgt.005") - for obj in to_del_coll.objects: - move_into_collection(obj.name,"wgt") - - # After moving into collection, delete the old empty ones. - bpy.data.collections.remove(bpy.data.collections.get("append_Root"),do_unlink=True) - bpy.data.collections.remove(bpy.data.collections.get("append_NPC Plate"),do_unlink=True) - bpy.data.collections.remove(bpy.data.collections.get("append_Eyes"),do_unlink=True) - bpy.data.collections.remove(bpy.data.collections.get("append_Pelvis"),do_unlink=True) - bpy.data.collections.remove(bpy.data.collections.get("append_Foot"),do_unlink=True) - bpy.data.collections.remove(bpy.data.collections.get("append_Hand"),do_unlink=True) - - # Adding Shape Key Drivers - ourRig = char_name - - # Let's go into object mode and select the three face parts to begin adding shape key drivers - bpy.ops.object.mode_set(mode='OBJECT') - bpy.ops.object.select_all(action='DESELECT') - - bpy.ops.object.select_all(action='DESELECT') - - - def makeCon(shape_key,bone_name,expression,transform): - # Get the bone object by name - armature = bpy.context.scene.objects[ourRig] - bone = armature.pose.bones[bone_name] - - # Create a driver for the shape key - shape_key = obj.data.shape_keys.key_blocks[shape_key] - driver = shape_key.driver_add("value").driver - - # Create variables for the driver - var = driver.variables.new() - var.name = "bone" - var.type = 'TRANSFORMS' - var.targets[0].id = armature - var.targets[0].bone_target = bone_name - var.targets[0].transform_space = 'LOCAL_SPACE' - var.targets[0].transform_type = transform - - # Create the scripted expression driver - driver.type = 'SCRIPTED' - driver.expression = expression - - # Update the dependencies - depsgraph = bpy.context.evaluated_depsgraph_get() - depsgraph.update() - - # NPC SHAPE KEYS - # Get the selected object with the shape key - obj = bpy.data.objects.get("Body") - # not all npcs have face fat/strong, so attempt on their own. - has_extra_faces = True - try: - makeCon("Face_Strong","Face-Strong-Control","bone * -2.22","LOC_Y") - makeCon("Face_Fat","Face-Fat-Control","bone * -2.22","LOC_Y") - except: - has_extra_faces = False - - try: - makeCon("Eye_Angry","Eye-Hostility-Control","bone * -2.22","LOC_Y") - makeCon("Eye_Sad","Eye-Wail-Control","bone * -2.22","LOC_Y") - makeCon("Eye_WinkA","WinkA-Invis","bone * -1","LOC_Y") - makeCon("Eye_WinkB","WinkB-Invis","bone * -1","LOC_Y") - - makeCon("Mouth_A","Mouth-A-Control","bone * 1.67","LOC_X") - makeCon("Mouth_Angry","Mouth-Angry-Control","bone * 1.67","LOC_X") - makeCon("Mouth_Smile","Mouth-Smile-Control","bone * 1.67","LOC_X") - - except: - pass - - # Special drivers for pushing pupils back on blink - def makeCon2(shape_key,bn1,bn2,expression,transform): - # Get the bone object by name - armature = bpy.context.scene.objects[ourRig] - bone = armature.pose.bones[bn1] - - # Create a driver for the shape key - shape_key = obj.data.shape_keys.key_blocks[shape_key] - driver = shape_key.driver_add("value").driver - - # Create variables for the driver - var = driver.variables.new() - var.name = "invisA" - var.type = 'TRANSFORMS' - var.targets[0].id = armature - var.targets[0].bone_target = bn1 - var.targets[0].transform_space = 'LOCAL_SPACE' - var.targets[0].transform_type = transform - - # Create variables for the driver - var1 = driver.variables.new() - var1.name = "invisB" - var1.type = 'TRANSFORMS' - var1.targets[0].id = armature - var1.targets[0].bone_target = bn2 - var1.targets[0].transform_space = 'LOCAL_SPACE' - var1.targets[0].transform_type = transform - - # Create the scripted expression driver - driver.type = 'SCRIPTED' - driver.expression = expression - - # Update the dependencies - depsgraph = bpy.context.evaluated_depsgraph_get() - depsgraph.update() - - obj = bpy.data.objects.get("Body") - - # Pupils shape key driver is set up below. Like Eye Star, the shape key has to be made FIRST before adding a driver - - if(use_head_tracker): - # Since we're still in object mode, here we can add the head pole object in the neck to track head movement - bpy.ops.object.empty_add(type='PLAIN_AXES', align='WORLD', location=(0, 0, 0), scale=(1, 1, 1)) - bpy.data.objects["Empty"].name = "Head_Pole" - bpy.data.objects["Head_Pole"].empty_display_size = 0.01 - bpy.data.objects["Head_Pole"].parent = bpy.data.objects[char_name] - bpy.data.objects["Head_Pole"].parent_type = "BONE" - bpy.data.objects["Head_Pole"].parent_bone = "neck" - - # Let's go into object mode and select the body for the pupil shape keys, and to control our glow sliders. - bpy.ops.object.select_all(action='DESELECT') - obj = bpy.data.objects.get("Body") - bpy.ops.object.select_all(action='DESELECT') - - - # Going into pose mode with our character selected. - bpy.ops.object.select_all(action='DESELECT') - our_char = bpy.data.objects.get(char_name) - if our_char: - our_char.select_set(True) - bpy.context.view_layer.objects.active = our_char - - bpy.ops.object.mode_set(mode='POSE') - - - # Disable IK Stretching & Turn on IK Poles. Toggle manually as needed. - if disallow_leg_ik_stretch: - bpy.data.objects[char_name].pose.bones["thigh_parent.L"]["IK_Stretch"] = 0.0 - bpy.data.objects[char_name].pose.bones["thigh_parent.R"]["IK_Stretch"] = 0.0 - - if disallow_arm_ik_stretch: - bpy.data.objects[char_name].pose.bones["upper_arm_parent.L"]["IK_Stretch"] = 0.0 - bpy.data.objects[char_name].pose.bones["upper_arm_parent.R"]["IK_Stretch"] = 0.0 - - if use_arm_ik_poles: - bpy.data.objects[char_name].pose.bones["upper_arm_parent.L"]["pole_vector"] = 1 - bpy.data.objects[char_name].pose.bones["upper_arm_parent.R"]["pole_vector"] = 1 - - if use_leg_ik_poles: - bpy.data.objects[char_name].pose.bones["thigh_parent.L"]["pole_vector"] = 1 - bpy.data.objects[char_name].pose.bones["thigh_parent.R"]["pole_vector"] = 1 - - bpy.data.objects[char_name].pose.bones["torso"]["head_follow"] = 1.0 - bpy.data.objects[char_name].pose.bones["upper_arm_parent.L"]["IK_parent"] = 4 - bpy.data.objects[char_name].pose.bones["upper_arm_parent.R"]["IK_parent"] = 4 - - def add_shoulder_const(follow, driver, hand): - armature = bpy.context.scene.objects[ourRig] - - # make shoulder follow driver bone - this_bone = bpy.context.scene.objects[char_name].pose.bones[follow] - co = this_bone.constraints.new('DAMPED_TRACK') - co.target = our_char - co.subtarget = driver - - # make driver bone follow hand - drive = bpy.context.scene.objects[char_name].pose.bones[driver] - co2 = drive.constraints.new('COPY_LOCATION') - co2.target = our_char - co2.subtarget = hand - co2.target_space = "LOCAL_OWNER_ORIENT" - co2.owner_space = "LOCAL" - - # make driver to control influence - driver = co.driver_add("influence").driver - var = driver.variables.new() - var.name = "bone" - var.type = 'SINGLE_PROP' - - var.targets[0].id = armature - var.targets[0].data_path = "pose.bones[\"plate-settings\"][\"Toggle Shoulder Constraints\"]" - driver.type = 'SCRIPTED' - driver.expression = "(bone * 0.4)" - - depsgraph = bpy.context.evaluated_depsgraph_get() - depsgraph.update() - - - add_shoulder_const("MCH-shoulder_follow.L","shoulder_driver.L","hand-ik-L") - add_shoulder_const("MCH-shoulder_follow.R","shoulder_driver.R","hand-ik-R") - def add_eye_bone_const(bone_name, to_bone): - this_bone = bpy.context.scene.objects[char_name].pose.bones[bone_name] - co = this_bone.constraints.new('COPY_ROTATION') - co.target = our_char - co.subtarget = to_bone - co.target_space = "LOCAL_OWNER_ORIENT" - co.owner_space = "LOCAL" - - try: - add_eye_bone_const("+EyeBone R A01", "+EyeBone R A01.001") - add_eye_bone_const("+EyeBone L A01", "+EyeBone L A01.001") - except: - pass - - # Let's add empty 'child of' constraints to limbs, torso and root. Ready to use in case char holds obj/stands on obj - def add_child_of(bone_name): - this_bone = bpy.context.scene.objects[char_name].pose.bones[bone_name] - co = this_bone.constraints.new('CHILD_OF') - - if add_child_of_constraints: - add_child_of("hand-ik-L") - add_child_of("hand-ik-R") - add_child_of("foot_ik.R") - add_child_of("foot_ik.L") - add_child_of("torso-outer") - add_child_of("root") - - - if(use_head_tracker): - - # Here we can set up the two damped track constraints to make the head follow the controller bone. - # This makes the head bone follow the controller - head_controller = bpy.context.scene.objects[char_name].pose.bones["head"] - co = head_controller.constraints.new('DAMPED_TRACK') - head_track_const = bpy.data.objects[char_name].pose.bones["head"].constraints["Damped Track"] - head_track_const.target = our_char - head_track_const.subtarget = "head-controller" - head_track_const.track_axis = "TRACK_Z" - - # This makes the controller follow the obj in the neck to keep it 'on' the head. - head_pole_cont = bpy.context.scene.objects[char_name].pose.bones["head-controller"] - co2 = head_pole_cont.constraints.new('DAMPED_TRACK') - head_pole_const = bpy.data.objects[char_name].pose.bones["head-controller"].constraints["Damped Track"] - head_pole_const.target = bpy.data.objects.get("Head_Pole") - head_pole_const.track_axis = "TRACK_NEGATIVE_Z" - - # We can now make our final bone groups look good! - def assign_bone_to_group(bone_name, group_name): - if not is_version_4: - # Switch to object mode - bpy.ops.object.mode_set(mode='OBJECT') - - # Get the armature object - armature_obj = our_char - if not armature_obj or armature_obj.type != 'ARMATURE': - return - - # Switch to pose mode - bpy.context.view_layer.objects.active = armature_obj - bpy.ops.object.mode_set(mode='POSE') - - # Get the pose bone - pose_bone = armature_obj.pose.bones.get(bone_name) - if not pose_bone: - return - - # Get the bone group - bone_group = armature_obj.pose.bone_groups.get(group_name) - if not bone_group: - # Create a new bone group if it doesn't exist - bone_group = armature_obj.pose.bone_groups.new(name=group_name) - - # Assign the bone to the bone group - pose_bone.bone_group = bone_group - - # New 4.0 functionality: change the bone itself to the color of the group it was originally assigned to. - else: - # 4.0: Armature bones or Pose bones? - bone = bpy.context.object.pose.bones[bone_name] - - if group_name == "Root": - bone.color.palette = 'CUSTOM' - bone.color.custom.normal = (0,1,0.169) - bone.color.custom.select = (0.184,1,0.713) - bone.color.custom.active = (0.125,0.949,0.816) - elif group_name == "Torso": - bone.color.palette = 'CUSTOM' - bone.color.custom.normal = (1,0.867,0) - bone.color.custom.select = (1,0.671,0.502) - bone.color.custom.active = (0.949,0.431,0) - elif group_name == "Limbs L": - bone.color.palette = 'CUSTOM' - bone.color.custom.normal = (1,0,1) - bone.color.custom.select = (1,0.129,0.467) - bone.color.custom.active = (1,0.518,0.969) - elif group_name == "Limbs R": - bone.color.palette = 'CUSTOM' - bone.color.custom.normal = (0,0.839,1) - bone.color.custom.select = (0.227,0.357,0.902) - bone.color.custom.active = (0.035,0.333,0.878) - elif group_name == "Face": - bone.color.palette = 'CUSTOM' - bone.color.custom.normal = (1,0,0) - bone.color.custom.select = (0.506,0.902,0.078) - bone.color.custom.active = (0.094,0.714,0.878) - - # Root BG - assign_bone_to_group("root", "Root") - assign_bone_to_group("root-outer", "Root") - assign_bone_to_group("root-inner", "Root") - - # Torso BG - assign_bone_to_group("torso", "Torso") - assign_bone_to_group("torso-inner", "Torso") - assign_bone_to_group("torso-outer", "Torso") - assign_bone_to_group("torso_pivot.002", "Torso") - assign_bone_to_group("hips", "Torso") - assign_bone_to_group("chest", "Torso") - assign_bone_to_group("neck", "Torso") - assign_bone_to_group("head-controller", "Torso") - assign_bone_to_group("head", "Torso") - - # Left Arm BG - assign_bone_to_group("hand_ik.L", "Limbs L") - assign_bone_to_group("upper_arm_ik_target.L", "Limbs L") - assign_bone_to_group("shoulder.L", "Limbs L") - assign_bone_to_group("hand-ik-pivot-L", "Limbs L") - assign_bone_to_group("hand-ik-L", "Limbs L") - assign_bone_to_group("upper_arm_parent.L", "Limbs L") - assign_bone_to_group("forearm_tweak-pin.L", "Limbs L") - if not use_arm_ik_poles: - assign_bone_to_group("upper_arm_ik.L", "Limbs L") - - # Right Arm BG - assign_bone_to_group("hand_ik.R", "Limbs R") - assign_bone_to_group("upper_arm_ik_target.R", "Limbs R") - assign_bone_to_group("shoulder.R", "Limbs R") - assign_bone_to_group("hand-ik-pivot-R", "Limbs R") - assign_bone_to_group("hand-ik-R", "Limbs R") - assign_bone_to_group("upper_arm_parent.R", "Limbs R") - assign_bone_to_group("forearm_tweak-pin.R", "Limbs R") - if not use_arm_ik_poles: - assign_bone_to_group("upper_arm_ik.R", "Limbs R") - - # Left Foot BG - assign_bone_to_group("foot_ik.L", "Limbs L") - assign_bone_to_group("toe_ik.L", "Limbs L") - assign_bone_to_group("foot_spin_ik.L", "Limbs L") - assign_bone_to_group("foot_heel_ik.L", "Limbs L") - assign_bone_to_group("thigh_ik_target.L", "Limbs L") - assign_bone_to_group("ik-pivot-L", "Limbs L") - assign_bone_to_group("ik-sub-pivot-L", "Limbs L") - assign_bone_to_group("thigh_parent.L", "Limbs L") - assign_bone_to_group("shin_tweak-pin.L", "Limbs L") - if not use_leg_ik_poles: - assign_bone_to_group("thigh_ik.L", "Limbs L") - - # Right Foot BG - assign_bone_to_group("foot_ik.R", "Limbs R") - assign_bone_to_group("toe_ik.R", "Limbs R") - assign_bone_to_group("foot_spin_ik.R", "Limbs R") - assign_bone_to_group("foot_heel_ik.R", "Limbs R") - assign_bone_to_group("thigh_ik_target.R", "Limbs R") - assign_bone_to_group("ik-pivot-R", "Limbs R") - assign_bone_to_group("ik-sub-pivot-R", "Limbs R") - assign_bone_to_group("thigh_parent.R", "Limbs R") - assign_bone_to_group("shin_tweak-pin.R", "Limbs R") - if not use_leg_ik_poles: - assign_bone_to_group("thigh_ik.R", "Limbs R") - - # Face BG - assign_bone_to_group("Mouth-A-Control", "Face") - assign_bone_to_group("Mouth-Smile-Control", "Face") - assign_bone_to_group("Mouth-Angry-Control", "Face") - - assign_bone_to_group("Eye-Hostility-Control", "Face") - assign_bone_to_group("Eye-Wail-Control", "Face") - assign_bone_to_group("Eye-WinkA-Control", "Face") - assign_bone_to_group("Eye-WinkB-Control", "Face") - assign_bone_to_group("Wink-Control", "Face") - if has_extra_faces: - assign_bone_to_group("Face-Strong-Control", "Face") - assign_bone_to_group("Face-Fat-Control", "Face") - - assign_bone_to_group("eyetrack", "Face") - assign_bone_to_group("eyetrack_L", "Face") - assign_bone_to_group("eyetrack_R", "Face") - assign_bone_to_group("plate-settings", "Face") - - try: - this_obj.pose.bones["eyetrack_L"].custom_shape_scale_xyz = (2,2,2) - this_obj.pose.bones["eyetrack_R"].custom_shape_scale_xyz = (2,2,2) - this_obj.pose.bones["eyetrack"].custom_shape_scale_xyz = (6.5,5,1) - except: - pass - - # Default bone group colors are ugly. We can change them. - def change_bone_group_colors(bone_group_name, color1, color2, color3): - active_bg = bpy.context.active_object.pose.bone_groups[bone_group_name] - active_bg.color_set = "CUSTOM" - active_bg.colors.normal = Color((color1)) - active_bg.colors.select = Color((color2)) - active_bg.colors.active = Color((color3)) - - if not is_version_4: - change_bone_group_colors('Root',(0,1,0.169),(0.184,1,0.713),(0.125,0.949,0.816)) - change_bone_group_colors('Torso',(1,0.867,0),(1,0.671,0.502),(0.949,0.431,0)) - change_bone_group_colors('Limbs L',(1,0,1),(1,0.129,0.467),(1,0.518,0.969)) - change_bone_group_colors('Limbs R',(0,0.839,1),(0.227,0.357,0.902),(0.035,0.333,0.878)) - change_bone_group_colors('Face',(1,0,0),(0.506,0.902,0.078),(0.094,0.714,0.878)) - - # Automatically builds the constraint stuff for SWITCH PARENT. DO NOT FORGET TO REENABLE THE CONSTRAINTS BELOW!!!!!! - def generate_switch_parent_constraints(toggle_parent, location_of_switcher): - const = this_obj.pose.bones[toggle_parent].constraints["SWITCH PARENT"] - const.targets[0].target = bpy.data.objects[char_name] - const.targets[0].subtarget = "root" - - const.targets[1].target = bpy.data.objects[char_name] - const.targets[1].subtarget = "root.001" - - const.targets[2].target = bpy.data.objects[char_name] - const.targets[2].subtarget = "root.002" - - const.targets[3].target = bpy.data.objects[char_name] - const.targets[3].subtarget = "torso.002" - - const.targets[4].target = bpy.data.objects[char_name] - const.targets[4].subtarget = "chest" - - location_str = "pose.bones[\"" + location_of_switcher + "\"][\"parent_switch\"]" - - for x in range(5): - driver = const.targets[x].driver_add("weight").driver - var = driver.variables.new() - var.name = "toggle" - var.type = 'SINGLE_PROP' - var.targets[0].id = bpy.context.scene.objects[ourRig] - var.targets[0].data_path = location_str - - driver.type = 'SCRIPTED' - driver.expression = "toggle == " + str(x+1) - - depsgraph = bpy.context.evaluated_depsgraph_get() - depsgraph.update() - - # Toggle the constraint off, we HAVE to reenable it later to work!! - const.enabled = False - - if use_head_tracker: - generate_switch_parent_constraints("MCH-head-controller-parent","head-controller") - - # REENABLE THE CONSTRAINT BELOW. - generate_switch_parent_constraints("MCH-forearm_tweak-pin.parent.L","forearm_tweak-pin.L") - generate_switch_parent_constraints("MCH-forearm_tweak-pin.parent.R","forearm_tweak-pin.R") - generate_switch_parent_constraints("MCH-shin_tweak-pin.parent.L","shin_tweak-pin.L") - generate_switch_parent_constraints("MCH-shin_tweak-pin.parent.R","shin_tweak-pin.R") - - # For each tweak bone, we make the custom property, the constraint and driver. - def prepare_tweak_bone(tweak_bone, pin_bone): - # Make Custom Property - cust_bone = this_obj.pose.bones[tweak_bone] - cust_bone["tweak_pin"] = 0.00 - # Setting the min/max ranges: https://blender.stackexchange.com/a/258099 - id_prop = cust_bone.id_properties_ui("tweak_pin") - id_prop.update(min=0.0,max=1.0) - - # Make Constraint - con = this_obj.pose.bones[tweak_bone].constraints.new('COPY_LOCATION') - con.target = our_char - con.subtarget = pin_bone - - path_str = "pose.bones[\"" + tweak_bone+"\"][\"tweak_pin\"]" - - driver = con.driver_add("influence").driver - driver.type = 'SUM' - var = driver.variables.new() - var.name = "bone" - var.type = 'SINGLE_PROP' - var.targets[0].id = bpy.context.scene.objects[ourRig] - var.targets[0].data_path = path_str - depsgraph = bpy.context.evaluated_depsgraph_get() - depsgraph.update() - - prepare_tweak_bone("forearm_tweak.L", "forearm_tweak-pin.L") - prepare_tweak_bone("forearm_tweak.R", "forearm_tweak-pin.R") - prepare_tweak_bone("shin_tweak.L", "shin_tweak-pin.L") - prepare_tweak_bone("shin_tweak.R", "shin_tweak-pin.R") - - # To repair the now missing custom property, let's remake it. - def make_torso_custom(): - cust_bone = this_obj.pose.bones["torso-outer"] - cust_bone["torso_parent"] = 1 - id_prop = cust_bone.id_properties_ui("torso_parent") - id_prop.update(min=0,max=2) - - make_torso_custom() - - # Fix NPC spaces - this_obj.pose.bones["MCH-ROT-neck"].constraints["Copy Rotation"].owner_space = 'LOCAL' - this_obj.pose.bones["MCH-ROT-neck"].constraints["Copy Rotation"].target_space = 'LOCAL' - this_obj.pose.bones["MCH-ROT-neck"].constraints["Copy Scale"].target_space = 'LOCAL' - this_obj.pose.bones["MCH-ROT-neck"].constraints["Copy Scale"].owner_space = 'LOCAL' - - # Adjustments to positioning - this_obj.pose.bones["foot_ik.L"].custom_shape_transform = bpy.data.objects[char_name].pose.bones["mch-ik-pivot-L"] - this_obj.pose.bones["foot_ik.R"].custom_shape_transform = bpy.data.objects[char_name].pose.bones["mch-ik-pivot-R"] - this_obj.pose.bones["hand-ik-L"].custom_shape_transform = bpy.data.objects[char_name].pose.bones["mch-hand-ik-pivot-L"] - this_obj.pose.bones["hand-ik-R"].custom_shape_transform = bpy.data.objects[char_name].pose.bones["mch-hand-ik-pivot-R"] - - this_obj.pose.bones["ik-sub-pivot-L"].custom_shape_translation = (foot_L_x_diff*-1.0, 0.0, foot_L_z_diff*-1.0) - this_obj.pose.bones["ik-sub-pivot-R"].custom_shape_translation = (foot_R_x_diff*-1.0, 0.0, foot_R_z_diff*-1.0) - - # Penultimate: Rename bones as needed - for oldname, newname in rename_bones_list: - bone = bpy.context.object.pose.bones.get(oldname) - if bone is None: - continue - bone.name = newname - - # We have to nuke the existing driver in the torso. - def nuke_old_torso_const(): - const = this_obj.pose.bones["MCH-torso.parent"].constraints - to_del = [c for c in const] - for c in to_del: - const.remove(c) - - new = const.new('ARMATURE') - new.name = 'SWITCH_PARENT' - # add target - new.targets.new() - new.targets[0].target = bpy.data.objects[char_name] - new.targets[0].subtarget = "root.002" - - location_str = "pose.bones[\"torso\"][\"torso_parent\"]" - - driver = new.targets[0].driver_add("weight").driver - for variable in driver.variables: - if variable.type == 'SINGLE_PROP': - variable.targets[0].data_path = location_str - #var = driver.variables.new() - #driver.variables[0].targets[0].data_path = location_str - #var[0].name = "toggle" - #var.type = 'SINGLE_PROP' - #var.targets[0].id = bpy.context.scene.objects[ourRig] - #var.targets[0].data_path = location_str - - #driver.type = 'SCRIPTED' - driver.expression = "var == 1" - - depsgraph = bpy.context.evaluated_depsgraph_get() - depsgraph.update() - - # Toggle the constraint off, we HAVE to reenable it later to work!! - new.enabled = False - - nuke_old_torso_const() - - # Use this to swap a variable in a constraint - def swap_const_follow_in_const(bone, constraint_type, new_var): - const = this_obj.pose.bones[bone].constraints - for c in const: - if c.type == constraint_type: - const.remove(c) - - new = const.new(constraint_type) - new.target = bpy.data.objects[char_name] - new.subtarget = "torso.002" - - driver = new.driver_add("influence").driver - driver.type = 'SUM' - for variable in driver.variables: - if variable.type == 'SINGLE_PROP': - variable.targets[0].data_path = new_var - - depsgraph = bpy.context.evaluated_depsgraph_get() - depsgraph.update() - - swap_const_follow_in_const("MCH-ROT-head","COPY_ROTATION","pose.bones[\"plate-settings\"][\"Head Follow\"]") - swap_const_follow_in_const("MCH-ROT-neck","COPY_ROTATION","pose.bones[\"plate-settings\"][\"Neck Follow\"]") - - # Delete all existing bone collections, and make new ones. - if is_version_4: - armature = bpy.context.object.data - collections = armature.collections - for coll in collections: - collections.remove(coll) - - collections.new("Tweaks") - collections.new("Pivots & Pins") - collections.new("Offsets") - collections.new("Face") - collections.new("Torso (IK)") - collections.new("Torso (FK)") - collections.new("Fingers") - collections.new("Fingers (Detail)") - collections.new("Arm.L (IK)") - collections.new("Arm.R (IK)") - collections.new("Arm.L (FK)") - collections.new("Arm.R (FK)") - collections.new("Leg.L (IK)") - collections.new("Leg.R (IK)") - collections.new("Leg.L (FK)") - collections.new("Leg.R (FK)") - collections.new("Root") - collections.new("Other") - - for bone in armature.bones: - collections["Other"].assign(bone) - #Thanks Enthralpy for the code to ensure that the arm/leg "gears" are moveable. - for bone in ['thigh_parent.L', 'thigh_parent.R', 'upper_arm_parent.L', 'upper_arm_parent.R']: - this_obj.pose.bones[bone].custom_shape_transform = None - this_obj.pose.bones[bone].lock_location[0] = False - this_obj.pose.bones[bone].lock_location[1] = False - this_obj.pose.bones[bone].lock_location[2] = False - this_obj.pose.bones[bone].lock_rotation_w = False - this_obj.pose.bones[bone].lock_rotation[0] = False - this_obj.pose.bones[bone].lock_rotation[1] = False - this_obj.pose.bones[bone].lock_rotation[2] = False - this_obj.pose.bones[bone].lock_scale[0] = False - this_obj.pose.bones[bone].lock_scale[1] = False - this_obj.pose.bones[bone].lock_scale[2] = False - - # Customize bones - this_obj.pose.bones[bone].custom_shape = bpy.data.objects["npc_settings"] - this_obj.pose.bones[bone].custom_shape_scale_xyz=(0.5,0.5,0.5) - this_obj.pose.bones[bone].use_custom_shape_bone_size = False - - if "upper_arm" in bone: - if ".L" in bone: - this_obj.pose.bones[bone].custom_shape_translation=(-0.05,0.0,0.0) - this_obj.pose.bones[bone].custom_shape_rotation_euler=(0,-1.5708,0) - this_obj.pose.bones[bone].custom_shape_transform = this_obj.pose.bones["MCH-upper_arm_parent_widget.L"] - else: - this_obj.pose.bones[bone].custom_shape_translation=(0.05,0.0,0.0) - this_obj.pose.bones[bone].custom_shape_rotation_euler=(0,-1.5708,0) - this_obj.pose.bones[bone].custom_shape_transform = this_obj.pose.bones["MCH-upper_arm_parent_widget.R"] - else: - if ".L" in bone: - this_obj.pose.bones[bone].custom_shape_translation=(0.1,0,0) - this_obj.pose.bones[bone].custom_shape_rotation_euler=(-0.0820305, -1.5708, 0) - this_obj.pose.bones[bone].custom_shape_transform = this_obj.pose.bones["MCH-thigh_parent_widget.L"] - else: - this_obj.pose.bones[bone].custom_shape_translation=(-0.1,0,0) - this_obj.pose.bones[bone].custom_shape_rotation_euler=(-0.0820305, 1.5708, 0) - this_obj.pose.bones[bone].custom_shape_transform = this_obj.pose.bones["MCH-thigh_parent_widget.R"] - - # ENABLE CONSTRAINTS AGAIN HERE - if use_head_tracker: - this_obj.pose.bones["MCH-head-controller-parent"].constraints[0].enabled = True - this_obj.pose.bones["MCH-forearm_tweak-pin.parent.L"].constraints[0].enabled = True - this_obj.pose.bones["MCH-forearm_tweak-pin.parent.R"].constraints[0].enabled = True - this_obj.pose.bones["MCH-shin_tweak-pin.parent.L"].constraints[0].enabled = True - this_obj.pose.bones["MCH-shin_tweak-pin.parent.R"].constraints[0].enabled = True - this_obj.pose.bones["MCH-torso.parent"].constraints[0].enabled = True - # Deselect everything, we're done. - for bone in bpy.context.active_object.pose.bones: - bone.bone.select = False - - # EDITING RIG UI TEXT FILE - rig_file = bpy.data.texts[original_name+'_ui.py'] # Rig script for this char in question - - # Convert it to text - rig_text = rig_file.as_string() - complete_rig_text = rig_text - # My disclaimer, out of respect for modifying Rigify core's script - rig_text_disclaimer = "\n# This RigUI script has been modified by Llama for use with Genshin Impact characters using a custom made rig. Any issues arising as a result of these modifications are my own fault and are not indicitive of Rigify's original functionalities. \n# Rigify's writers bare no responsibility for issues/errors made here. Additionally, these modifications have been made for the sole reason of improving the custom made rigs for Genshin Impact characters, meaning that\n# attempting to use this script elsewhere for characters/models/skeletons it was NOT intended to be used with, could yield improper or erroneous results - of which neither Rigify's development team nor I, am responsible for. \n\n# Otherwise, if you are seeing this disclaimer with a Genshin Impact character made with the proper addons, run this as needed. (Such as after appending to build the rig layers)\n# Do NOT however, attempt to use this rig in another version of blender than what it was made in. (3.6.X rigs will NOT work adequately in 4.X or beyond; and 4.X rigs will not work in previous versions before 4.0)\n" - - # MODIFICATIONS to the text file are made here: - # Get the ID of this char's rig ui script. - rig_char_id = rig_text.split("rig_id = \"")[1].split("\"")[0] - - def make_layer_str(text, layer, version): - string3 = "row.prop(context.active_object.data, 'layers', index="+str(layer)+", toggle=True, text='"+text+"')" - string4 = "row.prop(collection[\""+text+"\"], 'is_visible', toggle=True, text='"+text+"')" - - if version == 4: - return string4 - else: - return string3 - - def layers_to_generate(vers): - str = "\n row=col.row()\n "+make_layer_str("Tweaks", 2, vers)+"\n row=col.row()\n "+make_layer_str("Pivots & Pins", 19, vers)+"\n row = col.row()\n "+make_layer_str("Offsets", 26, vers)+"\n row = col.row()\n row.separator()\n row = col.row()\n row.separator()\n row = col.row()\n "+make_layer_str("Face", 0, vers)+"\n row = col.row()\n "+make_layer_str("Torso (IK)", 3, vers)+"\n row = col.row()\n "+make_layer_str("Torso (FK)",4,vers)+"\n row = col.row()\n "+make_layer_str("Fingers", 5, vers)+"\n row = col.row()\n "+make_layer_str("Fingers (Detail)", 6, vers)+"\n row = col.row()\n "+make_layer_str("Arm.L (IK)", 7, vers)+"\n "+make_layer_str("Arm.R (IK)", 10, vers)+"\n row = col.row()\n "+make_layer_str("Arm.L (FK)", 8, vers)+"\n "+make_layer_str("Arm.R (FK)", 11, vers)+"\n row = col.row()\n "+make_layer_str("Leg.L (IK)", 13, vers)+"\n "+make_layer_str("Leg.R (IK)", 16, vers)+"\n row = col.row()\n "+make_layer_str("Leg.L (FK)", 14, vers)+"\n "+make_layer_str("Leg.R (FK)", 17, vers)+"\n row = col.row()\n row.separator()\n row = col.row()\n row.separator()\n row = col.row()\n "+make_layer_str("Root", 28, vers)+"\n row = col.row()\n "+make_layer_str("Other", 25, vers) - - return str - - # Function to add layer to rigUI. This should add it to both 3.6 and 4.0 versions of the UI. - def generate_rig_layers(): - # Add the physics button to the UI # text=v_str+" rig for " + char_name - rig_add_layer_code = "\n layout = self.layout\n col = layout.column()\n row = col.row()\n v_str = \""+bpy.app.version_string+"\"\n if not v_str[0] == \"4\" and bpy.app.version_string[0] == \"3\":\n row.label(text=v_str+\" rig for "+char_name.split("Costume")[0]+"\")\n "+layers_to_generate(3)+"\n elif v_str[0] == \"4\" and bpy.app.version_string[0] == \"4\":\n row.label(text=v_str+\" rig for "+char_name.split("Costume")[0]+"\")\n # If you have duplicate armatures of the same character (if you see .001 or similar) in one scene,\n # Please change the name below to what it is in the Outliner so that you can rig all your characters :)\n # (It's the green person symbol in your rig)\n collection = bpy.data.armatures[\""+original_name+"\"].collections\n "+layers_to_generate(4)+"\n else:\n row.label(text=\"ERROR: Version mismatch!\")\n row = col.row()\n row.label(text=\"Your rig was made in a version of Blender/Goo Engine that is not compatible!\")\n row = col.row()\n row.label(text=\"Please remake your rig for this version!\")" - cut_rig_layer = rig_text.split("class RigLayers(bpy.types.Panel):") - separate_draw_func = cut_rig_layer[1].split("def draw(self, context):") - separate_draw_end = separate_draw_func[1].split("def register():") - - merged_layer_code = cut_rig_layer[0]+"class RigLayers(bpy.types.Panel):"+separate_draw_func[0]+"def draw(self, context):"+rig_add_layer_code+"\ndef register():"+separate_draw_end[1] - - return merged_layer_code - - complete_rig_text = generate_rig_layers() - - # These functions make it easy to quickly write to the text file. Use as needed. - def generate_string_for_limb_pin(pin_bone, gear_bone, tweak_bone, text): - str = "\n if is_selected({'"+pin_bone+"'}):\n layout.prop(pose_bones['"+tweak_bone+"'], '[\"tweak_pin\"]', text='"+text+"', slider=True)\n if is_selected({'"+gear_bone+"'}):\n layout.prop(pose_bones['"+tweak_bone+"'], '[\"tweak_pin\"]', text='"+text+"', slider=True)" - return str - - def generate_string_for_parent_switch(bone): - str = "\n if is_selected({'"+bone+"'}):\n group1 = layout.row(align=True)\n group2 = group1.split(factor=0.75, align=True)\n props = group2.operator('pose.rigify_switch_parent_"+rig_char_id+"\', text=\'Parent Switch\', icon=\'DOWNARROW_HLT\')\n props.bone = \'"+bone+"\'\n props.prop_bone = \'"+bone+"\'\n props.prop_id=\'parent_switch\'\n props.parent_names = '[\"None\", \"root\", \"root.001\", \"root.002\", \"torso\", \"chest\"]'\n props.locks = (False, False, False)\n group2.prop(pose_bones['"+bone+"'], '[\"parent_switch\"]', text='')\n props = group1.operator('pose.rigify_switch_parent_bake_"+rig_char_id+"', text='', icon='ACTION_TWEAK')\n props.bone = '"+bone+"'\n props.prop_bone='"+bone+"'\n props.prop_id='parent_switch'\n props.parent_names='[\"None\", \"root\", \"root.001\", \"root.002\", \"torso\", \"chest\"]'\n props.locks = (False, False, False)" - return str - # Used for already existing bones (torso and limbs) - def generate_string_for_ik_switch(bone, prop1, prop2): - str = "\n if is_selected({'"+bone+"'}):\n group1 = layout.row(align=True)\n group2 = group1.split(factor=0.75, align=True)\n props = group2.operator('pose.rigify_switch_parent_"+rig_char_id+"\', text=\'Parent Switch\', icon=\'DOWNARROW_HLT\')\n props.bone = \'"+prop1+"\'\n props.prop_bone = \'"+prop2+"\'\n props.prop_id=\'IK_parent\'\n props.parent_names = '[\"None\", \"root\", \"root.001\", \"root.002\", \"torso\", \"chest\"]'\n props.locks = (False, False, False)\n group2.prop(pose_bones['"+prop2+"'], '[\"IK_parent\"]', text='')\n props = group1.operator('pose.rigify_switch_parent_bake_"+rig_char_id+"', text='', icon='ACTION_TWEAK')\n props.bone = '"+prop1+"'\n props.prop_bone='"+prop2+"'\n props.prop_id='IK_parent'\n props.parent_names='[\"None\", \"root\", \"root.001\", \"root.002\", \"torso\", \"chest\"]'\n props.locks = (False, False, False)" - return str - - # because rigify makes the rig ui before i get to it, we have to change this stuff for the torso sliders below. - def torso_str(): - torso="\n props.bone = 'torso.002'\n props.prop_bone = 'torso.002'\n props.prop_id = 'torso_parent'\n props.parent_names = '[\"None\", \"Root\"]'\n props.locks = (False, False, False)\n group2.prop(pose_bones['torso.002'], '[\"torso_parent\"]', text='')\n props = group1.operator('pose.rigify_switch_parent_bake_"+rig_char_id+"', text='', icon='ACTION_TWEAK')\n props.bone = 'torso.002'\n props.prop_bone = 'torso.002'\n props.prop_id = 'torso_parent'\n props.parent_names = '[\"None\", \"Root\"]'\n props.locks = (False, False, False)" - return torso - - def torso_repair(): - cut = complete_rig_text.split("props = group2.operator('pose.rigify_switch_parent_"+rig_char_id+"', text='Torso Parent', icon='DOWNARROW_HLT')") - second_str = "if is_selected({'foot_fk.L', 'foot_ik.L', 'thigh_ik_target.L', 'foot_tweak.L', 'shin_tweak.L', 'foot_heel_ik.L', 'thigh_ik.L', 'VIS_thigh_ik_pole.L', 'toe_fk.L', 'shin_fk.L', 'thigh_parent.L', 'foot_spin_ik.L', 'thigh_fk.L', 'toe_ik.L', 'thigh_tweak.L', 'thigh_tweak.L.001', 'shin_tweak.L.001'}):" - second_half = cut[1] - new_cut = second_half.split(second_str) - final = new_cut[1] - - merged_text = cut[0]+"props = group2.operator('pose.rigify_switch_parent_"+rig_char_id+"', text='Torso Parent', icon='DOWNARROW_HLT')"+torso_str()+second_str+final - - return merged_text - def splice_into_text(divider, text): - split = complete_rig_text.split(divider) - return split[0]+divider+text+split[1] - - # NPC doesn't get head tracker parent switch, the skeleton lacks the bone to make it work. - - # Make the limb edits - complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_parent_switch("forearm_tweak-pin.L")) - complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_limb_pin("forearm_tweak-pin.L","upper_arm_parent.L","forearm_tweak.L","Elbow Pin")) - complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_parent_switch("forearm_tweak-pin.R")) - complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_limb_pin("forearm_tweak-pin.R","upper_arm_parent.R","forearm_tweak.R","Elbow Pin")) - - complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_ik_switch("hand_ik_pivot.L","hand_ik.L","upper_arm_parent.L")) - complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_ik_switch("hand_ik_pivot.R","hand_ik.R","upper_arm_parent.R")) - complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_ik_switch("foot_ik_pivot.L","foot_ik.L","thigh_parent.L")) - complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_ik_switch("foot_ik_pivot.R","foot_ik.R","thigh_parent.R")) - - complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_parent_switch("shin_tweak-pin.L")) - complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_limb_pin("shin_tweak-pin.L","thigh_parent.L","shin_tweak.L","Knee Pin")) - complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_parent_switch("shin_tweak-pin.R")) - complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_limb_pin("shin_tweak-pin.R","thigh_parent.R","shin_tweak.R","Knee Pin")) - - # Clear the text from the text block, reassemble it as needed with strings and modifications. - rig_file.clear() - rig_file.write(complete_rig_text) - rig_file.write(rig_text_disclaimer) - - - - # After all text block modifications, run the new edited script. - ctx = bpy.context.copy() - ctx['edit_text'] = rig_file - with bpy.context.temp_override(edit_text=rig_file): - bpy.ops.text.run_script() - - # DONE MODIFYING ui.py FILE -------------------------------------------- - - # Post modification, Adjustment of bone layers/collections. - if not is_version_4: - for x in range(29): - if x>0: - bpy.context.object.data.layers[x] = False - - # Disable/Enable Rig UI layers we care about - bpy.context.object.data.layers[0] = True - bpy.context.object.data.layers[3] = True - bpy.context.object.data.layers[4] = False - bpy.context.object.data.layers[5] = True - bpy.context.object.data.layers[6] = False - bpy.context.object.data.layers[7] = True - bpy.context.object.data.layers[8] = False - bpy.context.object.data.layers[10] = True - bpy.context.object.data.layers[11] = False - bpy.context.object.data.layers[13] = True - bpy.context.object.data.layers[14] = False - bpy.context.object.data.layers[16] = True - bpy.context.object.data.layers[17] = False - bpy.context.object.data.layers[28] = True - bpy.context.object.data.layers[26] = True - else: - bpy.context.object.data.collections["Tweaks"].is_visible = False - bpy.context.object.data.collections["Pivots & Pins"].is_visible = False - bpy.context.object.data.collections["Torso (FK)"].is_visible = False - bpy.context.object.data.collections["Fingers (Detail)"].is_visible = False - bpy.context.object.data.collections["Arm.L (FK)"].is_visible = False - bpy.context.object.data.collections["Arm.R (FK)"].is_visible = False - bpy.context.object.data.collections["Leg.L (FK)"].is_visible = False - bpy.context.object.data.collections["Leg.R (FK)"].is_visible = False - bpy.context.object.data.collections["Other"].is_visible = False - - # Send the given bone to its new location for either version. Adjusted for actual layer num. - # MOVING OF BONES BELOW ------------------------------- - def bone_to_layer(bone, layer, collection, second_coll="None"): - arm = bpy.context.object - if bone in arm.data.bones: - if is_version_4: - if collection == "Other": - bpy.context.object.data.collections[collection].assign(bpy.context.object.data.bones[bone]) - else: - bpy.context.object.data.collections[collection].assign(bpy.context.object.data.bones[bone]) - bpy.context.object.data.collections["Other"].unassign(bpy.context.object.data.bones[bone]) - if second_coll != "None": - bpy.context.object.data.collections[second_coll].assign(bpy.context.object.data.bones[bone]) - else: - move_bone(bone,layer) - - # Since we've looped through ever 4.0 bone to place in 'other' above, we'll have to do so as well for 3.6 - if not is_version_4: - for bone in bpy.context.active_object.pose.bones: - bone_to_layer(bone.name, 25, "Other") - - loop_arm = bpy.context.object.data - for bone in loop_arm.bones: - if "tweak" in bone.name and "MCH" not in bone.name and "pin" not in bone.name: - bone_to_layer(bone.name, 2, "Tweaks") - - # Moving to Tweaks (werent catched in loop) - bone_to_layer("tweak_spine", 2, "Tweaks") - bone_to_layer("tweak_spine.001", 2, "Tweaks") - bone_to_layer("tweak_spine.002", 2, "Tweaks") - bone_to_layer("tweak_spine.003", 2, "Tweaks") - bone_to_layer("tweak_spine.004", 2, "Tweaks") - bone_to_layer("tweak_spine.005", 2, "Tweaks") - # MOVING PIVOTS AND PINS - bone_to_layer("torso_pivot.002", 19, "Pivots & Pins") - bone_to_layer("forearm_tweak-pin.L", 19, "Pivots & Pins") - bone_to_layer("hand_ik_pivot.L", 19, "Pivots & Pins") - bone_to_layer("hand_ik_pivot.R", 19, "Pivots & Pins") - bone_to_layer("forearm_tweak-pin.R", 19, "Pivots & Pins") - bone_to_layer("shin_tweak-pin.L", 19, "Pivots & Pins") - bone_to_layer("shin_tweak-pin.R", 19, "Pivots & Pins") - bone_to_layer("foot_ik_pivot.L", 19, "Pivots & Pins") - bone_to_layer("foot_ik_pivot.R", 19, "Pivots & Pins") - - # MOVING FACE - bone_to_layer("plate-settings", 0, "Face") - bone_to_layer("plate-border", 0, "Face") - bone_to_layer("Plate", 0, "Face") - bone_to_layer("eyetrack", 0, "Face") - if use_head_tracker: - bone_to_layer("head-controller", 0, "Face") - else: - bone_to_layer("head-controller", 25, "Other") - bone_to_layer("eyetrack_L", 0, "Face") - bone_to_layer("eyetrack_R", 0, "Face") - - - # Disable selection of face bone - selected_bone = faceplate_arm.pose.bones["Plate"] - selected_bone.bone.hide_select = True - - bone_to_layer("Mouth-Smile-Control", 0, "Face") - bone_to_layer("Mouth-Angry-Control", 0, "Face") - bone_to_layer("Mouth-A-Control", 0, "Face") - bone_to_layer("Eye-Hostility-Control", 0, "Face") - bone_to_layer("Eye-Wail-Control", 0, "Face") - bone_to_layer("Eye-WinkA-Control", 0, "Face") - bone_to_layer("Eye-WinkB-Control", 0, "Face") - bone_to_layer("Wink-Control", 0, "Face") - bone_to_layer("Face-Strong-Control", 0, "Face") - bone_to_layer("Face-Fat-Control", 0, "Face") - - # Moving Torso - bone_to_layer("head", 3, "Torso (IK)") - bone_to_layer("neck", 3, "Torso (IK)") - bone_to_layer("chest", 3, "Torso (IK)") - bone_to_layer("torso", 3, "Torso (IK)") - bone_to_layer("torso.001", 26, "Offsets") - bone_to_layer("torso.002", 26, "Offsets") - bone_to_layer("hips", 3, "Torso (IK)") - - bone_to_layer("spine_fk.003", 4, "Torso (FK)") - bone_to_layer("spine_fk.002", 4, "Torso (FK)") - bone_to_layer("spine_fk.001", 4, "Torso (FK)") - bone_to_layer("spine_fk", 4, "Torso (FK)") - - # Moving Fingers - bone_to_layer("thumb.01_master.L", 5, "Fingers") - bone_to_layer("thumb.01_master.R", 5, "Fingers") - bone_to_layer("f_index.01_master.L", 5, "Fingers") - bone_to_layer("f_index.01_master.R", 5, "Fingers") - bone_to_layer("f_middle.01_master.L", 5, "Fingers") - bone_to_layer("f_middle.01_master.R", 5, "Fingers") - bone_to_layer("f_ring.01_master.L", 5, "Fingers") - bone_to_layer("f_ring.01_master.R", 5, "Fingers") - bone_to_layer("f_pinky.01_master.L", 5, "Fingers") - bone_to_layer("f_pinky.01_master.R", 5, "Fingers") - - bone_to_layer("thumb.01.L", 6, "Fingers (Detail)") - bone_to_layer("thumb.01.R", 6, "Fingers (Detail)") - bone_to_layer("thumb.02.L", 6, "Fingers (Detail)") - bone_to_layer("thumb.02.R", 6, "Fingers (Detail)") - bone_to_layer("thumb.03.L", 6, "Fingers (Detail)") - bone_to_layer("thumb.03.R", 6, "Fingers (Detail)") - bone_to_layer("thumb.01.L.001", 6, "Fingers (Detail)") - bone_to_layer("thumb.01.R.001", 6, "Fingers (Detail)") - bone_to_layer("f_index.01.L", 6, "Fingers (Detail)") - bone_to_layer("f_index.01.R", 6, "Fingers (Detail)") - bone_to_layer("f_index.02.L", 6, "Fingers (Detail)") - bone_to_layer("f_index.02.R", 6, "Fingers (Detail)") - bone_to_layer("f_index.03.L", 6, "Fingers (Detail)") - bone_to_layer("f_index.03.R", 6, "Fingers (Detail)") - bone_to_layer("f_index.01.L.001", 6, "Fingers (Detail)") - bone_to_layer("f_index.01.R.001", 6, "Fingers (Detail)") - bone_to_layer("f_middle.01.L", 6, "Fingers (Detail)") - bone_to_layer("f_middle.01.R", 6, "Fingers (Detail)") - bone_to_layer("f_middle.02.L", 6, "Fingers (Detail)") - bone_to_layer("f_middle.02.R", 6, "Fingers (Detail)") - bone_to_layer("f_middle.03.L", 6, "Fingers (Detail)") - bone_to_layer("f_middle.03.R", 6, "Fingers (Detail)") - bone_to_layer("f_middle.01.L.001", 6, "Fingers (Detail)") - bone_to_layer("f_middle.01.R.001", 6, "Fingers (Detail)") - bone_to_layer("f_ring.01.L", 6, "Fingers (Detail)") - bone_to_layer("f_ring.01.R", 6, "Fingers (Detail)") - bone_to_layer("f_ring.02.L", 6, "Fingers (Detail)") - bone_to_layer("f_ring.02.R", 6, "Fingers (Detail)") - bone_to_layer("f_ring.03.L", 6, "Fingers (Detail)") - bone_to_layer("f_ring.03.R", 6, "Fingers (Detail)") - bone_to_layer("f_ring.01.L.001", 6, "Fingers (Detail)") - bone_to_layer("f_ring.01.R.001", 6, "Fingers (Detail)") - bone_to_layer("f_pinky.01.L", 6, "Fingers (Detail)") - bone_to_layer("f_pinky.01.R", 6, "Fingers (Detail)") - bone_to_layer("f_pinky.02.L", 6, "Fingers (Detail)") - bone_to_layer("f_pinky.02.R", 6, "Fingers (Detail)") - bone_to_layer("f_pinky.03.L", 6, "Fingers (Detail)") - bone_to_layer("f_pinky.03.R", 6, "Fingers (Detail)") - bone_to_layer("f_pinky.01.L.001", 6, "Fingers (Detail)") - bone_to_layer("f_pinky.01.R.001", 6, "Fingers (Detail)") - - # Pass in a list, all of those bones will be moved accordingly. - def fast_bone_move(bone_list, layer, collection): - for bone in bone_list: - bone_to_layer(bone, layer, collection) - - # Refactoring old bone move functionalities - list_move_to_other = ["+UpperArmTwistA02.L","+UpperArmTwistA01.L","+UpperArmTwistA01.R","+UpperArmTwistA02.R","eye.R","eye.L","+ToothBone D A01","+ToothBone U A01","+ToothBone A A01"] - fast_bone_move(list_move_to_other, 25, "Other") - - if toe_bones_exist: - bone_to_layer("toe_ik.L", 13, "Leg.L (IK)") - bone_to_layer("toe_ik.R", 16, "Leg.R (IK)") - else: - bone_to_layer("toe_ik.L", 25, "Other") - bone_to_layer("toe_ik.R", 25, "Other") - - if use_arm_ik_poles: - bone_to_layer("upper_arm_ik.L", 25, "Other") - bone_to_layer("upper_arm_ik.R", 25, "Other") - else: - bone_to_layer("upper_arm_ik.L", 7, "Arm.L (IK)") - bone_to_layer("upper_arm_ik.R", 10, "Arm.R (IK)") - - if use_leg_ik_poles: - bone_to_layer("thigh_ik.L", 25, "Other") - bone_to_layer("thigh_ik.R", 25, "Other") - else: - bone_to_layer("thigh_ik.L", 13, "Leg.L (IK)") - bone_to_layer("thigh_ik.R", 16, "Leg.R (IK)") - - try: - bone_to_layer("+EyeBone L A01.001", 25, "Other") - bone_to_layer("+EyeBone R A01.001", 25, "Other") - except: - pass - - if not use_head_tracker: - bone_to_layer("head-controller", 25, "Other") - - if no_eyes: - bone_to_layer("eyetrack",25,"Other") - bone_to_layer("eyetrack_L",25,"Other") - bone_to_layer("eyetrack_R",25,"Other") - - # New bones, post append - list_to_send_other = ["MCH-thigh_ik_target_sub.L","MCH-thigh_ik_target_sub.R","MCH-foot_ik_pivot.L","MCH-foot_ik_pivot.R","MCH-hand_ik_pivot.L","MCH-hand_ik_pivot.R","MCH-hand_ik_wrist.L","MCH-hand_ik_wrist.R","MCH-torso_pivot.002","shoulder_driver.R","shoulder_driver.L","MCH-shoulder_follow.R","MCH-shoulder_follow.L"] - - fast_bone_move(list_to_send_other,25,"Other") - - send_to_pivots = ["foot_ik_pivot.L","foot_ik_pivot.R","hand_ik_pivot.L","hand_ik_pivot.R","torso_pivot.002","forearm_tweak-pin.L","forearm_tweak-pin.R","shin_tweak-pin.L","shin_tweak-pin.R"] - fast_bone_move(send_to_pivots, 19, "Pivots & Pins") - - bone_to_layer("root.002", 28, "Root") - bone_to_layer("root.001", 28, "Root") - bone_to_layer("root", 28, "Root") - - bone_to_layer("hand_ik.L",7,"Arm.L (IK)") - bone_to_layer("hand_ik_wrist.L",26,"Offsets") - bone_to_layer("upper_arm_parent.L",[7,8],"Arm.L (IK)","Arm.L (FK)") - bone_to_layer("upper_arm_ik_target.L",7,"Arm.L (IK)") - bone_to_layer("shoulder.L",[7,8],"Arm.L (IK)","Arm.L (FK)") - - bone_to_layer("hand_ik.R",10,"Arm.R (IK)") - bone_to_layer("upper_arm_parent.R",[10,11],"Arm.R (IK)","Arm.R (FK)") - bone_to_layer("hand_ik_wrist.R",26,"Offsets") - bone_to_layer("upper_arm_ik_target.R",10,"Arm.R (IK)") - bone_to_layer("shoulder.R",[10,11],"Arm.R (IK)","Arm.R (FK)") - - bone_to_layer("upper_arm_fk.L",8,"Arm.L (FK)") - bone_to_layer("forearm_fk.L",8,"Arm.L (FK)") - bone_to_layer("hand_fk.L",8,"Arm.L (FK)") - - bone_to_layer("upper_arm_fk.R",11,"Arm.R (FK)") - bone_to_layer("forearm_fk.R",11,"Arm.R (FK)") - bone_to_layer("hand_fk.R",11,"Arm.R (FK)") - - bone_to_layer("foot_ik.L",13,"Leg.L (IK)") - bone_to_layer("thigh_parent.L",[13,14],"Leg.L (IK)","Leg.L (FK)") - bone_to_layer("thigh_ik_target.L",13,"Leg.L (IK)") - bone_to_layer("foot_ik_sub.L",26,"Offsets") - bone_to_layer("foot_spin_ik.L",13,"Leg.L (IK)") - bone_to_layer("foot_heel_ik.L",13,"Leg.L (IK)") - - bone_to_layer("thigh_fk.L",14,"Leg.L (FK)") - bone_to_layer("shin_fk.L",14,"Leg.L (FK)") - bone_to_layer("foot_fk.L",14,"Leg.L (FK)") - bone_to_layer("toe_fk.L",14,"Leg.L (FK)") - - bone_to_layer("foot_ik.R",16,"Leg.R (IK)") - bone_to_layer("thigh_parent.R",[16,17],"Leg.R (IK)","Leg.R (FK)") - bone_to_layer("thigh_ik_target.R",16,"Leg.R (IK)") - bone_to_layer("foot_ik_sub.R",26,"Offsets") - bone_to_layer("foot_spin_ik.R",16,"Leg.R (IK)") - bone_to_layer("foot_heel_ik.R",16,"Leg.R (IK)") - - bone_to_layer("thigh_fk.R",17,"Leg.R (FK)") - bone_to_layer("shin_fk.R",17,"Leg.R (FK)") - bone_to_layer("foot_fk.R",17,"Leg.R (FK)") - bone_to_layer("toe_fk.R",17,"Leg.R (FK)") - - #npc, move invis bones away - bone_to_layer("WinkA-Invis", 25, "Other") - bone_to_layer("WinkB-Invis", 25, "Other") - - # MOVING OF BONES END ------------------------------- -def setup_neck_and_head_follow(neck_follow_value, head_follow_value): - bpy.context.object.pose.bones["torso"]["neck_follow"] = neck_follow_value - bpy.context.object.pose.bones["torso"]["head_follow"] = head_follow_value - - -# Make it so that the finger scale controls can be scaled on the X axis to curl in just the fingertips instead of the entire finger. -def setup_finger_scale_controls_on_x_axis_to_curl_just_the_fingertips(rigified_rig): - bpy.ops.object.mode_set(mode='POSE') - - for oDrv in rigified_rig.animation_data.drivers: - for variable in oDrv.driver.variables: - for target in variable.targets: - if ".03" in oDrv.data_path and target.data_path[-7:] == "scale.y": - target.data_path = target.data_path[:-1] + "x" - - - fingerlist = ["thumb.01_master", "f_index.01_master", "f_middle.01_master", "f_ring.01_master", "f_pinky.01_master"] - for side in [".L", ".R"]: - for bone in fingerlist: - rigified_rig.pose.bones[bone + side].lock_scale[0] = False From c37ebca3582326bc9c4408c014505dc25900ff06 Mon Sep 17 00:00:00 2001 From: Mark Allain <62905048+OctavoPE@users.noreply.github.com> Date: Mon, 6 May 2024 15:45:58 -0600 Subject: [PATCH 4/4] fixed shoulders, chest on npc, added prop bones. added 2 outer roots to offset category --- .../character_rig_setup/RootShape.blend | Bin 0 -> 281855 bytes .../character_rig_setup/npc_rig_script.py | 2576 ++++++++++++++ .../character_rig_setup/rig_script.py | 3111 +++++++++++++++++ 3 files changed, 5687 insertions(+) create mode 100644 setup_wizard/character_rig_setup/RootShape.blend create mode 100644 setup_wizard/character_rig_setup/npc_rig_script.py create mode 100644 setup_wizard/character_rig_setup/rig_script.py diff --git a/setup_wizard/character_rig_setup/RootShape.blend b/setup_wizard/character_rig_setup/RootShape.blend new file mode 100644 index 0000000000000000000000000000000000000000..c98a237961315f9cefe027b58c54a605f6633014 GIT binary patch literal 281855 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 z�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

0t3O~K{)dQKRfh;M$3RF%coQe}zsgX_@nz)+ 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

b-+SG7MJu_Dk8w@0mAd+QLXKE9@ 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�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 A1ONa4 literal 0 HcmV?d00001 diff --git a/setup_wizard/character_rig_setup/npc_rig_script.py b/setup_wizard/character_rig_setup/npc_rig_script.py new file mode 100644 index 0000000..771e755 --- /dev/null +++ b/setup_wizard/character_rig_setup/npc_rig_script.py @@ -0,0 +1,2576 @@ +# Authors: enthralpy, Llama.jpg +# Setup Wizard Integration by michael-gh1 + +import bpy +import os +from mathutils import Color, Vector +from math import pi + +def rig_character( + file_path, + disallow_arm_ik_stretch, + disallow_leg_ik_stretch, + use_arm_ik_poles, + use_leg_ik_poles, + add_child_of_constraints, + use_head_tracker, + meshes_joined=False): + + # Firstly, let's make a flag to identify the blender version. + is_version_4 = False + version_string = bpy.app.version_string + if version_string[0] == "4": + is_version_4 = True + + head_bone_arm_target = bpy.context.active_object + temp_armature = head_bone_arm_target.data + + bpy.ops.object.mode_set(mode='EDIT') + + # Check if toe bones exist + toe_bones_exist = True + if "Bip001 L Toe0" not in temp_armature.edit_bones: + toe_bones_exist = False + + # Check if eyes exist: + left_eye_exists = True + if "+EyeBone L A02" not in temp_armature.edit_bones: + left_eye_exists = False + + right_eye_exists = True + if "+EyeBone R A02" not in temp_armature.edit_bones: + right_eye_exists = False + + no_eyes = False + if not left_eye_exists and not right_eye_exists: + no_eyes = True + + # Hoyo models have inconsistent head bone shapes. I'm correcting them to my standard. (This stabilizes the head track bone) + # My logic: Line up the head bone's tail's X & Y to the head bone's head (so that it's straight up), and use the eye bone's head's Z as the height. - Llama + if not no_eyes: + if left_eye_exists: + eye_bone_head = temp_armature.edit_bones['+EyeBone L A02'] + elif right_eye_exists: + eye_bone_head = temp_armature.edit_bones['+EyeBone R A02'] + eye_bone_head_z = eye_bone_head.head[2] + + head_bone_temp = temp_armature.edit_bones['Bip001 Head'] + head_bone_head_x = head_bone_temp.head[0] + head_bone_head_y = head_bone_temp.head[1] + + head_bone_temp.tail[0] = head_bone_head_x + head_bone_temp.tail[1] = head_bone_head_y + head_bone_temp.tail[2] = eye_bone_head_z + + # If they dont have eye bones (Dottore), we can hardcode a reasonable value to use to repair the head. + else: + head_bone_temp = temp_armature.edit_bones['Bip001 Head'] + head_bone_head_x = head_bone_temp.head[0] + head_bone_head_y = head_bone_temp.head[1] + + head_bone_temp.tail[0] = head_bone_head_x + head_bone_temp.tail[1] = head_bone_head_y + head_bone_temp.tail[2] = head_bone_temp.head[2] + 0.0538 + + left_eye_2 = [] + left_eye_1 = [] + right_eye_2 = [] + right_eye_1 = [] + + if left_eye_exists: + left_eye_2.append(temp_armature.edit_bones['+EyeBone L A02'].head[0]) + left_eye_2.append(temp_armature.edit_bones['+EyeBone L A02'].head[1]) + left_eye_2.append(temp_armature.edit_bones['+EyeBone L A02'].head[2]) + + left_eye_1.append(temp_armature.edit_bones['+EyeBone L A01'].head[0]) + left_eye_1.append(temp_armature.edit_bones['+EyeBone L A01'].head[1]) + left_eye_1.append(temp_armature.edit_bones['+EyeBone L A01'].head[2]) + if right_eye_exists: + right_eye_2.append(temp_armature.edit_bones['+EyeBone R A02'].head[0]) + right_eye_2.append(temp_armature.edit_bones['+EyeBone R A02'].head[1]) + right_eye_2.append(temp_armature.edit_bones['+EyeBone R A02'].head[2]) + + right_eye_1.append(temp_armature.edit_bones['+EyeBone R A01'].head[0]) + right_eye_1.append(temp_armature.edit_bones['+EyeBone R A01'].head[1]) + right_eye_1.append(temp_armature.edit_bones['+EyeBone R A01'].head[2]) + + bpy.ops.object.mode_set(mode='OBJECT') + + # THANK YOU: https://blenderartists.org/t/how-to-bpy-ops-transform-resize-in-edit-mode-using-pivot/560381/2 + def get_override(area_type, region_type): + for area in bpy.context.screen.areas: + if area.type == area_type: + for region in area.regions: + if region.type == region_type: + override = {'area': area, 'region': region} + return override + #error message if the area or region wasn't found + raise RuntimeError("Wasn't able to find", region_type," in area ", area_type, " Make sure it's open while executing script.") + + #we need to override the context of our operator + override = get_override( 'VIEW_3D', 'WINDOW' ) + + # Function to create shape keys from given arguments: Works with only one element in vg to parse + def create_shape_key(obj_get, is_basis, shape_name, shape_index, transform_pivot, vertex_groups_to_parse, transform_type, transformation_1, transformation_2=0, use_eye_1=False): + bpy.context.view_layer.objects.active = head_bone_arm_target + bpy.ops.object.mode_set(mode='EDIT') + for this_group in vertex_groups_to_parse: + if use_eye_1: + if " R " in this_group: + if right_eye_exists: + bpy.context.scene.cursor.location = (right_eye_1[0],right_eye_1[1],right_eye_1[2]) + elif " L " in this_group: + if left_eye_exists: + bpy.context.scene.cursor.location = (left_eye_1[0],left_eye_1[1],left_eye_1[2]) + else: + if " R " in this_group: + if right_eye_exists: + bpy.context.scene.cursor.location = (right_eye_2[0],right_eye_2[1],right_eye_2[2]) + elif " L " in this_group: + if left_eye_exists: + bpy.context.scene.cursor.location = (left_eye_2[0],left_eye_2[1],left_eye_2[2]) + + # AFTER MOVING 3D CURSOR + this_obj = bpy.data.objects.get(obj_get) + bpy.context.view_layer.objects.active = this_obj + + if is_basis: + this_obj.shape_key_add(name='Basis') + + this_obj.shape_key_add(from_mix=False) + sk = this_obj.data.shape_keys.key_blocks[-1] + sk.name = shape_name + sk.value = 1 + bpy.context.object.active_shape_key_index = shape_index + + bpy.ops.object.mode_set(mode='EDIT') + bpy.ops.mesh.select_all(action='DESELECT') + bpy.context.tool_settings.transform_pivot_point = "CURSOR" + + try: + bpy.ops.object.vertex_group_set_active(group=this_group) + bpy.ops.object.vertex_group_select() + + if transform_type == "RESIZE": + bpy.ops.transform.resize(override, value=(transformation_1), orient_type='LOCAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='LOCAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) + bpy.ops.object.vertex_group_deselect() + elif transform_type == "TRANSLATE": + bpy.ops.transform.translate(override, value=transformation_1, orient_type='LOCAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='LOCAL', constraint_axis=(False, True, False), mirror=True, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) + bpy.ops.transform.resize(override, value=transformation_2) + bpy.ops.object.vertex_group_deselect() + except: + pass + + bpy.ops.object.vertex_group_deselect() + bpy.ops.mesh.select_all(action='DESELECT') + bpy.ops.object.mode_set(mode='OBJECT') + sk.value = 0.0 + bpy.context.scene.cursor.location = (0.0,0.0,0.0) + + # Function to create shape keys that works with 2 elementsa + def create_shape_key2(obj_get, is_basis, shape_name, shape_index, transform_pivot, vertex_groups_to_parse, transform_type, transformation_1, transformation_2=0, use_eye_1=False): + bpy.context.view_layer.objects.active = head_bone_arm_target + bpy.ops.object.mode_set(mode='EDIT') + if use_eye_1: + if " R " in vertex_groups_to_parse[0]: + if right_eye_exists: + bpy.context.scene.cursor.location = (right_eye_1[0],right_eye_1[1],right_eye_1[2]) + elif " L " in vertex_groups_to_parse[0]: + if left_eye_exists: + bpy.context.scene.cursor.location = (left_eye_1[0],left_eye_1[1],left_eye_1[2]) + else: + if " R " in vertex_groups_to_parse[0]: + if right_eye_exists: + bpy.context.scene.cursor.location = (right_eye_2[0],right_eye_2[1],right_eye_2[2]) + elif " L " in vertex_groups_to_parse[0]: + if left_eye_exists: + bpy.context.scene.cursor.location = (left_eye_2[0],left_eye_2[1],left_eye_2[2]) + + # AFTER MOVING 3D CURSOR + this_obj = bpy.data.objects.get(obj_get) + bpy.context.view_layer.objects.active = this_obj + + if is_basis: + this_obj.shape_key_add(name='Basis') + + this_obj.shape_key_add(from_mix=False) + sk = this_obj.data.shape_keys.key_blocks[-1] + sk.name = shape_name + sk.value = 1 + bpy.context.object.active_shape_key_index = shape_index + + bpy.ops.object.mode_set(mode='EDIT') + bpy.ops.mesh.select_all(action='DESELECT') + bpy.context.tool_settings.transform_pivot_point = "CURSOR" + + try: + bpy.ops.object.vertex_group_set_active(group=vertex_groups_to_parse[0]) + bpy.ops.object.vertex_group_select() + + if transform_type == "RESIZE": + bpy.ops.transform.resize(override, value=(transformation_1), orient_type='LOCAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='LOCAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) + bpy.ops.object.vertex_group_deselect() + elif transform_type == "TRANSLATE": + bpy.ops.transform.translate(override, value=transformation_1, orient_type='LOCAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='LOCAL', constraint_axis=(False, True, False), mirror=True, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) + bpy.ops.transform.resize(override, value=transformation_2) + bpy.ops.object.vertex_group_deselect() + except: + pass + + bpy.ops.mesh.select_all(action='DESELECT') + bpy.ops.object.mode_set(mode='OBJECT') + + # REPEAT FOR SECOND BONE! + + bpy.context.view_layer.objects.active = head_bone_arm_target + bpy.ops.object.mode_set(mode='EDIT') + if use_eye_1: + if " R " in vertex_groups_to_parse[1]: + if right_eye_exists: + bpy.context.scene.cursor.location = (right_eye_1[0],right_eye_1[1],right_eye_1[2]) + elif " L " in vertex_groups_to_parse[1]: + if left_eye_exists: + bpy.context.scene.cursor.location = (left_eye_1[0],left_eye_1[1],left_eye_1[2]) + else: + if " R " in vertex_groups_to_parse[1]: + if right_eye_exists: + bpy.context.scene.cursor.location = (right_eye_2[0],right_eye_2[1],right_eye_2[2]) + elif " L " in vertex_groups_to_parse[1]: + if left_eye_exists: + bpy.context.scene.cursor.location = (left_eye_2[0],left_eye_2[1],left_eye_2[2]) + + # AFTER MOVING 3D CURSOR + this_obj = bpy.data.objects.get(obj_get) + bpy.context.view_layer.objects.active = this_obj + + bpy.ops.object.mode_set(mode='EDIT') + bpy.ops.mesh.select_all(action='DESELECT') + + try: + bpy.ops.object.vertex_group_set_active(group=vertex_groups_to_parse[1]) + bpy.ops.object.vertex_group_select() + + if transform_type == "RESIZE": + bpy.ops.transform.resize(override, value=(transformation_1), orient_type='LOCAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='LOCAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) + bpy.ops.object.vertex_group_deselect() + elif transform_type == "TRANSLATE": + bpy.ops.transform.translate(override, value=transformation_1, orient_type='LOCAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='LOCAL', constraint_axis=(False, True, False), mirror=True, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) + bpy.ops.transform.resize(override, value=transformation_2) + bpy.ops.object.vertex_group_deselect() + except: + pass + + bpy.ops.mesh.select_all(action='DESELECT') + bpy.ops.object.mode_set(mode='OBJECT') + + # DONE + sk.value = 0.0 + bpy.context.scene.cursor.location = (0.0,0.0,0.0) + + + # Shape key to shrink pupils + #create_shape_key2("Body", True, "pupils", 1, "CURSOR", ["+EyeBoneA02.L","+EyeBoneA02.R"], "RESIZE", (0.5,0.5,0.5)) + # Shape keys to adjust eye during blink + #create_shape_key("Body", False, "pupil-pushback-R", 2, "CURSOR", ["+EyeBoneA02.R"], "TRANSLATE", (0, 0.00703, 0), (1.1,1.1,1.1),use_eye_1=True) # 0.0069, 70 + #create_shape_key("Body", False, "pupil-pushback-L", 3, "CURSOR", ["+EyeBoneA02.L"], "TRANSLATE", (0, 0.00703, 0), (1.1,1.1,1.1),use_eye_1=True) + + bpy.context.tool_settings.transform_pivot_point = "MEDIAN_POINT" + + bpy.context.view_layer.objects.active = head_bone_arm_target + bpy.ops.object.mode_set(mode='EDIT') + + if not toe_bones_exist: + r_foot_bone = temp_armature.edit_bones["Bip001 R Foot"] + r_foot_bone.tail = (-0.040187,-0.078244,0.005803) # X, Y, Z + r_foot_bone.roll = 1.5708 + + l_foot_bone = temp_armature.edit_bones["Bip001 L Foot"] + l_foot_bone.tail = (0.040187,-0.078244,0.005803) + l_foot_bone.roll = 1.5708 + + bpy.ops.object.mode_set(mode='OBJECT') + bpy.context.view_layer.objects.active = head_bone_arm_target + + # Let's let the RigUI script that poke made execute. + + context = bpy.context + obj = context.object + if obj.name[-4:] == ".001": + obj.name = obj.name[:-4] + print("New Run\n\n") + ## Rename all bones in selected armature to ORG + original_name = obj.name + abadidea = { + 'Bip001 Pelvis': 'spine', + 'Bip001 L Thigh': 'thigh.L', + 'Bip001 L Calf': 'shin.L', + 'Bip001 L Foot': 'foot.L', + 'Bip001 L Toe0': 'toe.L', + 'Bip001 R Thigh': 'thigh.R', + 'Bip001 R Calf': 'shin.R', + 'Bip001 R Foot': 'foot.R', + 'Bip001 R Toe0': 'toe.R', + 'Bip001 Spine': 'spine.001', + 'Bip001 Spine1': 'spine.002', + 'Bip001 L Clavicle': 'shoulder.L', + 'Bip001 L UpperArm': 'upper_arm.L', + 'Bip001 L Forearm': 'forearm.L', + 'Bip001 L Hand': 'hand.L', + 'Bip001 L Finger0': 'thumb.01.L', + 'DMZ L 01': 'thumb.01.L', ##WHERE DO THESE SIX COME FROM LMAO + 'DMZ L 02': 'thumb.02.L', + 'DMZ L 03': 'thumb.03.L', + 'DMZ R 01': 'thumb.01.R', + 'DMZ R 02': 'thumb.02.R', + 'DMZ R 03': 'thumb.03.R', + 'Bip001 L Finger01': 'thumb.02.L', + 'Bip001 L Finger02': 'thumb.03.L', + 'Bip001 L Finger1': 'f_index.01.L', + 'Bip001 L Finger11': 'f_index.02.L', + 'Bip001 L Finger12': 'f_index.03.L', + 'Bip001 L Finger2': 'f_middle.01.L', + 'Bip001 L Finger21': 'f_middle.02.L', + 'Bip001 L Finger22': 'f_middle.03.L', + 'Bip001 L Finger3': 'f_ring.01.L', + 'Bip001 L Finger31': 'f_ring.02.L', + 'Bip001 L Finger32': 'f_ring.03.L', + 'Bip001 L Finger4': 'f_pinky.01.L', + 'Bip001 L Finger41': 'f_pinky.02.L', + 'Bip001 L Finger42': 'f_pinky.03.L', + 'Bip001 Neck': 'spine.004', #YO + 'Bip001 Head': 'spine.006', #RUHROH + 'Bip001 R Clavicle': 'shoulder.R', + 'Bip001 R UpperArm': 'upper_arm.R', + 'Bip001 R Forearm': 'forearm.R', + 'Bip001 R Hand': 'hand.R', + 'Bip001 R Finger0': 'thumb.01.R', + 'Bip001 R Finger01': 'thumb.02.R', + 'Bip001 R Finger02': 'thumb.03.R', + 'Bip001 R Finger1': 'f_index.01.R', + 'Bip001 R Finger11': 'f_index.02.R', + 'Bip001 R Finger12': 'f_index.03.R', + 'Bip001 R Finger2': 'f_middle.01.R', + 'Bip001 R Finger21': 'f_middle.02.R', + 'Bip001 R Finger22': 'f_middle.03.R', + 'Bip001 R Finger3': 'f_ring.01.R', + 'Bip001 R Finger31': 'f_ring.02.R', + 'Bip001 R Finger32': 'f_ring.03.R', + 'Bip001 R Finger4': 'f_pinky.01.R', + 'Bip001 R Finger41': 'f_pinky.02.R', + 'Bip001 R Finger42': 'f_pinky.03.R', + '+EyeBone R A01': 'eye.R', + '+EyeBone L A01': 'eye.L', + '+Breast L A01': 'breast.L', + '+Breast R A01': 'breast.R', + } + if not toe_bones_exist: + del abadidea['Bip001 L Toe0'] + del abadidea['Bip001 R Toe0'] + + bpy.ops.object.mode_set(mode='EDIT') + armature = bpy.context.selected_objects[0].data + + bpy.ops.armature.select_all(action='DESELECT') + def select_bone(bone): + bone.select = True + bone.select_head = True + bone.select_tail = True + + # Disconnect the eyes because it'll throw an error if I don't, disconnect the spines so the hip wiggle bone in the rigify rig works properly + try: + select_bone(armature.edit_bones["+EyeBone L A02"]) + select_bone(armature.edit_bones["+EyeBone R A02"]) + except: + pass + select_bone(armature.edit_bones["Bip001 Spine"]) + select_bone(armature.edit_bones["Bip001 Spine1"]) + bpy.ops.armature.parent_clear(type='DISCONNECT') + bpy.ops.armature.select_all(action='DESELECT') + + try: + select_bone(armature.edit_bones["+Breast R A02"]) + select_bone(armature.edit_bones["+Breast L A02"]) + bpy.ops.armature.parent_clear(type='DISCONNECT') + bpy.ops.armature.select_all(action='DESELECT') + except: + pass + + bones_list = obj.pose.bones + for bone in bones_list: + if bone.name in abadidea: + bone.name = abadidea[bone.name] + + + #Aw shit here we go again. This second loop is for making it possible to symmetrize pose bones properly. + for bone in bones_list: + if ".L" in bone.name: + whee = bone.name[:-2] + ".R" + armature.edit_bones[bone.name].roll = -armature.edit_bones[whee].roll + + + + armature.edit_bones["shoulder.L"].roll += 3.14 + armature.edit_bones["shoulder.R"].roll -= 3.14 + + + + + for bone in armature.edit_bones: + if "thumb" in bone.name or "index" in bone.name or "middle" in bone.name or "ring" in bone.name or "pinky" in bone.name: + if ".L" in bone.name: + armature.edit_bones[bone.name].roll -= 1.571 + else: + armature.edit_bones[bone.name].roll += 1.571 + ## Not sure why this bone exist but it's gotta go lmao + if bone.name == "Bip001": + for childbone in bone.children: + if childbone.name != "spine": + armature.edit_bones[childbone.name].parent = armature.edit_bones['spine'] + armature.edit_bones.remove(bone) + elif ".L" not in bone.name and ".R" not in bone.name: + armature.edit_bones[bone.name].roll = 0 + + + ## Fixes the weirdass pelvis/spine bone. Sets the spine's head and tail X to 0. + def realign(bone): + bone.head.x = 0 + bone.tail.x = 0 + realign(armature.edit_bones['spine']) + realign(armature.edit_bones['spine.006']) + + + ## Attaches the feet to the toes and the upperarms to lowerarms + def attachfeets(foot, toe): + armature.edit_bones[foot].tail.x = armature.edit_bones[toe].head.x + armature.edit_bones[foot].tail.y = armature.edit_bones[toe].head.y + armature.edit_bones[foot].tail.z = armature.edit_bones[toe].head.z + + if toe_bones_exist: + attachfeets('foot.L', 'toe.L') + attachfeets('foot.R', 'toe.R') + + attachfeets('upper_arm.L', 'forearm.L') + attachfeets('upper_arm.R', 'forearm.R') + attachfeets('thigh.L', 'shin.L') + attachfeets('thigh.R', 'shin.R') + attachfeets('forearm.L', 'hand.L') + attachfeets('forearm.R', 'hand.R') + attachfeets('spine', 'spine.001') + attachfeets('spine.001', 'spine.002') + attachfeets('spine.002', 'spine.004') + attachfeets('spine.004', 'spine.006') + + ## Points toe bones in correct direction + if toe_bones_exist: + armature.edit_bones['toe.L'].tail.z = 0 + armature.edit_bones['toe.L'].tail.y -= 0.05 + + armature.edit_bones['toe.R'].tail.z = 0 + armature.edit_bones['toe.R'].tail.y -= 0.05 + + bpy.ops.armature.select_all(action='DESELECT') + try: + select_bone(armature.edit_bones["breast.L"]) + bpy.ops.armature.symmetrize() + bpy.ops.armature.select_all(action='DESELECT') + + except Exception: + pass + + try: + armature.edit_bones["eye.L"].name = "DEF-eye.L" + armature.edit_bones["eye.R"].name = "DEF-eye.R" + except: + pass + + bpy.ops.object.mode_set(mode='POSE') + + bpy.ops.object.expykit_convert_bone_names(src_preset='Rigify_Metarig.py', trg_preset='Rigify_Deform.py') + bpy.ops.object.expykit_extract_metarig(rig_preset='Rigify_Metarig.py', assign_metarig=True) + + + + ## Fixes the tiddy bones. Expykit, why did you neglect them + + metarm = bpy.data.objects["metarig"].data + bpy.ops.object.mode_set(mode='EDIT') + armature = bpy.data.objects[obj.name].data + + ## Left side first, right side's xyz is same as left, but x is negative + def getboob(bone, tip): + if tip == "head": + return armature.edit_bones[bone].head.x, armature.edit_bones[bone].head.y, armature.edit_bones[bone].head.z + else: + return armature.edit_bones[bone].tail.x, armature.edit_bones[bone].tail.y, armature.edit_bones[bone].tail.z + + + try: + xh, yh, zh = getboob("breast.L", "head") + xt, yt, zt = getboob("breast.L", "tail") + + ## Change the meta arm's boob positions + + def fixboob(bone, xh, yh, zh, xt, yt, zt): + bone.head.x = xh + bone.head.y = yh + bone.head.z = zh + bone.tail.x = xt + bone.tail.y = yt + bone.tail.z = zt + + boobL = metarm.edit_bones["breast.L"] + fixboob(boobL, xh, yh, zh, xt, yt, zt) + boobR = metarm.edit_bones["breast.R"] + fixboob(boobR, -xh, yh, zh, -xt, yt, zt) + + boobL.roll = armature.edit_bones["breast.L"].roll + boobR.roll = -boobL.roll + except Exception: + # If breast bones dont exist in the orig rig, then delete from the meta rig + metarm.edit_bones.remove(metarm.edit_bones["breast.L"]) + metarm.edit_bones.remove(metarm.edit_bones["breast.R"]) + + + + # Fixes the finger rolls + bpy.ops.object.mode_set(mode='OBJECT') + metapose = bpy.data.objects['metarig'].pose + metapose.bones["thumb.01.L"].rigify_parameters.primary_rotation_axis = '-X' + metapose.bones["thumb.01.R"].rigify_parameters.primary_rotation_axis = '-X' + + + ## This part corrects metarm finger rolls + bpy.ops.object.mode_set(mode='OBJECT') + bpy.ops.object.select_all(action='DESELECT') + + armature = obj.data + + for o in bpy.data.objects: + # Check for given object names + if o.name in ("metarig", armature.name): + o.select_set(True) + + + bpy.ops.object.mode_set(mode='EDIT') + for bone in metarm.edit_bones: + if "f_" in bone.name or "thumb" in bone.name: + try: + bone.roll = armature.edit_bones["DEF-"+bone.name].roll + except: + pass + + # Fix hand bones being rotated 90 degrees sideways and arm deformation bones being wonky + if "Child" in obj.name: + metarm.edit_bones["upper_arm.L"].tail.y += .003 + metarm.edit_bones["upper_arm.R"].tail.y += .003 + + ########### DETACH PHYSICS BONES, + + metanames = ['eye.L', 'eye.R', 'spine', 'thigh.L', 'shin.L', 'foot.L', 'toe.L', 'thigh.R', 'shin.R', 'foot.R', 'toe.R', 'spine.001', 'spine.002', 'spine.003', 'breast.L', 'breast.R', 'shoulder.L', 'upper_arm.L', 'forearm.L', 'hand.L', 'thumb.01.L', 'thumb.02.L', 'thumb.03.L', 'f_index.01.L', 'f_index.02.L', 'f_index.03.L', 'f_middle.01.L', 'f_middle.02.L', 'f_middle.03.L', 'f_ring.01.L', 'f_ring.02.L', 'f_ring.03.L', 'f_pinky.01.L', 'f_pinky.02.L', 'f_pinky.03.L', 'spine.004', 'spine.006', 'shoulder.R', 'upper_arm.R', 'forearm.R', 'hand.R', 'thumb.01.R', 'thumb.02.R', 'thumb.03.R', 'f_index.01.R', 'f_index.02.R', 'f_index.03.R', 'f_middle.01.R', 'f_middle.02.R', 'f_middle.03.R', 'f_ring.01.R', 'f_ring.02.R', 'f_ring.03.R', 'f_pinky.01.R', 'f_pinky.02.R', 'f_pinky.03.R'] + if not toe_bones_exist: + metanames.remove("toe.L") + metanames.remove("toe.R") + + + pre_res = ["DEF-" + bonename for bonename in metanames] + armature = obj.data ## Original char rig + + + ## Make a dictionary. Key is a main body bone that exists in the Rigify (arm, leg, spine, etc), and the value is a list of all the children bones that aren't other main body bones (usually hair, clothes, deform, etc.) + savethechildren = { + + } + bpy.ops.object.mode_set(mode='EDIT') + for bone in armature.edit_bones: + if bone.name in pre_res: + childlist = [] + for childbone in armature.edit_bones[bone.name].children: + if childbone.name not in pre_res: # Adds only non-main body bones, avoids like forearm or knee etc + childlist.append(childbone.name) + if childlist: # If list isn't empty, add it to dict + wtf = bone.name + savethechildren[wtf] = childlist + + + ## Duplicates the physics bones + bpy.ops.object.mode_set(mode='EDIT') + bpy.ops.armature.select_all(action='DESELECT') + bones = armature.edit_bones[:] + for bone in bones: + if bone.name not in pre_res: + #this is a physics bone, so duplicate it. + bone.select = True + bone.select_tail = True + bone.select_head = True + + bpy.ops.armature.separate() + # Generates rigify rig and renames it to 'rigify' + bpy.ops.pose.rigify_generate() + bpy.data.objects[obj.name].name = "rigify" + + rig_obj_name = "rigify" + bpy.context.view_layer.objects.active = bpy.data.objects[armature.name + ".001"] # assumes rig obj is named rigify, ifn -> rename accordingly + + + for o in bpy.data.objects: + # Check for given object names + if o.name in ("rigify", armature.name + ".001"): + o.select_set(True) + + # THEN REATTACH PHYSICS + + bpy.ops.object.mode_set(mode='OBJECT') + ### BLENDER ARE U GOOD LMAO WTF IS THIS (this joins two objects together) + newrig = armature.name + ".001" ## New temporary armature with the physics bones. Hopefully you didnt touch any names lmao + + ## Why's the list for selected objects ordered alphabetically instead of by selection order + objList = bpy.context.selected_objects + unselected = [obj for obj in objList if obj != context.active_object] + rigifyr = unselected[0] ## Rigified Rig + + obs = [bpy.data.objects.get("rigify"), bpy.data.objects.get(newrig)] + c={} + + c["object"] = c["active_object"] = bpy.data.objects.get("rigify") + + c["selected_objects"] = c["selected_editable_objects"] = obs + bpy.ops.object.mode_set(mode='OBJECT') + bpy.ops.object.select_all(action='DESELECT') + + with bpy.context.temp_override(active_object=bpy.data.objects.get("rigify"), selected_editable_objects=obs): + bpy.ops.object.join() + + + bpy.context.view_layer.objects.active = bpy.data.objects["rigify"] + + setup_neck_and_head_follow(neck_follow_value=1.0, head_follow_value=1.0) + setup_finger_scale_controls_on_x_axis_to_curl_just_the_fingertips(rigifyr) + bpy.ops.object.mode_set(mode='EDIT') + + #### whats this for??? + #oh i think it's useless now bc there's only one rig LMAOLMAO + #for bone in bones_list: + # armature.edit_bones[bone.name].roll = rigifyr.data.edit_bones[bone.name].roll + #### + + ## Reattach the physics bones to their parents + #Go back into rigify, find the main body bones, and reattach every bone in the corresponding dict list + for mainbone in savethechildren: + for childbone in savethechildren[mainbone]: + rigifyr.data.edit_bones[childbone].parent = rigifyr.data.edit_bones[mainbone] + + print("donelol\n") + bpy.ops.object.mode_set(mode='OBJECT') + bpy.data.objects["rigify"].show_in_front = True + + # Symmetrize clothes/hair bones + bpy.ops.object.mode_set(mode='EDIT') + for bone in rigifyr.data.edit_bones: + if " L " in bone.name: # Finds clothes/hair bones with symmetrical bones + y = bone.name.find(' L ') # Finds index of "Hair L 1" + orgname = bone.name + try: + oppbone = orgname[:y] + " R " + orgname[y+3:] # oppbone = "Hair R 1" + bone.name = orgname[:y] + orgname[y+3:] + ".L" #Rename bones to "Hair 1.L/R" so Blender + rigifyr.data.edit_bones[oppbone].name = orgname[:y] + orgname[y+3:] + ".R" # goes ":o symmetry" + except: + pass + + #rigifyr.pose.bones["upper_arm_parent.L"]["pole_parent"] = 2 + #rigifyr.pose.bones["upper_arm_parent.R"]["pole_parent"] = 2 + #rigifyr.pose.bones["thigh_parent.L"]["pole_parent"] = 2 + #rigifyr.pose.bones["thigh_parent.R"]["pole_parent"] = 2 + + #bpy.ops.object.mode_set(mode='OBJECT') + ##change active object to rigifyr + + #bpy.context.view_layer.objects.active = bpy.data.objects["rigify"] + + #bpy.ops.object.mode_set(mode='OBJECT') + + # This part puts all the main bones I use into the secoond bone layer + listofbones = ["root", "foot_heel_ik.R", "foot_heel_ik.L", "toe_ik.R", "toe_ik.L", "foot_ik.R", "foot_ik.L", "thigh_ik_target.R", "thigh_ik_target.L", "hips", "torso", "chest", "neck", "head", "shoulder.L", "shoulder.R", "upper_arm_fk.L", "upper_arm_fk.R", "forearm_fk.L", "forearm_fk.R", "hand_fk.L", "hand_fk.R", "upper_arm_ik_target.L", "upper_arm_ik_target.R", "hand_ik.R", "hand_ik.L", ] + rigifyr = obj + if not toe_bones_exist: + listofbones.remove("toe_ik.R") + listofbones.remove("toe_ik.L") + if not is_version_4: + for bone in listofbones: + bpy.context.active_object.pose.bones[bone].bone.layers[1] = True + + #x = original_name.split("_") + char_name = original_name + bpy.data.objects["rigify"].name = char_name + + + bpy.ops.object.mode_set(mode='POSE') + bpy.ops.pose.select_all(action='DESELECT') + bones_list = obj.pose.bones + + # Creates selection sets for FK arms + shoulders, hair bones, and clothes bones. Selection Sets is an addon that comes with Blender. + try: + bpy.ops.object.mode_set(mode='POSE') + + arms = ['upper_arm_fk', 'forearm_fk', 'hand_fk', 'shoulder'] + bpy.ops.pose.select_all(action='DESELECT') + for side in ['.L', '.R']: + for bone in arms: + bonename = bone + side + rigifyr.pose.bones[bonename].bone.select= True + bpy.ops.pose.selection_set_add() + bpy.ops.pose.selection_set_assign() + bpy.ops.pose.select_all(action='DESELECT') + + ## Hair + for bone in bones_list: + if "Hair" in bone.name: + rigifyr.pose.bones[bone.name].bone.select = True + bpy.ops.pose.selection_set_add() + bpy.ops.pose.selection_set_assign() + bpy.ops.pose.select_all(action='DESELECT') + + ## Clothes + for bone in bones_list: + if "Amice" in bone.name or ("fk" not in bone.name and "tweak" not in bone.name and "Twist" not in bone.name and "Hair" not in bone.name and (bone.name[-1].isdigit() or bone.name[-3].isdigit())): + rigifyr.pose.bones[bone.name].bone.select = True + bpy.ops.pose.selection_set_add() + bpy.ops.pose.selection_set_assign() + bpy.ops.pose.select_all(action='DESELECT') + bpy.context.object.selection_sets[0].name = "FK Arms" + bpy.context.object.selection_sets[1].name = "Hair" + bpy.context.object.selection_sets[2].name = "Clothes...and teeth and eyes lmao" + except: + pass + + bpy.ops.object.mode_set(mode='EDIT') + # Deletes the extra useless finger bones + eatthis = ['f_index.03.L', 'f_index.01.L.001', 'thumb.03.L', 'thumb.01.L.001', 'f_middle.03.L', 'f_middle.01.L.001', 'f_ring.01_master.L', 'f_ring.01.L', 'f_ring.02.L', 'f_ring.03.L', 'f_ring.01.L.001', 'f_pinky.01_master.L', 'f_pinky.01.L', 'f_pinky.02.L', 'f_pinky.03.L', 'f_pinky.01.L.001', 'palm.L', 'f_index.03.R', 'f_index.01.R.001', 'thumb.03.R', 'thumb.01.R.001', 'f_middle.03.R', 'f_middle.01.R.001', 'f_ring.01_master.R', 'f_ring.01.R', 'f_ring.02.R', 'f_ring.03.R', 'f_ring.01.R.001', 'f_pinky.01_master.R', 'f_pinky.01.R', 'f_pinky.02.R', 'f_pinky.03.R', 'f_pinky.01.R.001', 'palm.R'] + for this in eatthis: + ugh = rigifyr.data.edit_bones[this] + rigifyr.data.edit_bones.remove(ugh) + + # This workaround is for an issue so stupid i dont even want to explain this lmao + bpy.ops.object.mode_set(mode='POSE') + wtf = ['MCH-f_index.02.L', 'MCH-thumb.02.L', 'MCH-f_middle.02.L', 'MCH-f_index.02.R', 'MCH-thumb.02.R', 'MCH-f_middle.02.R', 'MCH-f_index.03.L', 'MCH-thumb.03.L', 'MCH-f_middle.03.L', 'MCH-f_index.03.R', 'MCH-thumb.03.R', 'MCH-f_middle.03.R'] + for this in wtf: + rigifyr.pose.bones[this].constraints[0].enabled = False + + + bpy.ops.object.mode_set(mode='EDIT') + # The scale controls for the fingers are big as hell lmao what. + sizethis = ['thumb.01_master.L', 'f_index.01_master.L', 'f_middle.01_master.L', 'thumb.01_master.R', 'f_index.01_master.R', 'f_middle.01_master.R'] + for this in sizethis: + rigifyr.data.edit_bones[this].length *= .25 + + # This corrects the drivers on the superscale control. Without this fix, the scales operate opposite to how they should. + bpy.ops.object.mode_set(mode='POSE') + for oDrv in rigifyr.animation_data.drivers: + for variable in oDrv.driver.variables: + for target in variable.targets: + if "MCH-f_middle.02_drv" in oDrv.data_path or "MCH-f_index.02_drv" in oDrv.data_path: + oDrv.driver.expression += "* -1" + + bpy.ops.object.mode_set(mode='OBJECT') + try: + head_driver_obj = bpy.data.objects.get("Head Driver") or bpy.data.objects.get("Head Origin") + bpy.context.view_layer.objects.active = head_driver_obj + bpy.ops.constraint.childof_set_inverse(constraint="Child Of", owner='OBJECT') + except: + pass + + # POST RIGIFY SCRIPT EXECUTION -----------------> + + # Hide metarig (I think you can actually delete it instead?) + bpy.data.objects["metarig"].hide_select = True + bpy.data.objects["metarig"].hide_viewport = True + bpy.data.objects["metarig"].hide_render = True + + # Moves specified param and it's children into the collection + def move_into_collection(object,collection): + + # Get object + this_obj = bpy.context.scene.objects.get(object) + # Get existing collection or make new one + this_coll = bpy.data.collections.get(collection) + if not this_coll: + this_coll = bpy.data.collections.new(collection) + bpy.context.scene.collection.children.link(this_coll) + + # Move object into collection + if this_obj: + # Unlink it from all previous collections before moving it to new one + for coll in this_obj.users_collection: + coll.objects.unlink(this_obj) + + # Move it to our specified collection (This only does the parent obj) + this_coll.objects.link(this_obj) + + # Now we move the children of this object + for child_obj in this_obj.children: + # Same thing, unlink previous collections + for coll in child_obj.users_collection: + coll.objects.unlink(child_obj) + this_coll.objects.link(child_obj) + + # Move the rig into the char name's collection + move_into_collection(char_name,char_name) + + # Let's make a new wgt collection inside the char coll. + char_coll = bpy.data.collections.get(char_name) + wgt_coll = bpy.data.collections.new("wgt") + char_coll.children.link(wgt_coll) + + # Rename our WGT collection and put the metarig into it. + for coll in bpy.data.collections: + if coll.name.startswith("WGTS"): + coll.name = "WG" + + move_into_collection("metarig","wgt") + + # Unlink all inner objects from the old WGT collection. We want them inside the new one. + for obj in bpy.data.objects: + if obj.name.startswith("WGT"): + for coll in obj.users_collection: + coll.objects.unlink(obj) + + wgt_coll.objects.link(obj) + + # Remove old unused wgt collection + bpy.data.collections.remove(bpy.data.collections.get("WG")) + + # Obfuscate light driving stuff not needed, keep the main light. + move_into_collection("Face Light Direction","wgt") + move_into_collection("Head Driver",char_name) + move_into_collection("Main Light Direction",char_name) + + # V3 Shader Support - New empty names + move_into_collection("Head Origin",char_name) + move_into_collection("Light Direction",char_name) + + bpy.data.collections["wgt"].hide_select = True + bpy.data.collections["wgt"].hide_viewport = True + bpy.data.collections["wgt"].hide_render = True + + head_driver_obj = bpy.data.objects.get("Head Driver") or bpy.data.objects.get("Head Origin") + if head_driver_obj: + head_driver_obj.hide_select = True + head_driver_obj.hide_viewport = True + head_driver_obj.hide_render = True + + head_forward_obj = bpy.data.objects.get("Head Forward") + head_forward_obj.hide_select = True + head_forward_obj.hide_viewport = True + head_forward_obj.hide_render = True + + head_up_obj = bpy.data.objects.get("Head Up") + head_up_obj.hide_select = True + head_up_obj.hide_viewport = True + head_up_obj.hide_render = True + + # If it exists, gets rid of the default collection. + camera_coll = bpy.data.collections.get("Collection") + if camera_coll: + bpy.data.collections.remove(camera_coll,do_unlink=True) + + # Let's 'exclude' that wgt collection: https://blenderartists.org/t/disable-exlude-from-view-layer-in-collection/1324744 + def recurLayerCollection(layerColl): + found = None + if (layerColl.name == "wgt"): + return layerColl + for layer in layerColl.children: + found = recurLayerCollection(layer) + if found: + return found + layer_collection = bpy.context.view_layer.layer_collection + layerColl = recurLayerCollection(layer_collection) + bpy.context.view_layer.active_layer_collection = layerColl + + layerColl.exclude = True + + # Make our lives easier, display the bones as sticks and make sure we can view from front. + bpy.data.armatures[original_name].display_type = 'STICK' + bpy.data.objects[char_name].show_in_front = True + + # Going into pose mode with our character selected. + bpy.ops.object.select_all(action='DESELECT') + our_char = bpy.data.objects.get(char_name) + if our_char: + our_char.select_set(True) + bpy.context.view_layer.objects.active = our_char + + bpy.ops.object.mode_set(mode='POSE') + + # Function to automatically move a bone (if it exists) to the specified bone layer + def move_bone(bone_name,to_layers): + armature = bpy.context.active_object + armature_data = armature.data + + if bone_name in armature_data.bones: + bone = armature_data.bones[bone_name] + + for i in range(32): + bone.layers[i] = False + + to_layers = [to_layers] if isinstance(to_layers, int) else to_layers + + for layer in to_layers: + bone.layers[layer] = True + print("enabling layer: " + str(layer) + " for " + bone_name) + + + if not is_version_4: + # Put away every other bone to the physics layer (22) + for bone in bpy.context.active_object.data.bones: + if bone.layers[0]: # Check if the bone is on layer face + move_bone(bone.name, 25) # Move the bone to layer 23 + + # Let's append our root_shape custom bones + path_to_file = file_path + "/Collection" + + # Bring in our collections: root shapes, face rig, and the eye rig + bpy.ops.wm.append(filename='append_NPC Plate', directory=path_to_file) + + bpy.ops.wm.append(filename='append_Root', directory=path_to_file) + + bpy.ops.wm.append(filename='append_Eyes', directory=path_to_file) + + bpy.ops.wm.append(filename='append_Pelvis', directory=path_to_file) + + bpy.ops.wm.append(filename='append_Foot', directory=path_to_file) + + bpy.ops.wm.append(filename='append_Hand', directory=path_to_file) + + bpy.ops.wm.append(filename='append_Props', directory=path_to_file) + + this_obj = our_char + + this_obj.pose.bones["root"].custom_shape = bpy.data.objects["root plate.002"] + this_obj.pose.bones["root"].use_custom_shape_bone_size = False + + this_obj.pose.bones["head"].custom_shape_scale_xyz = (1.65,1.65,1.65) + this_obj.pose.bones["head"].custom_shape = bpy.data.objects["neck"] + this_obj.pose.bones["head"].custom_shape_translation = (0.0,0.255,0.0) + this_obj.pose.bones["head"].custom_shape_rotation_euler[0] = 1.5708 + this_obj.pose.bones["head"].use_custom_shape_bone_size = False + + this_obj.pose.bones["neck"].use_custom_shape_bone_size = False + this_obj.pose.bones["neck"].custom_shape = bpy.data.objects["neck"] + this_obj.pose.bones["neck"].custom_shape_scale_xyz = (1,1,1) + this_obj.pose.bones["neck"].custom_shape_translation = (0.0,0.035,0.007) + this_obj.pose.bones["neck"].custom_shape_rotation_euler[0] = 1.5708 + + this_obj.pose.bones["foot_ik.L"].use_custom_shape_bone_size = False + this_obj.pose.bones["foot_ik.R"].use_custom_shape_bone_size = False + this_obj.pose.bones["foot_ik.L"].custom_shape = bpy.data.objects["foot1"] + this_obj.pose.bones["foot_ik.R"].custom_shape = bpy.data.objects["foot1"] + + this_obj.pose.bones["thigh_ik_target.L"].custom_shape = bpy.data.objects["npc_primo"] + this_obj.pose.bones["thigh_ik_target.R"].custom_shape = bpy.data.objects["npc_primo"] + this_obj.pose.bones["upper_arm_ik_target.R"].custom_shape = bpy.data.objects["npc_primo"] + this_obj.pose.bones["upper_arm_ik_target.L"].custom_shape = bpy.data.objects["npc_primo"] + + this_obj.pose.bones["thigh_ik_target.L"].custom_shape_scale_xyz[0] = 0.75 + this_obj.pose.bones["thigh_ik_target.L"].custom_shape_scale_xyz[1] = 0.75 + this_obj.pose.bones["thigh_ik_target.L"].custom_shape_scale_xyz[2] = 0.75 + this_obj.pose.bones["thigh_ik_target.R"].custom_shape_scale_xyz[0] = 0.75 + this_obj.pose.bones["thigh_ik_target.R"].custom_shape_scale_xyz[1] = 0.75 + this_obj.pose.bones["thigh_ik_target.R"].custom_shape_scale_xyz[2] = 0.75 + + this_obj.pose.bones["torso"].custom_shape = bpy.data.objects["pelvis2"] + this_obj.pose.bones["torso"].use_custom_shape_bone_size = False + + this_obj.pose.bones["hips"].custom_shape = bpy.data.objects["hips"] + this_obj.pose.bones["hips"].custom_shape_scale_xyz = (1,1,1) + this_obj.pose.bones["hips"].custom_shape_translation = (0.0,-0.04,0.044) + this_obj.pose.bones["hips"].custom_shape_rotation_euler[0] = 1.309 + this_obj.pose.bones["hips"].use_custom_shape_bone_size = False + + this_obj.pose.bones["chest"].custom_shape = bpy.data.objects["chest"] + this_obj.pose.bones["chest"].custom_shape_scale_xyz = (0.6,0.6,0.6) + this_obj.pose.bones["chest"].custom_shape_translation = (0.0,0.18,0.0) + this_obj.pose.bones["chest"].custom_shape_rotation_euler[0] = 1.5708 + this_obj.pose.bones["chest"].use_custom_shape_bone_size = False + + this_obj.pose.bones["shoulder.L"].custom_shape_scale_xyz = (1.6,1.6,1.6) + this_obj.pose.bones["shoulder.R"].custom_shape_scale_xyz = (1.6,1.6,1.6) + + this_obj.pose.bones["foot_heel_ik.L"].custom_shape_translation = (0.0,0.06,0.0) + this_obj.pose.bones["foot_heel_ik.R"].custom_shape_translation = (0.0,0.06,0.0) + + this_obj.pose.bones["foot_spin_ik.R"].custom_shape_translation = (0.0,-0.05,0.02) + this_obj.pose.bones["foot_spin_ik.L"].custom_shape_translation = (0.0,-0.05,0.02) + + this_obj.pose.bones["toe_ik.L"].custom_shape_translation = (0.0,0.06,0.00) + this_obj.pose.bones["toe_ik.R"].custom_shape_translation = (0.0,0.06,0.00) + this_obj.pose.bones["toe_ik.L"].custom_shape_scale_xyz = (0.781,0.781,0.350) + this_obj.pose.bones["toe_ik.R"].custom_shape_scale_xyz = (0.781,0.781,0.350) + + this_obj.pose.bones["hand_ik.R"].use_custom_shape_bone_size = False + this_obj.pose.bones["hand_ik.R"].custom_shape = bpy.data.objects["wrist"] + + this_obj.pose.bones["hand_ik.L"].use_custom_shape_bone_size = False + this_obj.pose.bones["hand_ik.L"].custom_shape = bpy.data.objects["wrist"] + + #this_obj.pose.bones["palm.L"].custom_shape_scale_xyz = (1.2,1.2,1.2) + #this_obj.pose.bones["palm.R"].custom_shape_scale_xyz = (1.2,1.2,1.2) + + + # Merge the armatures; go into object mode and make sure nothing is selected + bpy.ops.object.mode_set(mode='OBJECT') + bpy.ops.object.select_all(action='DESELECT') + + # Select custom face armature + face_rig_obj = bpy.data.objects.get("npc_facerig") + if face_rig_obj: + face_rig_obj.select_set(True) + + # Select eye rig + eye_rig_obj = bpy.data.objects.get("eyerig") + if eye_rig_obj: + eye_rig_obj.select_set(True) + + # Select root rig + root_rig_obj = bpy.data.objects.get("rootrig") + if root_rig_obj: + root_rig_obj.select_set(True) + + # Select pelvis rig + pelvis_rig_obj = bpy.data.objects.get("pelvisrig") + if pelvis_rig_obj: + pelvis_rig_obj.select_set(True) + + # Select foot L rig + foot_l_rig_obj = bpy.data.objects.get("footrig-L") + if foot_l_rig_obj: + foot_l_rig_obj.select_set(True) + + # Select foot R rig + foot_r_rig_obj = bpy.data.objects.get("footrig-R") + if foot_r_rig_obj: + foot_r_rig_obj.select_set(True) + + # Select hand R rig + hand_r_rig_obj = bpy.data.objects.get("handrig-R") + if hand_r_rig_obj: + hand_r_rig_obj.select_set(True) + + # Select hand L rig + hand_l_rig_obj = bpy.data.objects.get("handrig-L") + if hand_l_rig_obj: + hand_l_rig_obj.select_set(True) + + # Select prop rig + prop_rig_obj = bpy.data.objects.get("prop-rig") + if prop_rig_obj: + prop_rig_obj.select_set(True) + + # Select char armature + if our_char: + our_char.select_set(True) + + # Join them + bpy.ops.object.join() + + # Get the intersection point of a line with a perpendicular plane + def project_line_in_space(points1, points2, axis): + x1, y1, z1 = points1 + x2, y2, z2 = points2 + + m = (y2 - y1) / (x2 - x1) if (x2 - x1) != 0 else None + b = y1 - m * x1 if m is not None else None + + if m is None: + return None + + # Intersection point + intersection_x = axis + intersection_y = m * intersection_x + b + intersection_z = z1 + (intersection_y - y1) * (z2 - z1) / (y2 - y1) + + intersection_point = (intersection_x, intersection_y, intersection_z) + return intersection_point + + # Select the object then access it's rig (its obj data) + ob = bpy.data.objects[char_name] + armature = ob.data + + # In edit mode, select platebone and head controller and set their parent bones. + bpy.ops.object.mode_set(mode='EDIT') + armature.edit_bones['plate-border'].parent = armature.edit_bones['head'] + armature.edit_bones['plate-settings'].parent = armature.edit_bones['head'] + + armature.edit_bones['plate-border'].head = armature.edit_bones['neck'].head.copy() + armature.edit_bones['plate-border'].tail = armature.edit_bones['neck'].tail.copy() + armature.edit_bones['plate-border'].head.x = 0.33 + armature.edit_bones['plate-border'].head.y = 0 + armature.edit_bones['plate-border'].tail.y = 0 + armature.edit_bones['plate-border'].tail.x = 0.33 + + armature.edit_bones['plate-settings'].head = armature.edit_bones['head'].head.copy() + armature.edit_bones['plate-settings'].tail = armature.edit_bones['head'].head.copy() + armature.edit_bones['plate-settings'].head.y = 0 + armature.edit_bones['plate-settings'].tail.y = 0 + armature.edit_bones['plate-settings'].head.z += 0.5 + armature.edit_bones['plate-settings'].tail.z += 0.6 + # While here, set inherit scale of limb gears. + armature.edit_bones['upper_arm_parent.L'].inherit_scale="NONE" + armature.edit_bones['upper_arm_parent.R'].inherit_scale="NONE" + armature.edit_bones['thigh_parent.L'].inherit_scale="NONE" + armature.edit_bones['thigh_parent.R'].inherit_scale="NONE" + armature.edit_bones['torso-outer'].inherit_scale="AVERAGE" + + # fix the bad rolls of the torso bone + armature.edit_bones['torso'].roll = 0 + armature.edit_bones['torso-inner'].roll = 0 + armature.edit_bones['torso-outer'].roll = 0 + + armature.edit_bones['torso-inner'].inherit_scale="FULL" + armature.edit_bones['torso'].inherit_scale="FULL" + armature.edit_bones['forearm_tweak-pin.R'].inherit_scale="AVERAGE" + armature.edit_bones['forearm_tweak-pin.L'].inherit_scale="AVERAGE" + armature.edit_bones['shin_tweak-pin.L'].inherit_scale="AVERAGE" + armature.edit_bones['shin_tweak-pin.R'].inherit_scale="AVERAGE" + armature.edit_bones['hand-ik-L'].inherit_scale="AVERAGE" + armature.edit_bones['hand-ik-R'].inherit_scale="AVERAGE" + armature.edit_bones['hand_ik.L'].inherit_scale="FULL" + armature.edit_bones['hand_ik.R'].inherit_scale="FULL" + + if(use_head_tracker): + armature.edit_bones['head-controller'].parent = armature.edit_bones['root'] + + # Fixing Foot spin bone pos for chars with generated feet bones. + if not toe_bones_exist: + armature.edit_bones['foot_spin_ik.L'].head.z = 0 + armature.edit_bones['foot_spin_ik.L'].tail.z = 0 + + armature.edit_bones['foot_spin_ik.R'].head.z = 0 + armature.edit_bones['foot_spin_ik.R'].tail.z = 0 + + # SET RELATIONSHIPS as needed after bringing in new bones + armature.edit_bones['root'].parent = armature.edit_bones['root-inner'] + + armature.edit_bones['torso-outer'].parent = armature.edit_bones['MCH-torso.parent'] + armature.edit_bones['torso'].parent = armature.edit_bones['torso-inner'] + armature.edit_bones['torso_pivot.002'].parent = armature.edit_bones['torso'] + armature.edit_bones['hips'].parent = armature.edit_bones['MCH-torso_pivot.002'] + armature.edit_bones['chest'].parent = armature.edit_bones['MCH-torso_pivot.002'] + armature.edit_bones['MCH-spine.001'].parent = armature.edit_bones['MCH-torso_pivot.002'] + armature.edit_bones['MCH-spine.002'].parent = armature.edit_bones['MCH-torso_pivot.002'] + + armature.edit_bones['ik-pivot-L'].parent = armature.edit_bones['foot_ik.L'] + armature.edit_bones['ik-pivot-R'].parent = armature.edit_bones['foot_ik.R'] + armature.edit_bones['foot_spin_ik.L'].parent = armature.edit_bones['ik-target-L'] + armature.edit_bones['foot_spin_ik.R'].parent = armature.edit_bones['ik-target-R'] + + armature.edit_bones['hand-ik-L'].parent = armature.edit_bones['MCH-hand_ik.parent.L'] + armature.edit_bones['hand-ik-R'].parent = armature.edit_bones['MCH-hand_ik.parent.R'] + armature.edit_bones['hand_ik.L'].parent = armature.edit_bones['mch-hand-ik-pivot-L'] + armature.edit_bones['hand_ik.R'].parent = armature.edit_bones['mch-hand-ik-pivot-R'] + armature.edit_bones['mch-hand-ik-wrist-L'].parent = armature.edit_bones['hand_ik.L'] + armature.edit_bones['mch-hand-ik-wrist-R'].parent = armature.edit_bones['hand_ik.R'] + armature.edit_bones['MCH-upper_arm_ik_target.L'].parent = armature.edit_bones['mch-hand-ik-wrist-L'] + armature.edit_bones['MCH-upper_arm_ik_target.R'].parent = armature.edit_bones['mch-hand-ik-wrist-R'] + + # on NPC's only, org spine 003 is missing, so shoulders act weird. instead try parenting to def spine 002 + armature.edit_bones['shoulder_driver.L'].parent = armature.edit_bones['DEF-spine.002'] + armature.edit_bones['shoulder_driver.R'].parent = armature.edit_bones['DEF-spine.002'] + armature.edit_bones['MCH-shoulder_follow.L'].parent = armature.edit_bones['DEF-spine.002'] + armature.edit_bones['MCH-shoulder_follow.R'].parent = armature.edit_bones['DEF-spine.002'] + armature.edit_bones['shoulder.L'].parent = armature.edit_bones['MCH-shoulder_follow.L'] + armature.edit_bones['shoulder.R'].parent = armature.edit_bones['MCH-shoulder_follow.R'] + armature.edit_bones['ORG-shoulder.L'].parent = armature.edit_bones['DEF-spine.002'] + armature.edit_bones['ORG-shoulder.R'].parent = armature.edit_bones['DEF-spine.002'] + + + + # RENAME imported bones + rename_bones_list = [("root", "root.002")] + rename_bones_list.append(("root-inner", "root.001")) + rename_bones_list.append(("root-outer", "root")) + + rename_bones_list.append(("torso", "torso.002")) + rename_bones_list.append(("torso-inner", "torso.001")) + rename_bones_list.append(("torso-outer", "torso")) + + rename_bones_list.append(("ik-pivot-L", "foot_ik_pivot.L")) + rename_bones_list.append(("mch-ik-pivot-L", "MCH-foot_ik_pivot.L")) + rename_bones_list.append(("ik-sub-pivot-L", "foot_ik_sub.L")) + rename_bones_list.append(("ik-target-L", "MCH-thigh_ik_target_sub.L")) + + rename_bones_list.append(("ik-pivot-R", "foot_ik_pivot.R")) + rename_bones_list.append(("mch-ik-pivot-R", "MCH-foot_ik_pivot.R")) + rename_bones_list.append(("ik-sub-pivot-R", "foot_ik_sub.R")) + rename_bones_list.append(("ik-target-R", "MCH-thigh_ik_target_sub.R")) + + rename_bones_list.append(("hand_ik.L", "hand_ik_wrist.L")) + rename_bones_list.append(("hand-ik-L", "hand_ik.L")) + rename_bones_list.append(("hand-ik-pivot-L", "hand_ik_pivot.L")) + rename_bones_list.append(("mch-hand-ik-pivot-L", "MCH-hand_ik_pivot.L")) + rename_bones_list.append(("mch-hand-ik-wrist-L", "MCH-hand_ik_wrist.L")) + + rename_bones_list.append(("hand_ik.R", "hand_ik_wrist.R")) + rename_bones_list.append(("hand-ik-R", "hand_ik.R")) + rename_bones_list.append(("hand-ik-pivot-R", "hand_ik_pivot.R")) + rename_bones_list.append(("mch-hand-ik-pivot-R", "MCH-hand_ik_pivot.R")) + rename_bones_list.append(("mch-hand-ik-wrist-R", "MCH-hand_ik_wrist.R")) + + + # TORSO POS fixing + #armature.edit_bones['torso'].roll = -1.5708 + torso_head_pos = armature.edit_bones['torso'].head.copy() + torso_tail_pos = armature.edit_bones['torso'].tail.copy() + + armature.edit_bones['torso-inner'].head = torso_head_pos + armature.edit_bones['torso-inner'].tail = torso_tail_pos + armature.edit_bones['torso-inner'].tail.y += 0.05 + + armature.edit_bones['torso-outer'].head = torso_head_pos + armature.edit_bones['torso-outer'].tail = torso_tail_pos + armature.edit_bones['torso-outer'].tail.y += 0.1 + + armature.edit_bones['torso_pivot.002'].head = torso_head_pos + armature.edit_bones['torso_pivot.002'].tail = torso_tail_pos + + armature.edit_bones['MCH-torso_pivot.002'].head = torso_head_pos + armature.edit_bones['MCH-torso_pivot.002'].tail = torso_tail_pos + armature.edit_bones['MCH-torso_pivot.002'].length -= 0.09 + + # FOOT POS fixing: Remember to use old bone names pre renaming + foot_L_z_diff = armature.edit_bones['foot_ik.L'].tail.z - armature.edit_bones['foot_spin_ik.L'].tail.z + foot_R_z_diff = armature.edit_bones['foot_ik.R'].tail.z - armature.edit_bones['foot_spin_ik.R'].tail.z + + armature.edit_bones['ik-sub-pivot-L'].head = armature.edit_bones['foot_ik.L'].head.copy() + armature.edit_bones['ik-sub-pivot-L'].tail = armature.edit_bones['foot_ik.L'].tail.copy() + + armature.edit_bones['ik-sub-pivot-R'].head = armature.edit_bones['foot_ik.R'].head.copy() + armature.edit_bones['ik-sub-pivot-R'].tail = armature.edit_bones['foot_ik.R'].tail.copy() + + armature.edit_bones['ik-pivot-L'].head = armature.edit_bones['MCH-heel.02_roll2.L'].head.copy() + armature.edit_bones['ik-pivot-L'].tail = armature.edit_bones['MCH-heel.02_roll2.L'].tail.copy() + armature.edit_bones['ik-pivot-L'].tail.y += 0.05 + + armature.edit_bones['ik-pivot-R'].head = armature.edit_bones['MCH-heel.02_roll2.R'].head.copy() + armature.edit_bones['ik-pivot-R'].tail = armature.edit_bones['MCH-heel.02_roll2.R'].tail.copy() + armature.edit_bones['ik-pivot-R'].tail.y += 0.05 + + armature.edit_bones['mch-ik-pivot-L'].head = armature.edit_bones['MCH-heel.02_roll2.L'].head.copy() + armature.edit_bones['mch-ik-pivot-L'].tail = armature.edit_bones['MCH-heel.02_roll2.L'].tail.copy() + + armature.edit_bones['mch-ik-pivot-R'].head = armature.edit_bones['MCH-heel.02_roll2.R'].head.copy() + armature.edit_bones['mch-ik-pivot-R'].tail = armature.edit_bones['MCH-heel.02_roll2.R'].tail.copy() + + armature.edit_bones['ik-target-L'].head = armature.edit_bones['foot_tweak.L'].head.copy() + armature.edit_bones['ik-target-L'].tail = armature.edit_bones['foot_tweak.L'].tail.copy() + + armature.edit_bones['ik-target-R'].head = armature.edit_bones['foot_tweak.R'].head.copy() + armature.edit_bones['ik-target-R'].tail = armature.edit_bones['foot_tweak.R'].tail.copy() + + foot_L_x_diff = armature.edit_bones['ik-sub-pivot-L'].tail.x - armature.edit_bones['foot_spin_ik.L'].tail.x + foot_R_x_diff = armature.edit_bones['ik-sub-pivot-R'].tail.x - armature.edit_bones['foot_spin_ik.R'].tail.x + + armature.edit_bones['MCH-shin_tweak-pin.parent.R'].head = armature.edit_bones['MCH-shin_ik.L'].head.copy() + armature.edit_bones['MCH-shin_tweak-pin.parent.R'].tail.z = armature.edit_bones['MCH-shin_ik.L'].tail.z + armature.edit_bones['MCH-shin_tweak-pin.parent.R'].tail.x = armature.edit_bones['MCH-shin_ik.L'].tail.x + armature.edit_bones['MCH-shin_tweak-pin.parent.R'].roll = 0 + armature.edit_bones['MCH-shin_tweak-pin.parent.R'].length = .02 + + armature.edit_bones['shin_tweak-pin.L'].head = armature.edit_bones['MCH-shin_ik.L'].head.copy() + armature.edit_bones['shin_tweak-pin.L'].tail = armature.edit_bones['MCH-shin_ik.L'].tail.copy() + armature.edit_bones['shin_tweak-pin.L'].roll = armature.edit_bones['MCH-shin_ik.L'].roll + armature.edit_bones['shin_tweak-pin.L'].length -= 0.15 + + armature.edit_bones['MCH-shin_tweak-pin.parent.R'].head = armature.edit_bones['MCH-shin_ik.R'].head.copy() + armature.edit_bones['MCH-shin_tweak-pin.parent.R'].tail.z = armature.edit_bones['MCH-shin_ik.R'].tail.z + armature.edit_bones['MCH-shin_tweak-pin.parent.R'].tail.x = armature.edit_bones['MCH-shin_ik.R'].tail.x + armature.edit_bones['MCH-shin_tweak-pin.parent.R'].roll = 0 + armature.edit_bones['MCH-shin_tweak-pin.parent.R'].length = .02 + + armature.edit_bones['shin_tweak-pin.R'].head = armature.edit_bones['MCH-shin_ik.R'].head.copy() + armature.edit_bones['shin_tweak-pin.R'].tail = armature.edit_bones['MCH-shin_ik.R'].tail.copy() + armature.edit_bones['shin_tweak-pin.R'].roll = armature.edit_bones['MCH-shin_ik.R'].roll + armature.edit_bones['shin_tweak-pin.R'].length -= 0.15 + + # HAND POS Fixing + armature.edit_bones['hand-ik-L'].head = armature.edit_bones['hand_ik.L'].head.copy() + armature.edit_bones['hand-ik-L'].tail = armature.edit_bones['hand_ik.L'].tail.copy() + armature.edit_bones['hand-ik-L'].roll = armature.edit_bones['hand_ik.L'].roll + + armature.edit_bones['hand-ik-pivot-L'].head = armature.edit_bones['hand_ik.L'].head.copy() + armature.edit_bones['hand-ik-pivot-L'].tail = armature.edit_bones['hand_ik.L'].tail.copy() + armature.edit_bones['hand-ik-pivot-L'].roll = armature.edit_bones['hand_ik.L'].roll + + armature.edit_bones['mch-hand-ik-pivot-L'].head = armature.edit_bones['hand_ik.L'].head.copy() + armature.edit_bones['mch-hand-ik-pivot-L'].tail = armature.edit_bones['hand_ik.L'].tail.copy() + armature.edit_bones['mch-hand-ik-pivot-L'].roll = armature.edit_bones['hand_ik.L'].roll + armature.edit_bones['mch-hand-ik-pivot-L'].length -= 0.03 + + armature.edit_bones['mch-hand-ik-wrist-L'].head = armature.edit_bones['hand_ik.L'].head.copy() + armature.edit_bones['mch-hand-ik-wrist-L'].tail = armature.edit_bones['hand_ik.L'].tail.copy() + armature.edit_bones['mch-hand-ik-wrist-L'].roll = armature.edit_bones['hand_ik.L'].roll + armature.edit_bones['mch-hand-ik-wrist-L'].length -= 0.04 + + armature.edit_bones['hand-ik-R'].head = armature.edit_bones['hand_ik.R'].head.copy() + armature.edit_bones['hand-ik-R'].tail = armature.edit_bones['hand_ik.R'].tail.copy() + armature.edit_bones['hand-ik-R'].roll = armature.edit_bones['hand_ik.R'].roll + + armature.edit_bones['hand-ik-pivot-R'].head = armature.edit_bones['hand_ik.R'].head.copy() + armature.edit_bones['hand-ik-pivot-R'].tail = armature.edit_bones['hand_ik.R'].tail.copy() + armature.edit_bones['hand-ik-pivot-R'].roll = armature.edit_bones['hand_ik.R'].roll + + armature.edit_bones['mch-hand-ik-pivot-R'].head = armature.edit_bones['hand_ik.R'].head.copy() + armature.edit_bones['mch-hand-ik-pivot-R'].tail = armature.edit_bones['hand_ik.R'].tail.copy() + armature.edit_bones['mch-hand-ik-pivot-R'].roll = armature.edit_bones['hand_ik.R'].roll + armature.edit_bones['mch-hand-ik-pivot-R'].length -= 0.03 + + armature.edit_bones['mch-hand-ik-wrist-R'].head = armature.edit_bones['hand_ik.R'].head.copy() + armature.edit_bones['mch-hand-ik-wrist-R'].tail = armature.edit_bones['hand_ik.R'].tail.copy() + armature.edit_bones['mch-hand-ik-wrist-R'].roll = armature.edit_bones['hand_ik.R'].roll + armature.edit_bones['mch-hand-ik-wrist-R'].length -= 0.04 + + armature.edit_bones['MCH-forearm_tweak-pin.parent.L'].head = armature.edit_bones['MCH-forearm_ik.L'].head.copy() + armature.edit_bones['MCH-forearm_tweak-pin.parent.L'].tail.z = armature.edit_bones['MCH-forearm_ik.L'].tail.z + armature.edit_bones['MCH-forearm_tweak-pin.parent.L'].tail.x = armature.edit_bones['MCH-forearm_ik.L'].tail.x + armature.edit_bones['MCH-forearm_tweak-pin.parent.L'].roll = 0 + armature.edit_bones['MCH-forearm_tweak-pin.parent.L'].length = .02 + + armature.edit_bones['forearm_tweak-pin.L'].head = armature.edit_bones['MCH-forearm_ik.L'].head.copy() + armature.edit_bones['forearm_tweak-pin.L'].tail = armature.edit_bones['MCH-forearm_ik.L'].tail.copy() + armature.edit_bones['forearm_tweak-pin.L'].roll = armature.edit_bones['MCH-forearm_ik.L'].roll + armature.edit_bones['forearm_tweak-pin.L'].length -= 0.15 + + armature.edit_bones['MCH-forearm_tweak-pin.parent.R'].head = armature.edit_bones['MCH-forearm_ik.R'].head.copy() + armature.edit_bones['MCH-forearm_tweak-pin.parent.R'].tail.z = armature.edit_bones['MCH-forearm_ik.R'].tail.z + armature.edit_bones['MCH-forearm_tweak-pin.parent.R'].tail.x = armature.edit_bones['MCH-forearm_ik.R'].tail.x + armature.edit_bones['MCH-forearm_tweak-pin.parent.R'].roll = 0 + armature.edit_bones['MCH-forearm_tweak-pin.parent.R'].length = .02 + + armature.edit_bones['forearm_tweak-pin.R'].head = armature.edit_bones['MCH-forearm_ik.R'].head.copy() + armature.edit_bones['forearm_tweak-pin.R'].tail = armature.edit_bones['MCH-forearm_ik.R'].tail.copy() + armature.edit_bones['forearm_tweak-pin.R'].roll = armature.edit_bones['MCH-forearm_ik.R'].roll + armature.edit_bones['forearm_tweak-pin.R'].length -= 0.15 + + armature.edit_bones['shoulder_driver.L'].head = project_line_in_space(armature.edit_bones['shoulder.L'].head.copy(),armature.edit_bones['shoulder.L'].tail.copy(), armature.edit_bones['hand_ik.L'].head.x) + armature.edit_bones['shoulder_driver.L'].tail = project_line_in_space(armature.edit_bones['shoulder.L'].head.copy(),armature.edit_bones['shoulder.L'].tail.copy(), armature.edit_bones['hand_ik.L'].head.x) + armature.edit_bones['shoulder_driver.L'].tail.y += 0.1 + + armature.edit_bones['shoulder_driver.R'].head = project_line_in_space(armature.edit_bones['shoulder.R'].head.copy(),armature.edit_bones['shoulder.R'].tail.copy(), armature.edit_bones['hand_ik.R'].head.x) + armature.edit_bones['shoulder_driver.R'].tail = project_line_in_space(armature.edit_bones['shoulder.R'].head.copy(),armature.edit_bones['shoulder.R'].tail.copy(), armature.edit_bones['hand_ik.R'].head.x) + armature.edit_bones['shoulder_driver.R'].tail.y += 0.1 + + armature.edit_bones['MCH-shoulder_follow.L'].head = armature.edit_bones['shoulder.L'].head.copy() + armature.edit_bones['MCH-shoulder_follow.L'].tail = armature.edit_bones['shoulder.L'].tail.copy() + + armature.edit_bones['MCH-shoulder_follow.R'].head = armature.edit_bones['shoulder.R'].head.copy() + armature.edit_bones['MCH-shoulder_follow.R'].tail = armature.edit_bones['shoulder.R'].tail.copy() + + + + try: + armature.edit_bones["DEF-eye.L"].name = "+EyeBone L A01" + armature.edit_bones["DEF-eye.R"].name = "+EyeBone R A01" + + # Properly finish the parenting of the eye rig we imported! + armature.edit_bones['eyetrack'].parent = armature.edit_bones['head'] + armature.edit_bones['+EyeBone R A01.001'].parent = armature.edit_bones['head'] + armature.edit_bones['+EyeBone L A01.001'].parent = armature.edit_bones['head'] + + # Now we need to position them to the existing bones. + eye_R_head_pos = armature.edit_bones['+EyeBone R A01'].head + eye_L_head_pos = armature.edit_bones['+EyeBone L A01'].head + + + armature.edit_bones['+EyeBone R A01.001'].head = eye_R_head_pos + armature.edit_bones['+EyeBone R A01.001'].tail.x = eye_R_head_pos[0] + armature.edit_bones['+EyeBone R A01.001'].tail.y = armature.edit_bones['+EyeBone R A01'].tail.y + armature.edit_bones['+EyeBone R A01.001'].tail.z = eye_R_head_pos[2] + + armature.edit_bones['+EyeBone L A01.001'].head = eye_L_head_pos + armature.edit_bones['+EyeBone L A01.001'].tail.x = eye_L_head_pos[0] + armature.edit_bones['+EyeBone L A01.001'].tail.y = armature.edit_bones['+EyeBone L A01'].tail.y + armature.edit_bones['+EyeBone L A01.001'].tail.z = eye_L_head_pos[2] + + armature.edit_bones['eyetrack_R'].head.x = eye_R_head_pos[0] + armature.edit_bones['eyetrack_R'].head.z = eye_R_head_pos[2] + + armature.edit_bones['eyetrack_R'].tail.x = eye_R_head_pos[0] + armature.edit_bones['eyetrack_R'].tail.z = eye_R_head_pos[2] + 0.01 + + armature.edit_bones['eyetrack_L'].head.x = eye_L_head_pos[0] + armature.edit_bones['eyetrack_L'].head.z = eye_L_head_pos[2] + + armature.edit_bones['eyetrack_L'].tail.x = eye_L_head_pos[0] + armature.edit_bones['eyetrack_L'].tail.z = eye_L_head_pos[2] + 0.01 + + armature.edit_bones['eyetrack'].head.x = (eye_R_head_pos[0]+eye_L_head_pos[0])/2 + armature.edit_bones['eyetrack'].head.z = (eye_R_head_pos[2]+eye_L_head_pos[2])/2 + + armature.edit_bones['eyetrack'].tail.x = (eye_R_head_pos[0]+eye_L_head_pos[0])/2 + armature.edit_bones['eyetrack'].tail.z = armature.edit_bones['eyetrack_L'].tail.z + except: + pass + + + # Still in edit mode, select Neck/Head bone and extract the Z loc + neck_bone = armature.edit_bones['neck'] + neck_pos = neck_bone.head[2] + + if(use_head_tracker): + # Let's position our head controller bone here. We need it to match our head bone's position + head_bone = armature.edit_bones['head'] + head_pos_head2 = head_bone.head[2] + head_pos_tail2 = head_bone.tail[2] + head_pos_head1 = head_bone.head[1] + head_pos_tail1 = head_bone.tail[1] + + # Select the head controller bone and position w/ head bone's location. + head_cont_bone = armature.edit_bones['head-controller'] + head_cont_bone.head[0] = 0 + head_cont_bone.head[1] = -0.3 + head_cont_bone.head[2] = head_pos_head2 + head_cont_bone.tail[0] = 0 + head_cont_bone.tail[1] = -0.3 + head_cont_bone.tail[2] = head_pos_tail2 + + # Delete ugly lines that connect to the pole bones. + def del_bone(bone_name): + to_del = armature.edit_bones.get(bone_name) + armature.edit_bones.remove(to_del) + + del_bone("VIS_upper_arm_ik_pole.L") + del_bone("VIS_upper_arm_ik_pole.R") + del_bone("VIS_thigh_ik_pole.L") + del_bone("VIS_thigh_ik_pole.R") + + # In pose mode select the rig, then select the bone + bpy.ops.object.mode_set(mode='POSE') + faceplate_arm = bpy.context.scene.objects[char_name] + selected_bone = faceplate_arm.pose.bones["Plate"] + + # Change the values to what we want, use neckpos to base the height off the ground. + selected_bone.location[0] = .33 + #selected_bone.location[1] = 0.9 + selected_bone.location[2] = neck_pos + selected_bone.rotation_quaternion[1] = 1 + selected_bone.scale[0] = 0.1 + selected_bone.scale[1] = 0.1 + selected_bone.scale[2] = 0.1 + + # Begin moving extra wgt bones to the wgt collection while discarding old collections + # 1 Root and Eye Bones + move_into_collection("eye circle","wgt") + move_into_collection("eye controller","wgt") + move_into_collection("root plate","wgt") + move_into_collection("head-control-shape","wgt") + + # 1 Face Bones + to_del_coll = bpy.data.collections.get("wgt.001") + for obj in to_del_coll.objects: + move_into_collection(obj.name,"wgt") + + # 2 Pelvis Bones + to_del_coll = bpy.data.collections.get("wgt.002") + for obj in to_del_coll.objects: + move_into_collection(obj.name,"wgt") + + # 3 feet Bones + to_del_coll = bpy.data.collections.get("wgt.003") + for obj in to_del_coll.objects: + move_into_collection(obj.name,"wgt") + + # 4 hand Bones + to_del_coll = bpy.data.collections.get("wgt.004") + for obj in to_del_coll.objects: + move_into_collection(obj.name,"wgt") + # 5 NPC widgt + to_del_coll = bpy.data.collections.get("wgt.005") + for obj in to_del_coll.objects: + move_into_collection(obj.name,"wgt") + + # props + to_del_coll = bpy.data.collections.get("wgt.006") + for obj in to_del_coll.objects: + move_into_collection(obj.name,"wgt") + + # After moving into collection, delete the old empty ones. + bpy.data.collections.remove(bpy.data.collections.get("append_Root"),do_unlink=True) + bpy.data.collections.remove(bpy.data.collections.get("append_NPC Plate"),do_unlink=True) + bpy.data.collections.remove(bpy.data.collections.get("append_Eyes"),do_unlink=True) + bpy.data.collections.remove(bpy.data.collections.get("append_Pelvis"),do_unlink=True) + bpy.data.collections.remove(bpy.data.collections.get("append_Foot"),do_unlink=True) + bpy.data.collections.remove(bpy.data.collections.get("append_Hand"),do_unlink=True) + bpy.data.collections.remove(bpy.data.collections.get("append_Props"),do_unlink=True) + + # Adding Shape Key Drivers + ourRig = char_name + + # Let's go into object mode and select the three face parts to begin adding shape key drivers + bpy.ops.object.mode_set(mode='OBJECT') + bpy.ops.object.select_all(action='DESELECT') + + bpy.ops.object.select_all(action='DESELECT') + + + def makeCon(shape_key,bone_name,expression,transform): + # Get the bone object by name + armature = bpy.context.scene.objects[ourRig] + bone = armature.pose.bones[bone_name] + + # Create a driver for the shape key + shape_key = obj.data.shape_keys.key_blocks[shape_key] + driver = shape_key.driver_add("value").driver + + # Create variables for the driver + var = driver.variables.new() + var.name = "bone" + var.type = 'TRANSFORMS' + var.targets[0].id = armature + var.targets[0].bone_target = bone_name + var.targets[0].transform_space = 'LOCAL_SPACE' + var.targets[0].transform_type = transform + + # Create the scripted expression driver + driver.type = 'SCRIPTED' + driver.expression = expression + + # Update the dependencies + depsgraph = bpy.context.evaluated_depsgraph_get() + depsgraph.update() + + # NPC SHAPE KEYS + # Get the selected object with the shape key + obj = bpy.data.objects.get("Body") + # not all npcs have face fat/strong, so attempt on their own. + has_extra_faces = True + try: + makeCon("Face_Strong","Face-Strong-Control","bone * -2.22","LOC_Y") + makeCon("Face_Fat","Face-Fat-Control","bone * -2.22","LOC_Y") + except: + has_extra_faces = False + + try: + makeCon("Eye_Angry","Eye-Hostility-Control","bone * -2.22","LOC_Y") + makeCon("Eye_Sad","Eye-Wail-Control","bone * -2.22","LOC_Y") + makeCon("Eye_WinkA","WinkA-Invis","bone * -1","LOC_Y") + makeCon("Eye_WinkB","WinkB-Invis","bone * -1","LOC_Y") + + makeCon("Mouth_A","Mouth-A-Control","bone * 1.67","LOC_X") + makeCon("Mouth_Angry","Mouth-Angry-Control","bone * 1.67","LOC_X") + makeCon("Mouth_Smile","Mouth-Smile-Control","bone * 1.67","LOC_X") + + except: + pass + + # Special drivers for pushing pupils back on blink + def makeCon2(shape_key,bn1,bn2,expression,transform): + # Get the bone object by name + armature = bpy.context.scene.objects[ourRig] + bone = armature.pose.bones[bn1] + + # Create a driver for the shape key + shape_key = obj.data.shape_keys.key_blocks[shape_key] + driver = shape_key.driver_add("value").driver + + # Create variables for the driver + var = driver.variables.new() + var.name = "invisA" + var.type = 'TRANSFORMS' + var.targets[0].id = armature + var.targets[0].bone_target = bn1 + var.targets[0].transform_space = 'LOCAL_SPACE' + var.targets[0].transform_type = transform + + # Create variables for the driver + var1 = driver.variables.new() + var1.name = "invisB" + var1.type = 'TRANSFORMS' + var1.targets[0].id = armature + var1.targets[0].bone_target = bn2 + var1.targets[0].transform_space = 'LOCAL_SPACE' + var1.targets[0].transform_type = transform + + # Create the scripted expression driver + driver.type = 'SCRIPTED' + driver.expression = expression + + # Update the dependencies + depsgraph = bpy.context.evaluated_depsgraph_get() + depsgraph.update() + + obj = bpy.data.objects.get("Body") + + # Pupils shape key driver is set up below. Like Eye Star, the shape key has to be made FIRST before adding a driver + + if(use_head_tracker): + # Since we're still in object mode, here we can add the head pole object in the neck to track head movement + bpy.ops.object.empty_add(type='PLAIN_AXES', align='WORLD', location=(0, 0, 0), scale=(1, 1, 1)) + bpy.data.objects["Empty"].name = "Head_Pole" + bpy.data.objects["Head_Pole"].empty_display_size = 0.01 + bpy.data.objects["Head_Pole"].parent = bpy.data.objects[char_name] + bpy.data.objects["Head_Pole"].parent_type = "BONE" + bpy.data.objects["Head_Pole"].parent_bone = "neck" + + # Let's go into object mode and select the body for the pupil shape keys, and to control our glow sliders. + bpy.ops.object.select_all(action='DESELECT') + obj = bpy.data.objects.get("Body") + bpy.ops.object.select_all(action='DESELECT') + + + # Going into pose mode with our character selected. + bpy.ops.object.select_all(action='DESELECT') + our_char = bpy.data.objects.get(char_name) + if our_char: + our_char.select_set(True) + bpy.context.view_layer.objects.active = our_char + + bpy.ops.object.mode_set(mode='POSE') + + + # Disable IK Stretching & Turn on IK Poles. Toggle manually as needed. + if disallow_leg_ik_stretch: + bpy.data.objects[char_name].pose.bones["thigh_parent.L"]["IK_Stretch"] = 0.0 + bpy.data.objects[char_name].pose.bones["thigh_parent.R"]["IK_Stretch"] = 0.0 + + if disallow_arm_ik_stretch: + bpy.data.objects[char_name].pose.bones["upper_arm_parent.L"]["IK_Stretch"] = 0.0 + bpy.data.objects[char_name].pose.bones["upper_arm_parent.R"]["IK_Stretch"] = 0.0 + + if use_arm_ik_poles: + bpy.data.objects[char_name].pose.bones["upper_arm_parent.L"]["pole_vector"] = 1 + bpy.data.objects[char_name].pose.bones["upper_arm_parent.R"]["pole_vector"] = 1 + + if use_leg_ik_poles: + bpy.data.objects[char_name].pose.bones["thigh_parent.L"]["pole_vector"] = 1 + bpy.data.objects[char_name].pose.bones["thigh_parent.R"]["pole_vector"] = 1 + + bpy.data.objects[char_name].pose.bones["torso"]["head_follow"] = 1.0 + bpy.data.objects[char_name].pose.bones["upper_arm_parent.L"]["IK_parent"] = 4 + bpy.data.objects[char_name].pose.bones["upper_arm_parent.R"]["IK_parent"] = 4 + + def add_shoulder_const(follow, driver, hand): + armature = bpy.context.scene.objects[ourRig] + + # make shoulder follow driver bone + this_bone = bpy.context.scene.objects[char_name].pose.bones[follow] + co = this_bone.constraints.new('DAMPED_TRACK') + co.target = our_char + co.subtarget = driver + + # make driver bone follow hand + drive = bpy.context.scene.objects[char_name].pose.bones[driver] + co2 = drive.constraints.new('COPY_LOCATION') + co2.target = our_char + co2.subtarget = hand + co2.target_space = "LOCAL_OWNER_ORIENT" + co2.owner_space = "LOCAL" + + # make driver to control influence + driver = co.driver_add("influence").driver + var = driver.variables.new() + var.name = "bone" + var.type = 'SINGLE_PROP' + + var.targets[0].id = armature + var.targets[0].data_path = "pose.bones[\"plate-settings\"][\"Toggle Shoulder Constraints\"]" + driver.type = 'SCRIPTED' + driver.expression = "(bone * 0.4)" + + depsgraph = bpy.context.evaluated_depsgraph_get() + depsgraph.update() + + + add_shoulder_const("MCH-shoulder_follow.L","shoulder_driver.L","hand-ik-L") + add_shoulder_const("MCH-shoulder_follow.R","shoulder_driver.R","hand-ik-R") + def add_eye_bone_const(bone_name, to_bone): + this_bone = bpy.context.scene.objects[char_name].pose.bones[bone_name] + co = this_bone.constraints.new('COPY_ROTATION') + co.target = our_char + co.subtarget = to_bone + co.target_space = "LOCAL_OWNER_ORIENT" + co.owner_space = "LOCAL" + + try: + add_eye_bone_const("+EyeBone R A01", "+EyeBone R A01.001") + add_eye_bone_const("+EyeBone L A01", "+EyeBone L A01.001") + except: + pass + + # Let's add empty 'child of' constraints to limbs, torso and root. Ready to use in case char holds obj/stands on obj + def add_child_of(bone_name): + this_bone = bpy.context.scene.objects[char_name].pose.bones[bone_name] + co = this_bone.constraints.new('CHILD_OF') + + if add_child_of_constraints: + add_child_of("hand-ik-L") + add_child_of("hand-ik-R") + add_child_of("foot_ik.R") + add_child_of("foot_ik.L") + add_child_of("torso-outer") + add_child_of("root") + + + if(use_head_tracker): + + # Here we can set up the two damped track constraints to make the head follow the controller bone. + # This makes the head bone follow the controller + head_controller = bpy.context.scene.objects[char_name].pose.bones["head"] + co = head_controller.constraints.new('DAMPED_TRACK') + head_track_const = bpy.data.objects[char_name].pose.bones["head"].constraints["Damped Track"] + head_track_const.target = our_char + head_track_const.subtarget = "head-controller" + head_track_const.track_axis = "TRACK_Z" + + # This makes the controller follow the obj in the neck to keep it 'on' the head. + head_pole_cont = bpy.context.scene.objects[char_name].pose.bones["head-controller"] + co2 = head_pole_cont.constraints.new('DAMPED_TRACK') + head_pole_const = bpy.data.objects[char_name].pose.bones["head-controller"].constraints["Damped Track"] + head_pole_const.target = bpy.data.objects.get("Head_Pole") + head_pole_const.track_axis = "TRACK_NEGATIVE_Z" + + # We can now make our final bone groups look good! + def assign_bone_to_group(bone_name, group_name): + if not is_version_4: + # Switch to object mode + bpy.ops.object.mode_set(mode='OBJECT') + + # Get the armature object + armature_obj = our_char + if not armature_obj or armature_obj.type != 'ARMATURE': + return + + # Switch to pose mode + bpy.context.view_layer.objects.active = armature_obj + bpy.ops.object.mode_set(mode='POSE') + + # Get the pose bone + pose_bone = armature_obj.pose.bones.get(bone_name) + if not pose_bone: + return + + # Get the bone group + bone_group = armature_obj.pose.bone_groups.get(group_name) + if not bone_group: + # Create a new bone group if it doesn't exist + bone_group = armature_obj.pose.bone_groups.new(name=group_name) + + # Assign the bone to the bone group + pose_bone.bone_group = bone_group + + # New 4.0 functionality: change the bone itself to the color of the group it was originally assigned to. + else: + # 4.0: Armature bones or Pose bones? + bone = bpy.context.object.pose.bones[bone_name] + + if group_name == "Root": + bone.color.palette = 'CUSTOM' + bone.color.custom.normal = (0,1,0.169) + bone.color.custom.select = (0.184,1,0.713) + bone.color.custom.active = (0.125,0.949,0.816) + elif group_name == "Torso": + bone.color.palette = 'CUSTOM' + bone.color.custom.normal = (1,0.867,0) + bone.color.custom.select = (1,0.671,0.502) + bone.color.custom.active = (0.949,0.431,0) + elif group_name == "Limbs L": + bone.color.palette = 'CUSTOM' + bone.color.custom.normal = (1,0,1) + bone.color.custom.select = (1,0.129,0.467) + bone.color.custom.active = (1,0.518,0.969) + elif group_name == "Limbs R": + bone.color.palette = 'CUSTOM' + bone.color.custom.normal = (0,0.839,1) + bone.color.custom.select = (0.227,0.357,0.902) + bone.color.custom.active = (0.035,0.333,0.878) + elif group_name == "Face": + bone.color.palette = 'CUSTOM' + bone.color.custom.normal = (1,0,0) + bone.color.custom.select = (0.506,0.902,0.078) + bone.color.custom.active = (0.094,0.714,0.878) + + # Root BG + assign_bone_to_group("root", "Root") + assign_bone_to_group("root-outer", "Root") + assign_bone_to_group("root-inner", "Root") + + # Torso BG + assign_bone_to_group("torso", "Torso") + assign_bone_to_group("torso-inner", "Torso") + assign_bone_to_group("torso-outer", "Torso") + assign_bone_to_group("torso_pivot.002", "Torso") + assign_bone_to_group("hips", "Torso") + assign_bone_to_group("chest", "Torso") + assign_bone_to_group("neck", "Torso") + assign_bone_to_group("head-controller", "Torso") + assign_bone_to_group("head", "Torso") + + # Left Arm BG + assign_bone_to_group("hand_ik.L", "Limbs L") + assign_bone_to_group("upper_arm_ik_target.L", "Limbs L") + assign_bone_to_group("shoulder.L", "Limbs L") + assign_bone_to_group("hand-ik-pivot-L", "Limbs L") + assign_bone_to_group("hand-ik-L", "Limbs L") + assign_bone_to_group("upper_arm_parent.L", "Limbs L") + assign_bone_to_group("forearm_tweak-pin.L", "Limbs L") + assign_bone_to_group("prop.L", "Limbs L") + if not use_arm_ik_poles: + assign_bone_to_group("upper_arm_ik.L", "Limbs L") + + # Right Arm BG + assign_bone_to_group("hand_ik.R", "Limbs R") + assign_bone_to_group("upper_arm_ik_target.R", "Limbs R") + assign_bone_to_group("shoulder.R", "Limbs R") + assign_bone_to_group("hand-ik-pivot-R", "Limbs R") + assign_bone_to_group("hand-ik-R", "Limbs R") + assign_bone_to_group("upper_arm_parent.R", "Limbs R") + assign_bone_to_group("forearm_tweak-pin.R", "Limbs R") + assign_bone_to_group("prop.R", "Limbs R") + if not use_arm_ik_poles: + assign_bone_to_group("upper_arm_ik.R", "Limbs R") + + # Left Foot BG + assign_bone_to_group("foot_ik.L", "Limbs L") + assign_bone_to_group("toe_ik.L", "Limbs L") + assign_bone_to_group("foot_spin_ik.L", "Limbs L") + assign_bone_to_group("foot_heel_ik.L", "Limbs L") + assign_bone_to_group("thigh_ik_target.L", "Limbs L") + assign_bone_to_group("ik-pivot-L", "Limbs L") + assign_bone_to_group("ik-sub-pivot-L", "Limbs L") + assign_bone_to_group("thigh_parent.L", "Limbs L") + assign_bone_to_group("shin_tweak-pin.L", "Limbs L") + if not use_leg_ik_poles: + assign_bone_to_group("thigh_ik.L", "Limbs L") + + # Right Foot BG + assign_bone_to_group("foot_ik.R", "Limbs R") + assign_bone_to_group("toe_ik.R", "Limbs R") + assign_bone_to_group("foot_spin_ik.R", "Limbs R") + assign_bone_to_group("foot_heel_ik.R", "Limbs R") + assign_bone_to_group("thigh_ik_target.R", "Limbs R") + assign_bone_to_group("ik-pivot-R", "Limbs R") + assign_bone_to_group("ik-sub-pivot-R", "Limbs R") + assign_bone_to_group("thigh_parent.R", "Limbs R") + assign_bone_to_group("shin_tweak-pin.R", "Limbs R") + if not use_leg_ik_poles: + assign_bone_to_group("thigh_ik.R", "Limbs R") + + # Face BG + assign_bone_to_group("Mouth-A-Control", "Face") + assign_bone_to_group("Mouth-Smile-Control", "Face") + assign_bone_to_group("Mouth-Angry-Control", "Face") + + assign_bone_to_group("Eye-Hostility-Control", "Face") + assign_bone_to_group("Eye-Wail-Control", "Face") + assign_bone_to_group("Eye-WinkA-Control", "Face") + assign_bone_to_group("Eye-WinkB-Control", "Face") + assign_bone_to_group("Wink-Control", "Face") + if has_extra_faces: + assign_bone_to_group("Face-Strong-Control", "Face") + assign_bone_to_group("Face-Fat-Control", "Face") + + assign_bone_to_group("eyetrack", "Face") + assign_bone_to_group("eyetrack_L", "Face") + assign_bone_to_group("eyetrack_R", "Face") + assign_bone_to_group("plate-settings", "Face") + + try: + this_obj.pose.bones["eyetrack_L"].custom_shape_scale_xyz = (2,2,2) + this_obj.pose.bones["eyetrack_R"].custom_shape_scale_xyz = (2,2,2) + this_obj.pose.bones["eyetrack"].custom_shape_scale_xyz = (6.5,5,1) + except: + pass + + # Default bone group colors are ugly. We can change them. + def change_bone_group_colors(bone_group_name, color1, color2, color3): + active_bg = bpy.context.active_object.pose.bone_groups[bone_group_name] + active_bg.color_set = "CUSTOM" + active_bg.colors.normal = Color((color1)) + active_bg.colors.select = Color((color2)) + active_bg.colors.active = Color((color3)) + + if not is_version_4: + change_bone_group_colors('Root',(0,1,0.169),(0.184,1,0.713),(0.125,0.949,0.816)) + change_bone_group_colors('Torso',(1,0.867,0),(1,0.671,0.502),(0.949,0.431,0)) + change_bone_group_colors('Limbs L',(1,0,1),(1,0.129,0.467),(1,0.518,0.969)) + change_bone_group_colors('Limbs R',(0,0.839,1),(0.227,0.357,0.902),(0.035,0.333,0.878)) + change_bone_group_colors('Face',(1,0,0),(0.506,0.902,0.078),(0.094,0.714,0.878)) + + # Automatically builds the constraint stuff for SWITCH PARENT. DO NOT FORGET TO REENABLE THE CONSTRAINTS BELOW!!!!!! + def generate_switch_parent_constraints(toggle_parent, location_of_switcher): + const = this_obj.pose.bones[toggle_parent].constraints["SWITCH PARENT"] + const.targets[0].target = bpy.data.objects[char_name] + const.targets[0].subtarget = "root" + + const.targets[1].target = bpy.data.objects[char_name] + const.targets[1].subtarget = "root.001" + + const.targets[2].target = bpy.data.objects[char_name] + const.targets[2].subtarget = "root.002" + + const.targets[3].target = bpy.data.objects[char_name] + const.targets[3].subtarget = "torso.002" + + const.targets[4].target = bpy.data.objects[char_name] + const.targets[4].subtarget = "chest" + + location_str = "pose.bones[\"" + location_of_switcher + "\"][\"parent_switch\"]" + + for x in range(5): + driver = const.targets[x].driver_add("weight").driver + var = driver.variables.new() + var.name = "toggle" + var.type = 'SINGLE_PROP' + var.targets[0].id = bpy.context.scene.objects[ourRig] + var.targets[0].data_path = location_str + + driver.type = 'SCRIPTED' + driver.expression = "toggle == " + str(x+1) + + depsgraph = bpy.context.evaluated_depsgraph_get() + depsgraph.update() + + # Toggle the constraint off, we HAVE to reenable it later to work!! + const.enabled = False + + if use_head_tracker: + generate_switch_parent_constraints("MCH-head-controller-parent","head-controller") + + # REENABLE THE CONSTRAINT BELOW. + generate_switch_parent_constraints("MCH-forearm_tweak-pin.parent.L","forearm_tweak-pin.L") + generate_switch_parent_constraints("MCH-forearm_tweak-pin.parent.R","forearm_tweak-pin.R") + generate_switch_parent_constraints("MCH-shin_tweak-pin.parent.L","shin_tweak-pin.L") + generate_switch_parent_constraints("MCH-shin_tweak-pin.parent.R","shin_tweak-pin.R") + + # For each tweak bone, we make the custom property, the constraint and driver. + def prepare_tweak_bone(tweak_bone, pin_bone): + # Make Custom Property + cust_bone = this_obj.pose.bones[tweak_bone] + cust_bone["tweak_pin"] = 0.00 + # Setting the min/max ranges: https://blender.stackexchange.com/a/258099 + id_prop = cust_bone.id_properties_ui("tweak_pin") + id_prop.update(min=0.0,max=1.0) + + # Make Constraint + con = this_obj.pose.bones[tweak_bone].constraints.new('COPY_LOCATION') + con.target = our_char + con.subtarget = pin_bone + + path_str = "pose.bones[\"" + tweak_bone+"\"][\"tweak_pin\"]" + + driver = con.driver_add("influence").driver + driver.type = 'SUM' + var = driver.variables.new() + var.name = "bone" + var.type = 'SINGLE_PROP' + var.targets[0].id = bpy.context.scene.objects[ourRig] + var.targets[0].data_path = path_str + depsgraph = bpy.context.evaluated_depsgraph_get() + depsgraph.update() + + prepare_tweak_bone("forearm_tweak.L", "forearm_tweak-pin.L") + prepare_tweak_bone("forearm_tweak.R", "forearm_tweak-pin.R") + prepare_tweak_bone("shin_tweak.L", "shin_tweak-pin.L") + prepare_tweak_bone("shin_tweak.R", "shin_tweak-pin.R") + + # To repair the now missing custom property, let's remake it. + def make_torso_custom(): + cust_bone = this_obj.pose.bones["torso-outer"] + cust_bone["torso_parent"] = 1 + id_prop = cust_bone.id_properties_ui("torso_parent") + id_prop.update(min=0,max=2) + + make_torso_custom() + + # Fix NPC spaces + this_obj.pose.bones["MCH-ROT-neck"].constraints["Copy Rotation"].owner_space = 'LOCAL' + this_obj.pose.bones["MCH-ROT-neck"].constraints["Copy Rotation"].target_space = 'LOCAL' + this_obj.pose.bones["MCH-ROT-neck"].constraints["Copy Scale"].target_space = 'LOCAL' + this_obj.pose.bones["MCH-ROT-neck"].constraints["Copy Scale"].owner_space = 'LOCAL' + + # Adjustments to positioning + this_obj.pose.bones["foot_ik.L"].custom_shape_transform = bpy.data.objects[char_name].pose.bones["mch-ik-pivot-L"] + this_obj.pose.bones["foot_ik.R"].custom_shape_transform = bpy.data.objects[char_name].pose.bones["mch-ik-pivot-R"] + this_obj.pose.bones["hand-ik-L"].custom_shape_transform = bpy.data.objects[char_name].pose.bones["mch-hand-ik-pivot-L"] + this_obj.pose.bones["hand-ik-R"].custom_shape_transform = bpy.data.objects[char_name].pose.bones["mch-hand-ik-pivot-R"] + + this_obj.pose.bones["ik-sub-pivot-L"].custom_shape_translation = (foot_L_x_diff*-1.0, 0.0, foot_L_z_diff*-1.0) + this_obj.pose.bones["ik-sub-pivot-R"].custom_shape_translation = (foot_R_x_diff*-1.0, 0.0, foot_R_z_diff*-1.0) + + # Penultimate: Rename bones as needed + for oldname, newname in rename_bones_list: + bone = bpy.context.object.pose.bones.get(oldname) + if bone is None: + continue + bone.name = newname + + # We have to nuke the existing driver in the torso. + def nuke_old_torso_const(): + const = this_obj.pose.bones["MCH-torso.parent"].constraints + to_del = [c for c in const] + for c in to_del: + const.remove(c) + + new = const.new('ARMATURE') + new.name = 'SWITCH_PARENT' + # add target + new.targets.new() + new.targets[0].target = bpy.data.objects[char_name] + new.targets[0].subtarget = "root.002" + + location_str = "pose.bones[\"torso\"][\"torso_parent\"]" + + driver = new.targets[0].driver_add("weight").driver + for variable in driver.variables: + if variable.type == 'SINGLE_PROP': + variable.targets[0].data_path = location_str + #var = driver.variables.new() + #driver.variables[0].targets[0].data_path = location_str + #var[0].name = "toggle" + #var.type = 'SINGLE_PROP' + #var.targets[0].id = bpy.context.scene.objects[ourRig] + #var.targets[0].data_path = location_str + + #driver.type = 'SCRIPTED' + driver.expression = "var == 1" + + depsgraph = bpy.context.evaluated_depsgraph_get() + depsgraph.update() + + # Toggle the constraint off, we HAVE to reenable it later to work!! + new.enabled = False + # We have to nuke the existing driver in the torso. + + def remake_spine_constraint(bone, target): + const = this_obj.pose.bones[bone].constraints + to_del = [c for c in const] + for c in to_del: + const.remove(c) + + new = const.new('COPY_TRANSFORMS') + new.name = 'Copy Transforms' + # add target + #new.targets.new() + new.target = bpy.data.objects[char_name] + new.subtarget = target + + new.target_space = "LOCAL" + new.owner_space = "LOCAL" + + new.influence = 0.5 + + # Toggle the constraint off, we HAVE to reenable it later to work!! + new.enabled = False + + nuke_old_torso_const() + remake_spine_constraint("MCH-spine.002","chest") + remake_spine_constraint("MCH-pivot","spine_fk.001") + + # Use this to swap a variable in a constraint + def swap_const_follow_in_const(bone, constraint_type, new_var): + const = this_obj.pose.bones[bone].constraints + for c in const: + if c.type == constraint_type: + const.remove(c) + + new = const.new(constraint_type) + new.target = bpy.data.objects[char_name] + new.subtarget = "torso.002" + + driver = new.driver_add("influence").driver + driver.type = 'SUM' + for variable in driver.variables: + if variable.type == 'SINGLE_PROP': + variable.targets[0].data_path = new_var + + depsgraph = bpy.context.evaluated_depsgraph_get() + depsgraph.update() + + swap_const_follow_in_const("MCH-ROT-head","COPY_ROTATION","pose.bones[\"plate-settings\"][\"Head Follow\"]") + swap_const_follow_in_const("MCH-ROT-neck","COPY_ROTATION","pose.bones[\"plate-settings\"][\"Neck Follow\"]") + + # Delete all existing bone collections, and make new ones. + if is_version_4: + armature = bpy.context.object.data + collections = armature.collections + for coll in collections: + collections.remove(coll) + + collections.new("Tweaks") + collections.new("Pivots & Pins") + collections.new("Offsets") + collections.new("Props") + collections.new("Face") + collections.new("Torso (IK)") + collections.new("Torso (FK)") + collections.new("Fingers") + collections.new("Fingers (Detail)") + collections.new("Arm.L (IK)") + collections.new("Arm.R (IK)") + collections.new("Arm.L (FK)") + collections.new("Arm.R (FK)") + collections.new("Leg.L (IK)") + collections.new("Leg.R (IK)") + collections.new("Leg.L (FK)") + collections.new("Leg.R (FK)") + collections.new("Root") + collections.new("Other") + + for bone in armature.bones: + collections["Other"].assign(bone) + #Thanks Enthralpy for the code to ensure that the arm/leg "gears" are moveable. + for bone in ['thigh_parent.L', 'thigh_parent.R', 'upper_arm_parent.L', 'upper_arm_parent.R']: + this_obj.pose.bones[bone].custom_shape_transform = None + this_obj.pose.bones[bone].lock_location[0] = False + this_obj.pose.bones[bone].lock_location[1] = False + this_obj.pose.bones[bone].lock_location[2] = False + this_obj.pose.bones[bone].lock_rotation_w = False + this_obj.pose.bones[bone].lock_rotation[0] = False + this_obj.pose.bones[bone].lock_rotation[1] = False + this_obj.pose.bones[bone].lock_rotation[2] = False + this_obj.pose.bones[bone].lock_scale[0] = False + this_obj.pose.bones[bone].lock_scale[1] = False + this_obj.pose.bones[bone].lock_scale[2] = False + + # Customize bones + this_obj.pose.bones[bone].custom_shape = bpy.data.objects["npc_settings"] + this_obj.pose.bones[bone].custom_shape_scale_xyz=(0.5,0.5,0.5) + this_obj.pose.bones[bone].use_custom_shape_bone_size = False + + if "upper_arm" in bone: + if ".L" in bone: + this_obj.pose.bones[bone].custom_shape_translation=(-0.05,0.0,0.0) + this_obj.pose.bones[bone].custom_shape_rotation_euler=(0,-1.5708,0) + this_obj.pose.bones[bone].custom_shape_transform = this_obj.pose.bones["MCH-upper_arm_parent_widget.L"] + else: + this_obj.pose.bones[bone].custom_shape_translation=(0.05,0.0,0.0) + this_obj.pose.bones[bone].custom_shape_rotation_euler=(0,-1.5708,0) + this_obj.pose.bones[bone].custom_shape_transform = this_obj.pose.bones["MCH-upper_arm_parent_widget.R"] + else: + if ".L" in bone: + this_obj.pose.bones[bone].custom_shape_translation=(0.1,0,0) + this_obj.pose.bones[bone].custom_shape_rotation_euler=(-0.0820305, -1.5708, 0) + this_obj.pose.bones[bone].custom_shape_transform = this_obj.pose.bones["MCH-thigh_parent_widget.L"] + else: + this_obj.pose.bones[bone].custom_shape_translation=(-0.1,0,0) + this_obj.pose.bones[bone].custom_shape_rotation_euler=(-0.0820305, 1.5708, 0) + this_obj.pose.bones[bone].custom_shape_transform = this_obj.pose.bones["MCH-thigh_parent_widget.R"] + + # ENABLE CONSTRAINTS AGAIN HERE + if use_head_tracker: + this_obj.pose.bones["MCH-head-controller-parent"].constraints[0].enabled = True + this_obj.pose.bones["MCH-forearm_tweak-pin.parent.L"].constraints[0].enabled = True + this_obj.pose.bones["MCH-forearm_tweak-pin.parent.R"].constraints[0].enabled = True + this_obj.pose.bones["MCH-shin_tweak-pin.parent.L"].constraints[0].enabled = True + this_obj.pose.bones["MCH-shin_tweak-pin.parent.R"].constraints[0].enabled = True + this_obj.pose.bones["MCH-torso.parent"].constraints[0].enabled = True + this_obj.pose.bones["MCH-spine.002"].constraints[0].enabled = True + this_obj.pose.bones["MCH-pivot"].constraints[0].enabled = True + # Deselect everything, we're done. + for bone in bpy.context.active_object.pose.bones: + bone.bone.select = False + + # EDITING RIG UI TEXT FILE + rig_file = bpy.data.texts[original_name+'_ui.py'] # Rig script for this char in question + + # Convert it to text + rig_text = rig_file.as_string() + complete_rig_text = rig_text + # My disclaimer, out of respect for modifying Rigify core's script + rig_text_disclaimer = "\n# This RigUI script has been modified by Llama for use with Genshin Impact characters using a custom made rig. Any issues arising as a result of these modifications are not indicitive of Rigify's original functionalities. \n# Rigify's writers bare no responsibility for issues/errors made here. Additionally, these modifications have been made to improve the custom made rigs for Genshin Impact characters, meaning that\n# attempting to use this script elsewhere for characters/models/skeletons it was NOT intended to be used with, could yield improper or erroneous results - of which neither Rigify's development team nor I, am responsible for. \n\n# Otherwise, if you are seeing this disclaimer with a Hoyoverse character made with the proper addons, run this as needed. (Such as after appending to build the rig layers)\n# Do NOT however, attempt to use this rig in another version of blender than what it was made in. (3.6.X rigs will NOT work adequately in 4.X or beyond; and 4.X rigs will not work in previous versions before 4.0)\n" + + # MODIFICATIONS to the text file are made here: + # Get the ID of this char's rig ui script. + rig_char_id = rig_text.split("rig_id = \"")[1].split("\"")[0] + + def make_layer_str(text, layer, version): + string3 = "row.prop(context.active_object.data, 'layers', index="+str(layer)+", toggle=True, text='"+text+"')" + string4 = "row.prop(collection[\""+text+"\"], 'is_visible', toggle=True, text='"+text+"')" + + if version == 4: + return string4 + else: + return string3 + + def layers_to_generate(vers): + str = "\n row=col.row()\n "+make_layer_str("Tweaks", 2, vers)+"\n row=col.row()\n "+make_layer_str("Pivots & Pins", 19, vers)+"\n row = col.row()\n "+make_layer_str("Offsets", 26, vers)+"\n row = col.row()\n "+make_layer_str("Props", 21, vers)+"\n row = col.row()\n row.separator()\n row = col.row()\n row.separator()\n row = col.row()\n "+make_layer_str("Face", 0, vers)+"\n row = col.row()\n "+make_layer_str("Torso (IK)", 3, vers)+"\n row = col.row()\n "+make_layer_str("Torso (FK)",4,vers)+"\n row = col.row()\n "+make_layer_str("Fingers", 5, vers)+"\n row = col.row()\n "+make_layer_str("Fingers (Detail)", 6, vers)+"\n row = col.row()\n "+make_layer_str("Arm.L (IK)", 7, vers)+"\n "+make_layer_str("Arm.R (IK)", 10, vers)+"\n row = col.row()\n "+make_layer_str("Arm.L (FK)", 8, vers)+"\n "+make_layer_str("Arm.R (FK)", 11, vers)+"\n row = col.row()\n "+make_layer_str("Leg.L (IK)", 13, vers)+"\n "+make_layer_str("Leg.R (IK)", 16, vers)+"\n row = col.row()\n "+make_layer_str("Leg.L (FK)", 14, vers)+"\n "+make_layer_str("Leg.R (FK)", 17, vers)+"\n row = col.row()\n row.separator()\n row = col.row()\n row.separator()\n row = col.row()\n "+make_layer_str("Root", 28, vers)+"\n row = col.row()\n "+make_layer_str("Other", 25, vers) + + return str + + # Function to add layer to rigUI. This should add it to both 3.6 and 4.0 versions of the UI. + def generate_rig_layers(): + # Add the physics button to the UI # text=v_str+" rig for " + char_name + rig_add_layer_code = "\n layout = self.layout\n col = layout.column()\n row = col.row()\n v_str = \""+bpy.app.version_string+"\"\n if not v_str[0] == \"4\" and bpy.app.version_string[0] == \"3\":\n row.label(text=v_str+\" rig for "+char_name.split("Costume")[0]+"\")\n "+layers_to_generate(3)+"\n elif v_str[0] == \"4\" and bpy.app.version_string[0] == \"4\":\n row.label(text=v_str+\" rig for "+char_name.split("Costume")[0]+"\")\n # If you have duplicate armatures of the same character (if you see .001 or similar) in one scene,\n # Please change the name below to what it is in the Outliner so that you can rig all your characters :)\n # (It's the green person symbol in your rig)\n collection = bpy.data.armatures[\""+original_name+"\"].collections\n "+layers_to_generate(4)+"\n else:\n row.label(text=\"ERROR: Version mismatch!\")\n row = col.row()\n row.label(text=\"Your rig was made in a version of Blender/Goo Engine that is not compatible!\")\n row = col.row()\n row.label(text=\"Please remake your rig for this version!\")" + cut_rig_layer = rig_text.split("class RigLayers(bpy.types.Panel):") + separate_draw_func = cut_rig_layer[1].split("def draw(self, context):") + separate_draw_end = separate_draw_func[1].split("def register():") + + merged_layer_code = cut_rig_layer[0]+"class RigLayers(bpy.types.Panel):"+separate_draw_func[0]+"def draw(self, context):"+rig_add_layer_code+"\ndef register():"+separate_draw_end[1] + + return merged_layer_code + + complete_rig_text = generate_rig_layers() + + # These functions make it easy to quickly write to the text file. Use as needed. + def generate_string_for_limb_pin(pin_bone, gear_bone, tweak_bone, text): + str = "\n if is_selected({'"+pin_bone+"'}):\n layout.prop(pose_bones['"+tweak_bone+"'], '[\"tweak_pin\"]', text='"+text+"', slider=True)\n if is_selected({'"+gear_bone+"'}):\n layout.prop(pose_bones['"+tweak_bone+"'], '[\"tweak_pin\"]', text='"+text+"', slider=True)" + return str + + def generate_string_for_parent_switch(bone): + str = "\n if is_selected({'"+bone+"'}):\n group1 = layout.row(align=True)\n group2 = group1.split(factor=0.75, align=True)\n props = group2.operator('pose.rigify_switch_parent_"+rig_char_id+"\', text=\'Parent Switch\', icon=\'DOWNARROW_HLT\')\n props.bone = \'"+bone+"\'\n props.prop_bone = \'"+bone+"\'\n props.prop_id=\'parent_switch\'\n props.parent_names = '[\"None\", \"root\", \"root.001\", \"root.002\", \"torso\", \"chest\"]'\n props.locks = (False, False, False)\n group2.prop(pose_bones['"+bone+"'], '[\"parent_switch\"]', text='')\n props = group1.operator('pose.rigify_switch_parent_bake_"+rig_char_id+"', text='', icon='ACTION_TWEAK')\n props.bone = '"+bone+"'\n props.prop_bone='"+bone+"'\n props.prop_id='parent_switch'\n props.parent_names='[\"None\", \"root\", \"root.001\", \"root.002\", \"torso\", \"chest\"]'\n props.locks = (False, False, False)" + return str + # Used for already existing bones (torso and limbs) + def generate_string_for_ik_switch(bone, prop1, prop2): + str = "\n if is_selected({'"+bone+"'}):\n group1 = layout.row(align=True)\n group2 = group1.split(factor=0.75, align=True)\n props = group2.operator('pose.rigify_switch_parent_"+rig_char_id+"\', text=\'Parent Switch\', icon=\'DOWNARROW_HLT\')\n props.bone = \'"+prop1+"\'\n props.prop_bone = \'"+prop2+"\'\n props.prop_id=\'IK_parent\'\n props.parent_names = '[\"None\", \"root\", \"root.001\", \"root.002\", \"torso\", \"chest\"]'\n props.locks = (False, False, False)\n group2.prop(pose_bones['"+prop2+"'], '[\"IK_parent\"]', text='')\n props = group1.operator('pose.rigify_switch_parent_bake_"+rig_char_id+"', text='', icon='ACTION_TWEAK')\n props.bone = '"+prop1+"'\n props.prop_bone='"+prop2+"'\n props.prop_id='IK_parent'\n props.parent_names='[\"None\", \"root\", \"root.001\", \"root.002\", \"torso\", \"chest\"]'\n props.locks = (False, False, False)" + return str + + # because rigify makes the rig ui before i get to it, we have to change this stuff for the torso sliders below. + def torso_str(): + torso="\n props.bone = 'torso.002'\n props.prop_bone = 'torso.002'\n props.prop_id = 'torso_parent'\n props.parent_names = '[\"None\", \"Root\"]'\n props.locks = (False, False, False)\n group2.prop(pose_bones['torso.002'], '[\"torso_parent\"]', text='')\n props = group1.operator('pose.rigify_switch_parent_bake_"+rig_char_id+"', text='', icon='ACTION_TWEAK')\n props.bone = 'torso.002'\n props.prop_bone = 'torso.002'\n props.prop_id = 'torso_parent'\n props.parent_names = '[\"None\", \"Root\"]'\n props.locks = (False, False, False)" + return torso + + def torso_repair(): + cut = complete_rig_text.split("props = group2.operator('pose.rigify_switch_parent_"+rig_char_id+"', text='Torso Parent', icon='DOWNARROW_HLT')") + second_str = "if is_selected({'foot_fk.L', 'foot_ik.L', 'thigh_ik_target.L', 'foot_tweak.L', 'shin_tweak.L', 'foot_heel_ik.L', 'thigh_ik.L', 'VIS_thigh_ik_pole.L', 'toe_fk.L', 'shin_fk.L', 'thigh_parent.L', 'foot_spin_ik.L', 'thigh_fk.L', 'toe_ik.L', 'thigh_tweak.L', 'thigh_tweak.L.001', 'shin_tweak.L.001'}):" + second_half = cut[1] + new_cut = second_half.split(second_str) + final = new_cut[1] + + merged_text = cut[0]+"props = group2.operator('pose.rigify_switch_parent_"+rig_char_id+"', text='Torso Parent', icon='DOWNARROW_HLT')"+torso_str()+second_str+final + + return merged_text + def splice_into_text(divider, text): + split = complete_rig_text.split(divider) + return split[0]+divider+text+split[1] + + # NPC doesn't get head tracker parent switch, the skeleton lacks the bone to make it work. + + # Make the limb edits + complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_parent_switch("forearm_tweak-pin.L")) + complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_limb_pin("forearm_tweak-pin.L","upper_arm_parent.L","forearm_tweak.L","Elbow Pin")) + complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_parent_switch("forearm_tweak-pin.R")) + complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_limb_pin("forearm_tweak-pin.R","upper_arm_parent.R","forearm_tweak.R","Elbow Pin")) + + complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_ik_switch("hand_ik_pivot.L","hand_ik.L","upper_arm_parent.L")) + complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_ik_switch("hand_ik_pivot.R","hand_ik.R","upper_arm_parent.R")) + complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_ik_switch("foot_ik_pivot.L","foot_ik.L","thigh_parent.L")) + complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_ik_switch("foot_ik_pivot.R","foot_ik.R","thigh_parent.R")) + + complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_parent_switch("shin_tweak-pin.L")) + complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_limb_pin("shin_tweak-pin.L","thigh_parent.L","shin_tweak.L","Knee Pin")) + complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_parent_switch("shin_tweak-pin.R")) + complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_limb_pin("shin_tweak-pin.R","thigh_parent.R","shin_tweak.R","Knee Pin")) + + # Clear the text from the text block, reassemble it as needed with strings and modifications. + rig_file.clear() + rig_file.write(complete_rig_text) + rig_file.write(rig_text_disclaimer) + + + + # After all text block modifications, run the new edited script. + ctx = bpy.context.copy() + ctx['edit_text'] = rig_file + with bpy.context.temp_override(edit_text=rig_file): + bpy.ops.text.run_script() + + # DONE MODIFYING ui.py FILE -------------------------------------------- + + # Post modification, Adjustment of bone layers/collections. + if not is_version_4: + for x in range(29): + if x>0: + bpy.context.object.data.layers[x] = False + + # Disable/Enable Rig UI layers we care about + bpy.context.object.data.layers[0] = True + bpy.context.object.data.layers[3] = True + bpy.context.object.data.layers[4] = False + bpy.context.object.data.layers[5] = True + bpy.context.object.data.layers[6] = False + bpy.context.object.data.layers[7] = True + bpy.context.object.data.layers[8] = False + bpy.context.object.data.layers[10] = True + bpy.context.object.data.layers[11] = False + bpy.context.object.data.layers[13] = True + bpy.context.object.data.layers[14] = False + bpy.context.object.data.layers[16] = True + bpy.context.object.data.layers[17] = False + bpy.context.object.data.layers[21] = True + bpy.context.object.data.layers[28] = True + bpy.context.object.data.layers[26] = True + else: + bpy.context.object.data.collections["Tweaks"].is_visible = False + bpy.context.object.data.collections["Pivots & Pins"].is_visible = False + bpy.context.object.data.collections["Torso (FK)"].is_visible = False + bpy.context.object.data.collections["Fingers (Detail)"].is_visible = False + bpy.context.object.data.collections["Arm.L (FK)"].is_visible = False + bpy.context.object.data.collections["Arm.R (FK)"].is_visible = False + bpy.context.object.data.collections["Leg.L (FK)"].is_visible = False + bpy.context.object.data.collections["Leg.R (FK)"].is_visible = False + bpy.context.object.data.collections["Other"].is_visible = False + + # Send the given bone to its new location for either version. Adjusted for actual layer num. + # MOVING OF BONES BELOW ------------------------------- + def bone_to_layer(bone, layer, collection, second_coll="None"): + arm = bpy.context.object + if bone in arm.data.bones: + if is_version_4: + if collection == "Other": + bpy.context.object.data.collections[collection].assign(bpy.context.object.data.bones[bone]) + else: + bpy.context.object.data.collections[collection].assign(bpy.context.object.data.bones[bone]) + bpy.context.object.data.collections["Other"].unassign(bpy.context.object.data.bones[bone]) + if second_coll != "None": + bpy.context.object.data.collections[second_coll].assign(bpy.context.object.data.bones[bone]) + else: + move_bone(bone,layer) + + # Since we've looped through ever 4.0 bone to place in 'other' above, we'll have to do so as well for 3.6 + if not is_version_4: + for bone in bpy.context.active_object.pose.bones: + bone_to_layer(bone.name, 25, "Other") + + loop_arm = bpy.context.object.data + for bone in loop_arm.bones: + if "tweak" in bone.name and "MCH" not in bone.name and "pin" not in bone.name: + bone_to_layer(bone.name, 2, "Tweaks") + + # Moving to Tweaks (werent catched in loop) + bone_to_layer("tweak_spine", 2, "Tweaks") + bone_to_layer("tweak_spine.001", 2, "Tweaks") + bone_to_layer("tweak_spine.002", 2, "Tweaks") + bone_to_layer("tweak_spine.003", 2, "Tweaks") + bone_to_layer("tweak_spine.004", 2, "Tweaks") + bone_to_layer("tweak_spine.005", 2, "Tweaks") + # MOVING PIVOTS AND PINS + bone_to_layer("torso_pivot.002", 19, "Pivots & Pins") + bone_to_layer("forearm_tweak-pin.L", 19, "Pivots & Pins") + bone_to_layer("hand_ik_pivot.L", 19, "Pivots & Pins") + bone_to_layer("hand_ik_pivot.R", 19, "Pivots & Pins") + bone_to_layer("forearm_tweak-pin.R", 19, "Pivots & Pins") + bone_to_layer("shin_tweak-pin.L", 19, "Pivots & Pins") + bone_to_layer("shin_tweak-pin.R", 19, "Pivots & Pins") + bone_to_layer("foot_ik_pivot.L", 19, "Pivots & Pins") + bone_to_layer("foot_ik_pivot.R", 19, "Pivots & Pins") + + # MOVING FACE + bone_to_layer("plate-settings", 0, "Face") + bone_to_layer("plate-border", 0, "Face") + bone_to_layer("Plate", 0, "Face") + bone_to_layer("eyetrack", 0, "Face") + if use_head_tracker: + bone_to_layer("head-controller", 0, "Face") + else: + bone_to_layer("head-controller", 25, "Other") + bone_to_layer("eyetrack_L", 0, "Face") + bone_to_layer("eyetrack_R", 0, "Face") + + + # Disable selection of face bone + selected_bone = faceplate_arm.pose.bones["Plate"] + selected_bone.bone.hide_select = True + + bone_to_layer("Mouth-Smile-Control", 0, "Face") + bone_to_layer("Mouth-Angry-Control", 0, "Face") + bone_to_layer("Mouth-A-Control", 0, "Face") + bone_to_layer("Eye-Hostility-Control", 0, "Face") + bone_to_layer("Eye-Wail-Control", 0, "Face") + bone_to_layer("Eye-WinkA-Control", 0, "Face") + bone_to_layer("Eye-WinkB-Control", 0, "Face") + bone_to_layer("Wink-Control", 0, "Face") + bone_to_layer("Face-Strong-Control", 0, "Face") + bone_to_layer("Face-Fat-Control", 0, "Face") + + # Moving Torso + bone_to_layer("head", 3, "Torso (IK)") + bone_to_layer("neck", 3, "Torso (IK)") + bone_to_layer("chest", 3, "Torso (IK)") + bone_to_layer("torso", 3, "Torso (IK)") + bone_to_layer("torso.001", 26, "Offsets") + bone_to_layer("torso.002", 26, "Offsets") + bone_to_layer("hips", 3, "Torso (IK)") + + bone_to_layer("spine_fk.003", 4, "Torso (FK)") + bone_to_layer("spine_fk.002", 4, "Torso (FK)") + bone_to_layer("spine_fk.001", 4, "Torso (FK)") + bone_to_layer("spine_fk", 4, "Torso (FK)") + + # Moving Fingers + bone_to_layer("thumb.01_master.L", 5, "Fingers") + bone_to_layer("thumb.01_master.R", 5, "Fingers") + bone_to_layer("f_index.01_master.L", 5, "Fingers") + bone_to_layer("f_index.01_master.R", 5, "Fingers") + bone_to_layer("f_middle.01_master.L", 5, "Fingers") + bone_to_layer("f_middle.01_master.R", 5, "Fingers") + bone_to_layer("f_ring.01_master.L", 5, "Fingers") + bone_to_layer("f_ring.01_master.R", 5, "Fingers") + bone_to_layer("f_pinky.01_master.L", 5, "Fingers") + bone_to_layer("f_pinky.01_master.R", 5, "Fingers") + + bone_to_layer("thumb.01.L", 6, "Fingers (Detail)") + bone_to_layer("thumb.01.R", 6, "Fingers (Detail)") + bone_to_layer("thumb.02.L", 6, "Fingers (Detail)") + bone_to_layer("thumb.02.R", 6, "Fingers (Detail)") + bone_to_layer("thumb.03.L", 6, "Fingers (Detail)") + bone_to_layer("thumb.03.R", 6, "Fingers (Detail)") + bone_to_layer("thumb.01.L.001", 6, "Fingers (Detail)") + bone_to_layer("thumb.01.R.001", 6, "Fingers (Detail)") + bone_to_layer("f_index.01.L", 6, "Fingers (Detail)") + bone_to_layer("f_index.01.R", 6, "Fingers (Detail)") + bone_to_layer("f_index.02.L", 6, "Fingers (Detail)") + bone_to_layer("f_index.02.R", 6, "Fingers (Detail)") + bone_to_layer("f_index.03.L", 6, "Fingers (Detail)") + bone_to_layer("f_index.03.R", 6, "Fingers (Detail)") + bone_to_layer("f_index.01.L.001", 6, "Fingers (Detail)") + bone_to_layer("f_index.01.R.001", 6, "Fingers (Detail)") + bone_to_layer("f_middle.01.L", 6, "Fingers (Detail)") + bone_to_layer("f_middle.01.R", 6, "Fingers (Detail)") + bone_to_layer("f_middle.02.L", 6, "Fingers (Detail)") + bone_to_layer("f_middle.02.R", 6, "Fingers (Detail)") + bone_to_layer("f_middle.03.L", 6, "Fingers (Detail)") + bone_to_layer("f_middle.03.R", 6, "Fingers (Detail)") + bone_to_layer("f_middle.01.L.001", 6, "Fingers (Detail)") + bone_to_layer("f_middle.01.R.001", 6, "Fingers (Detail)") + bone_to_layer("f_ring.01.L", 6, "Fingers (Detail)") + bone_to_layer("f_ring.01.R", 6, "Fingers (Detail)") + bone_to_layer("f_ring.02.L", 6, "Fingers (Detail)") + bone_to_layer("f_ring.02.R", 6, "Fingers (Detail)") + bone_to_layer("f_ring.03.L", 6, "Fingers (Detail)") + bone_to_layer("f_ring.03.R", 6, "Fingers (Detail)") + bone_to_layer("f_ring.01.L.001", 6, "Fingers (Detail)") + bone_to_layer("f_ring.01.R.001", 6, "Fingers (Detail)") + bone_to_layer("f_pinky.01.L", 6, "Fingers (Detail)") + bone_to_layer("f_pinky.01.R", 6, "Fingers (Detail)") + bone_to_layer("f_pinky.02.L", 6, "Fingers (Detail)") + bone_to_layer("f_pinky.02.R", 6, "Fingers (Detail)") + bone_to_layer("f_pinky.03.L", 6, "Fingers (Detail)") + bone_to_layer("f_pinky.03.R", 6, "Fingers (Detail)") + bone_to_layer("f_pinky.01.L.001", 6, "Fingers (Detail)") + bone_to_layer("f_pinky.01.R.001", 6, "Fingers (Detail)") + + # Pass in a list, all of those bones will be moved accordingly. + def fast_bone_move(bone_list, layer, collection): + for bone in bone_list: + bone_to_layer(bone, layer, collection) + + # Refactoring old bone move functionalities + list_move_to_other = ["+UpperArmTwistA02.L","+UpperArmTwistA01.L","+UpperArmTwistA01.R","+UpperArmTwistA02.R","eye.R","eye.L","+ToothBone D A01","+ToothBone U A01","+ToothBone A A01"] + fast_bone_move(list_move_to_other, 25, "Other") + + if toe_bones_exist: + bone_to_layer("toe_ik.L", 13, "Leg.L (IK)") + bone_to_layer("toe_ik.R", 16, "Leg.R (IK)") + else: + bone_to_layer("toe_ik.L", 25, "Other") + bone_to_layer("toe_ik.R", 25, "Other") + + if use_arm_ik_poles: + bone_to_layer("upper_arm_ik.L", 25, "Other") + bone_to_layer("upper_arm_ik.R", 25, "Other") + else: + bone_to_layer("upper_arm_ik.L", 7, "Arm.L (IK)") + bone_to_layer("upper_arm_ik.R", 10, "Arm.R (IK)") + + if use_leg_ik_poles: + bone_to_layer("thigh_ik.L", 25, "Other") + bone_to_layer("thigh_ik.R", 25, "Other") + else: + bone_to_layer("thigh_ik.L", 13, "Leg.L (IK)") + bone_to_layer("thigh_ik.R", 16, "Leg.R (IK)") + + try: + bone_to_layer("+EyeBone L A01.001", 25, "Other") + bone_to_layer("+EyeBone R A01.001", 25, "Other") + except: + pass + + if not use_head_tracker: + bone_to_layer("head-controller", 25, "Other") + + if no_eyes: + bone_to_layer("eyetrack",25,"Other") + bone_to_layer("eyetrack_L",25,"Other") + bone_to_layer("eyetrack_R",25,"Other") + + # New bones, post append + list_to_send_other = ["MCH-thigh_ik_target_sub.L","MCH-thigh_ik_target_sub.R","MCH-foot_ik_pivot.L","MCH-foot_ik_pivot.R","MCH-hand_ik_pivot.L","MCH-hand_ik_pivot.R","MCH-hand_ik_wrist.L","MCH-hand_ik_wrist.R","MCH-torso_pivot.002","shoulder_driver.R","shoulder_driver.L","MCH-shoulder_follow.R","MCH-shoulder_follow.L"] + + fast_bone_move(list_to_send_other,25,"Other") + + send_to_pivots = ["foot_ik_pivot.L","foot_ik_pivot.R","hand_ik_pivot.L","hand_ik_pivot.R","torso_pivot.002","forearm_tweak-pin.L","forearm_tweak-pin.R","shin_tweak-pin.L","shin_tweak-pin.R"] + fast_bone_move(send_to_pivots, 19, "Pivots & Pins") + + bone_to_layer("root.002", 28, "Root") + bone_to_layer("root.001", 26, "Offsets") + bone_to_layer("root", 26, "Offsets") + + bone_to_layer("hand_ik.L",7,"Arm.L (IK)") + bone_to_layer("hand_ik_wrist.L",26,"Offsets") + bone_to_layer("upper_arm_parent.L",[7,8],"Arm.L (IK)","Arm.L (FK)") + bone_to_layer("upper_arm_ik_target.L",7,"Arm.L (IK)") + bone_to_layer("shoulder.L",[7,8],"Arm.L (IK)","Arm.L (FK)") + + bone_to_layer("hand_ik.R",10,"Arm.R (IK)") + bone_to_layer("upper_arm_parent.R",[10,11],"Arm.R (IK)","Arm.R (FK)") + bone_to_layer("hand_ik_wrist.R",26,"Offsets") + bone_to_layer("upper_arm_ik_target.R",10,"Arm.R (IK)") + bone_to_layer("shoulder.R",[10,11],"Arm.R (IK)","Arm.R (FK)") + + bone_to_layer("upper_arm_fk.L",8,"Arm.L (FK)") + bone_to_layer("forearm_fk.L",8,"Arm.L (FK)") + bone_to_layer("hand_fk.L",8,"Arm.L (FK)") + + bone_to_layer("upper_arm_fk.R",11,"Arm.R (FK)") + bone_to_layer("forearm_fk.R",11,"Arm.R (FK)") + bone_to_layer("hand_fk.R",11,"Arm.R (FK)") + + bone_to_layer("foot_ik.L",13,"Leg.L (IK)") + bone_to_layer("thigh_parent.L",[13,14],"Leg.L (IK)","Leg.L (FK)") + bone_to_layer("thigh_ik_target.L",13,"Leg.L (IK)") + bone_to_layer("foot_ik_sub.L",26,"Offsets") + bone_to_layer("foot_spin_ik.L",13,"Leg.L (IK)") + bone_to_layer("foot_heel_ik.L",13,"Leg.L (IK)") + + bone_to_layer("thigh_fk.L",14,"Leg.L (FK)") + bone_to_layer("shin_fk.L",14,"Leg.L (FK)") + bone_to_layer("foot_fk.L",14,"Leg.L (FK)") + bone_to_layer("toe_fk.L",14,"Leg.L (FK)") + + bone_to_layer("foot_ik.R",16,"Leg.R (IK)") + bone_to_layer("thigh_parent.R",[16,17],"Leg.R (IK)","Leg.R (FK)") + bone_to_layer("thigh_ik_target.R",16,"Leg.R (IK)") + bone_to_layer("foot_ik_sub.R",26,"Offsets") + bone_to_layer("foot_spin_ik.R",16,"Leg.R (IK)") + bone_to_layer("foot_heel_ik.R",16,"Leg.R (IK)") + + bone_to_layer("thigh_fk.R",17,"Leg.R (FK)") + bone_to_layer("shin_fk.R",17,"Leg.R (FK)") + bone_to_layer("foot_fk.R",17,"Leg.R (FK)") + bone_to_layer("toe_fk.R",17,"Leg.R (FK)") + + #npc, move invis bones away + bone_to_layer("WinkA-Invis", 25, "Other") + bone_to_layer("WinkB-Invis", 25, "Other") + + bone_to_layer("prop.L", 21, "Props") + bone_to_layer("prop.R", 21, "Props") + + # MOVING OF BONES END ------------------------------- +def setup_neck_and_head_follow(neck_follow_value, head_follow_value): + bpy.context.object.pose.bones["torso"]["neck_follow"] = neck_follow_value + bpy.context.object.pose.bones["torso"]["head_follow"] = head_follow_value + + +# Make it so that the finger scale controls can be scaled on the X axis to curl in just the fingertips instead of the entire finger. +def setup_finger_scale_controls_on_x_axis_to_curl_just_the_fingertips(rigified_rig): + bpy.ops.object.mode_set(mode='POSE') + + for oDrv in rigified_rig.animation_data.drivers: + for variable in oDrv.driver.variables: + for target in variable.targets: + if ".03" in oDrv.data_path and target.data_path[-7:] == "scale.y": + target.data_path = target.data_path[:-1] + "x" + + + fingerlist = ["thumb.01_master", "f_index.01_master", "f_middle.01_master", "f_ring.01_master", "f_pinky.01_master"] + for side in [".L", ".R"]: + for bone in fingerlist: + rigified_rig.pose.bones[bone + side].lock_scale[0] = False diff --git a/setup_wizard/character_rig_setup/rig_script.py b/setup_wizard/character_rig_setup/rig_script.py new file mode 100644 index 0000000..5532cd5 --- /dev/null +++ b/setup_wizard/character_rig_setup/rig_script.py @@ -0,0 +1,3111 @@ +# Authors: enthralpy, Llama.jpg +# Setup Wizard Integration by michael-gh1 + +import bpy +import os +from mathutils import Color, Vector +from math import pi + +def rig_character( + file_path, + disallow_arm_ik_stretch, + disallow_leg_ik_stretch, + use_arm_ik_poles, + use_leg_ik_poles, + add_child_of_constraints, + use_head_tracker, + meshes_joined=False): + + # Firstly, let's make a flag to identify the blender version. + is_version_4 = False + version_string = bpy.app.version_string + if version_string[0] == "4": + is_version_4 = True + + head_bone_arm_target = bpy.context.active_object + temp_armature = head_bone_arm_target.data + + bpy.ops.object.mode_set(mode='EDIT') + + # Check if toe bones exist + toe_bones_exist = True + if "Bip001 L Toe0" not in temp_armature.edit_bones: + toe_bones_exist = False + + # Check if eyes exist: + left_eye_exists = True + if "+EyeBone L A02" not in temp_armature.edit_bones: + left_eye_exists = False + + right_eye_exists = True + if "+EyeBone R A02" not in temp_armature.edit_bones: + right_eye_exists = False + + no_eyes = False + if not left_eye_exists and not right_eye_exists: + no_eyes = True + + # Hoyo models have inconsistent head bone shapes. I'm correcting them to my standard. (This stabilizes the head track bone) + # My logic: Line up the head bone's tail's X & Y to the head bone's head (so that it's straight up), and use the eye bone's head's Z as the height. - Llama + if not no_eyes: + if left_eye_exists: + eye_bone_head = temp_armature.edit_bones['+EyeBone L A02'] + elif right_eye_exists: + eye_bone_head = temp_armature.edit_bones['+EyeBone R A02'] + eye_bone_head_z = eye_bone_head.head[2] + + head_bone_temp = temp_armature.edit_bones['Bip001 Head'] + head_bone_head_x = head_bone_temp.head[0] + head_bone_head_y = head_bone_temp.head[1] + + head_bone_temp.tail[0] = head_bone_head_x + head_bone_temp.tail[1] = head_bone_head_y + head_bone_temp.tail[2] = eye_bone_head_z + + # If they dont have eye bones (Dottore), we can hardcode a reasonable value to use to repair the head. + else: + head_bone_temp = temp_armature.edit_bones['Bip001 Head'] + head_bone_head_x = head_bone_temp.head[0] + head_bone_head_y = head_bone_temp.head[1] + + head_bone_temp.tail[0] = head_bone_head_x + head_bone_temp.tail[1] = head_bone_head_y + head_bone_temp.tail[2] = head_bone_temp.head[2] + 0.0538 + + left_eye_2 = [] + left_eye_1 = [] + right_eye_2 = [] + right_eye_1 = [] + + if left_eye_exists: + left_eye_2.append(temp_armature.edit_bones['+EyeBone L A02'].head[0]) + left_eye_2.append(temp_armature.edit_bones['+EyeBone L A02'].head[1]) + left_eye_2.append(temp_armature.edit_bones['+EyeBone L A02'].head[2]) + + left_eye_1.append(temp_armature.edit_bones['+EyeBone L A01'].head[0]) + left_eye_1.append(temp_armature.edit_bones['+EyeBone L A01'].head[1]) + left_eye_1.append(temp_armature.edit_bones['+EyeBone L A01'].head[2]) + if right_eye_exists: + right_eye_2.append(temp_armature.edit_bones['+EyeBone R A02'].head[0]) + right_eye_2.append(temp_armature.edit_bones['+EyeBone R A02'].head[1]) + right_eye_2.append(temp_armature.edit_bones['+EyeBone R A02'].head[2]) + + right_eye_1.append(temp_armature.edit_bones['+EyeBone R A01'].head[0]) + right_eye_1.append(temp_armature.edit_bones['+EyeBone R A01'].head[1]) + right_eye_1.append(temp_armature.edit_bones['+EyeBone R A01'].head[2]) + + bpy.ops.object.mode_set(mode='OBJECT') + + # THANK YOU: https://blenderartists.org/t/how-to-bpy-ops-transform-resize-in-edit-mode-using-pivot/560381/2 + def get_override(area_type, region_type): + for area in bpy.context.screen.areas: + if area.type == area_type: + for region in area.regions: + if region.type == region_type: + override = {'area': area, 'region': region} + return override + #error message if the area or region wasn't found + raise RuntimeError("Wasn't able to find", region_type," in area ", area_type, " Make sure it's open while executing script.") + + #we need to override the context of our operator + override = get_override( 'VIEW_3D', 'WINDOW' ) + + # Function to create shape keys from given arguments: Works with only one element in vg to parse + def create_shape_key(obj_get, is_basis, shape_name, transform_pivot, vertex_groups_to_parse, transform_type, transformation_1, transformation_2=0, use_eye_1=False): + bpy.context.view_layer.objects.active = head_bone_arm_target + bpy.ops.object.mode_set(mode='EDIT') + for this_group in vertex_groups_to_parse: + if use_eye_1: + if " R " in this_group: + if right_eye_exists: + bpy.context.scene.cursor.location = (right_eye_1[0],right_eye_1[1],right_eye_1[2]) + elif " L " in this_group: + if left_eye_exists: + bpy.context.scene.cursor.location = (left_eye_1[0],left_eye_1[1],left_eye_1[2]) + else: + if " R " in this_group: + if right_eye_exists: + bpy.context.scene.cursor.location = (right_eye_2[0],right_eye_2[1],right_eye_2[2]) + elif " L " in this_group: + if left_eye_exists: + bpy.context.scene.cursor.location = (left_eye_2[0],left_eye_2[1],left_eye_2[2]) + + # AFTER MOVING 3D CURSOR + this_obj = bpy.data.objects.get(obj_get) + bpy.context.view_layer.objects.active = this_obj + + if is_basis: + this_obj.shape_key_add(name='Basis') + + this_obj.shape_key_add(from_mix=False) + sk = this_obj.data.shape_keys.key_blocks[-1] + sk.name = shape_name + sk.value = 1 + shape_index = this_obj.data.shape_keys.key_blocks.keys().index(shape_name) + bpy.context.object.active_shape_key_index = shape_index + + bpy.ops.object.mode_set(mode='EDIT') + bpy.ops.mesh.select_all(action='DESELECT') + bpy.context.tool_settings.transform_pivot_point = "CURSOR" + + try: + bpy.ops.object.vertex_group_set_active(group=this_group) + bpy.ops.object.vertex_group_select() + + if transform_type == "RESIZE": + # for documentation: v4 does not like the override argument lmao + if not is_version_4: + bpy.ops.transform.resize(override, value=(transformation_1), orient_type='LOCAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='LOCAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) + else: + bpy.ops.transform.resize(value=(transformation_1), orient_type='LOCAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='LOCAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) + bpy.ops.object.vertex_group_deselect() + elif transform_type == "TRANSLATE": + if not is_version_4: + bpy.ops.transform.translate(override, value=transformation_1, orient_type='LOCAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='LOCAL', constraint_axis=(False, True, False), mirror=True, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) + bpy.ops.transform.resize(override, value=transformation_2) + bpy.ops.object.vertex_group_deselect() + else: + bpy.ops.transform.translate(value=transformation_1, orient_type='LOCAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='LOCAL', constraint_axis=(False, True, False), mirror=True, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) + bpy.ops.transform.resize(override, value=transformation_2) + bpy.ops.object.vertex_group_deselect() + except: + pass + + bpy.ops.object.vertex_group_deselect() + bpy.ops.mesh.select_all(action='DESELECT') + bpy.ops.object.mode_set(mode='OBJECT') + sk.value = 0.0 + bpy.context.scene.cursor.location = (0.0,0.0,0.0) + + # Function to create shape keys that works with 2 elementsa + def create_shape_key2(obj_get, is_basis, shape_name, transform_pivot, vertex_groups_to_parse, transform_type, transformation_1, transformation_2=0, use_eye_1=False): + bpy.context.view_layer.objects.active = head_bone_arm_target + bpy.ops.object.mode_set(mode='EDIT') + if use_eye_1: + if " R " in vertex_groups_to_parse[0]: + if right_eye_exists: + bpy.context.scene.cursor.location = (right_eye_1[0],right_eye_1[1],right_eye_1[2]) + elif " L " in vertex_groups_to_parse[0]: + if left_eye_exists: + bpy.context.scene.cursor.location = (left_eye_1[0],left_eye_1[1],left_eye_1[2]) + else: + if " R " in vertex_groups_to_parse[0]: + if right_eye_exists: + bpy.context.scene.cursor.location = (right_eye_2[0],right_eye_2[1],right_eye_2[2]) + elif " L " in vertex_groups_to_parse[0]: + if left_eye_exists: + bpy.context.scene.cursor.location = (left_eye_2[0],left_eye_2[1],left_eye_2[2]) + + # AFTER MOVING 3D CURSOR + this_obj = bpy.data.objects.get(obj_get) + bpy.context.view_layer.objects.active = this_obj + + if is_basis: + this_obj.shape_key_add(name='Basis') + + this_obj.shape_key_add(from_mix=False) + sk = this_obj.data.shape_keys.key_blocks[-1] + sk.name = shape_name + sk.value = 1 + shape_index = this_obj.data.shape_keys.key_blocks.keys().index(shape_name) + bpy.context.object.active_shape_key_index = shape_index + + bpy.ops.object.mode_set(mode='EDIT') + bpy.ops.mesh.select_all(action='DESELECT') + bpy.context.tool_settings.transform_pivot_point = "CURSOR" + + try: + bpy.ops.object.vertex_group_set_active(group=vertex_groups_to_parse[0]) + bpy.ops.object.vertex_group_select() + + if transform_type == "RESIZE": + if not is_version_4: + bpy.ops.transform.resize(override, value=(transformation_1), orient_type='LOCAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='LOCAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) + bpy.ops.object.vertex_group_deselect() + else: + bpy.ops.transform.resize(value=(transformation_1), orient_type='LOCAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='LOCAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) + bpy.ops.object.vertex_group_deselect() + elif transform_type == "TRANSLATE": + if not is_version_4: + bpy.ops.transform.translate(override, value=transformation_1, orient_type='LOCAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='LOCAL', constraint_axis=(False, True, False), mirror=True, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) + bpy.ops.transform.resize(override, value=transformation_2) + bpy.ops.object.vertex_group_deselect() + else: + bpy.ops.transform.translate(value=transformation_1, orient_type='LOCAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='LOCAL', constraint_axis=(False, True, False), mirror=True, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) + bpy.ops.transform.resize(override, value=transformation_2) + bpy.ops.object.vertex_group_deselect() + + except: + pass + + bpy.ops.mesh.select_all(action='DESELECT') + bpy.ops.object.mode_set(mode='OBJECT') + + # REPEAT FOR SECOND BONE! + + bpy.context.view_layer.objects.active = head_bone_arm_target + bpy.ops.object.mode_set(mode='EDIT') + if use_eye_1: + if " R " in vertex_groups_to_parse[1]: + if right_eye_exists: + bpy.context.scene.cursor.location = (right_eye_1[0],right_eye_1[1],right_eye_1[2]) + elif " L " in vertex_groups_to_parse[1]: + if left_eye_exists: + bpy.context.scene.cursor.location = (left_eye_1[0],left_eye_1[1],left_eye_1[2]) + else: + if " R " in vertex_groups_to_parse[1]: + if right_eye_exists: + bpy.context.scene.cursor.location = (right_eye_2[0],right_eye_2[1],right_eye_2[2]) + elif " L " in vertex_groups_to_parse[1]: + if left_eye_exists: + bpy.context.scene.cursor.location = (left_eye_2[0],left_eye_2[1],left_eye_2[2]) + + # AFTER MOVING 3D CURSOR + this_obj = bpy.data.objects.get(obj_get) + bpy.context.view_layer.objects.active = this_obj + + bpy.ops.object.mode_set(mode='EDIT') + bpy.ops.mesh.select_all(action='DESELECT') + + try: + bpy.ops.object.vertex_group_set_active(group=vertex_groups_to_parse[1]) + bpy.ops.object.vertex_group_select() + + if transform_type == "RESIZE": + if not is_version_4: + bpy.ops.transform.resize(override, value=(transformation_1), orient_type='LOCAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='LOCAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) + bpy.ops.object.vertex_group_deselect() + else: + bpy.ops.transform.resize(value=(transformation_1), orient_type='LOCAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='LOCAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) + bpy.ops.object.vertex_group_deselect() + elif transform_type == "TRANSLATE": + if not is_version_4: + bpy.ops.transform.translate(override, value=transformation_1, orient_type='LOCAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='LOCAL', constraint_axis=(False, True, False), mirror=True, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) + bpy.ops.transform.resize(override, value=transformation_2) + bpy.ops.object.vertex_group_deselect() + else: + bpy.ops.transform.translate(value=transformation_1, orient_type='LOCAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='LOCAL', constraint_axis=(False, True, False), mirror=True, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) + bpy.ops.transform.resize(override, value=transformation_2) + bpy.ops.object.vertex_group_deselect() + except: + pass + + bpy.ops.mesh.select_all(action='DESELECT') + bpy.ops.object.mode_set(mode='OBJECT') + + # DONE + sk.value = 0.0 + bpy.context.scene.cursor.location = (0.0,0.0,0.0) + + + # Shape key to shrink pupils + create_shape_key2("Body", True, "pupils", "CURSOR", ["+EyeBone L A02","+EyeBone R A02"], "RESIZE", (0.5,0.5,0.5)) + # Shape keys to adjust eye during blink + # For some reason, the math is different for v4, therefore adjust the nums so its more like v3.6 + if not is_version_4: + create_shape_key("Body", False, "pupil-pushback-R", "CURSOR", ["+EyeBone R A02"], "TRANSLATE", (0, 0.00703, 0), (1.1,1.1,1.1),use_eye_1=True) # 0.0069, 70 + create_shape_key("Body", False, "pupil-pushback-L", "CURSOR", ["+EyeBone L A02"], "TRANSLATE", (0, 0.00703, 0), (1.1,1.1,1.1),use_eye_1=True) + else: + create_shape_key("Body", False, "pupil-pushback-R", "CURSOR", ["+EyeBone R A02"], "TRANSLATE", (0, 0.00234, 0), (1.1,1.1,1.1),use_eye_1=True) # 0.0069, 70 + create_shape_key("Body", False, "pupil-pushback-L", "CURSOR", ["+EyeBone L A02"], "TRANSLATE", (0, 0.00234, 0), (1.1,1.1,1.1),use_eye_1=True) + + try: + # Bring back EyeStar + bpy.data.objects["EyeStar"].hide_set(False) + bpy.data.objects["EyeStar"].hide_viewport = False + bpy.data.objects["EyeStar"].hide_render = False + + # Shape key to enable EyeStar growth/shrinkage + create_shape_key2("EyeStar", True, "EyeStar", "CURSOR", ["+EyeBone R A02","+EyeBone L A02"], "RESIZE", (0,0,0)) + except: + pass + + bpy.context.tool_settings.transform_pivot_point = "MEDIAN_POINT" + + bpy.context.view_layer.objects.active = head_bone_arm_target + bpy.ops.object.mode_set(mode='EDIT') + + if not toe_bones_exist: + r_foot_bone = temp_armature.edit_bones["Bip001 R Foot"] + r_foot_bone.tail = (-0.040187,-0.078244,0.005803) # X, Y, Z + r_foot_bone.roll = 1.5708 + + l_foot_bone = temp_armature.edit_bones["Bip001 L Foot"] + l_foot_bone.tail = (0.040187,-0.078244,0.005803) + l_foot_bone.roll = 1.5708 + + bpy.ops.object.mode_set(mode='OBJECT') + bpy.context.view_layer.objects.active = head_bone_arm_target + + # Let's let the RigUI script that poke made execute. + + context = bpy.context + obj = context.object + if obj.name[-4:] == ".001": + obj.name = obj.name[:-4] + print("New Run\n\n") + ## Rename all bones in selected armature to ORG + original_name = obj.name + abadidea = { + 'Bip001 Pelvis': 'spine', + 'Bip001 L Thigh': 'thigh.L', + 'Bip001 L Calf': 'shin.L', + 'Bip001 L Foot': 'foot.L', + 'Bip001 L Toe0': 'toe.L', + 'Bip001 R Thigh': 'thigh.R', + 'Bip001 R Calf': 'shin.R', + 'Bip001 R Foot': 'foot.R', + 'Bip001 R Toe0': 'toe.R', + 'Bip001 Spine': 'spine.001', + 'Bip001 Spine1': 'spine.002', + 'Bip001 Spine2': 'spine.003', + 'Bip001 L Clavicle': 'shoulder.L', + 'Bip001 L UpperArm': 'upper_arm.L', + 'Bip001 L Forearm': 'forearm.L', + 'Bip001 L Hand': 'hand.L', + 'Bip001 L Finger0': 'thumb.01.L', + 'DMZ L 01': 'thumb.01.L', ##WHERE DO THESE SIX COME FROM LMAO + 'DMZ L 02': 'thumb.02.L', + 'DMZ L 03': 'thumb.03.L', + 'DMZ R 01': 'thumb.01.R', + 'DMZ R 02': 'thumb.02.R', + 'DMZ R 03': 'thumb.03.R', + 'Bip001 L Finger01': 'thumb.02.L', + 'Bip001 L Finger02': 'thumb.03.L', + 'Bip001 L Finger1': 'f_index.01.L', + 'Bip001 L Finger11': 'f_index.02.L', + 'Bip001 L Finger12': 'f_index.03.L', + 'Bip001 L Finger2': 'f_middle.01.L', + 'Bip001 L Finger21': 'f_middle.02.L', + 'Bip001 L Finger22': 'f_middle.03.L', + 'Bip001 L Finger3': 'f_ring.01.L', + 'Bip001 L Finger31': 'f_ring.02.L', + 'Bip001 L Finger32': 'f_ring.03.L', + 'Bip001 L Finger4': 'f_pinky.01.L', + 'Bip001 L Finger41': 'f_pinky.02.L', + 'Bip001 L Finger42': 'f_pinky.03.L', + 'Bip001 Neck': 'spine.004', #YO + 'Bip001 Head': 'spine.006', #RUHROH + 'Bip001 R Clavicle': 'shoulder.R', + 'Bip001 R UpperArm': 'upper_arm.R', + 'Bip001 R Forearm': 'forearm.R', + 'Bip001 R Hand': 'hand.R', + 'Bip001 R Finger0': 'thumb.01.R', + 'Bip001 R Finger01': 'thumb.02.R', + 'Bip001 R Finger02': 'thumb.03.R', + 'Bip001 R Finger1': 'f_index.01.R', + 'Bip001 R Finger11': 'f_index.02.R', + 'Bip001 R Finger12': 'f_index.03.R', + 'Bip001 R Finger2': 'f_middle.01.R', + 'Bip001 R Finger21': 'f_middle.02.R', + 'Bip001 R Finger22': 'f_middle.03.R', + 'Bip001 R Finger3': 'f_ring.01.R', + 'Bip001 R Finger31': 'f_ring.02.R', + 'Bip001 R Finger32': 'f_ring.03.R', + 'Bip001 R Finger4': 'f_pinky.01.R', + 'Bip001 R Finger41': 'f_pinky.02.R', + 'Bip001 R Finger42': 'f_pinky.03.R', + '+EyeBone R A01': 'eye.R', + '+EyeBone L A01': 'eye.L', + '+Breast L A01': 'breast.L', + '+Breast R A01': 'breast.R', + } + if not toe_bones_exist: + del abadidea['Bip001 L Toe0'] + del abadidea['Bip001 R Toe0'] + + bpy.ops.object.mode_set(mode='EDIT') + armature = bpy.context.selected_objects[0].data + + bpy.ops.armature.select_all(action='DESELECT') + def select_bone(bone): + bone.select = True + bone.select_head = True + bone.select_tail = True + + # Disconnect the eyes because it'll throw an error if I don't, disconnect the spines so the hip wiggle bone in the rigify rig works properly + try: + select_bone(armature.edit_bones["+EyeBone L A02"]) + select_bone(armature.edit_bones["+EyeBone R A02"]) + except: + pass + select_bone(armature.edit_bones["Bip001 Spine"]) + select_bone(armature.edit_bones["Bip001 Spine1"]) + select_bone(armature.edit_bones["Bip001 Spine2"]) + bpy.ops.armature.parent_clear(type='DISCONNECT') + bpy.ops.armature.select_all(action='DESELECT') + + try: + select_bone(armature.edit_bones["+Breast R A02"]) + select_bone(armature.edit_bones["+Breast L A02"]) + bpy.ops.armature.parent_clear(type='DISCONNECT') + bpy.ops.armature.select_all(action='DESELECT') + except: + pass + + bones_list = obj.pose.bones + for bone in bones_list: + if bone.name in abadidea: + bone.name = abadidea[bone.name] + + # Fix finger rolls - Thanks Poke! + how_not = ['f_index.01.L', 'f_index.02.L', 'f_index.03.L'] + hahaha = ['f_middle.01.L', 'f_middle.02.L', 'f_middle.03.L'] + to_name = ['f_ring.01.L', 'f_ring.02.L', 'f_ring.03.L'] + things_efficiently = ['f_pinky.01.L', 'f_pinky.02.L', 'f_pinky.03.L'] + + for bone in how_not: + armature.edit_bones[bone].roll -= .1197 + + for bone in hahaha: + armature.edit_bones[bone].roll -= .04 + + for bone in to_name: + armature.edit_bones[bone].roll += .1297 + + for bone in things_efficiently: + armature.edit_bones[bone].roll += .338 + + #Aw shit here we go again. This second loop is for making it possible to symmetrize pose bones properly. + for bone in bones_list: + if ".L" in bone.name: + whee = bone.name[:-2] + ".R" + if "f_" in bone.name or "thumb" in bone.name: + armature.edit_bones[whee].roll = -armature.edit_bones[bone.name].roll + else: + armature.edit_bones[bone.name].roll = -armature.edit_bones[whee].roll + + armature.edit_bones["shoulder.L"].roll += 3.14 + armature.edit_bones["shoulder.R"].roll -= 3.14 + + + + # Fixes the thumb scale rotating inward on x instead of z + armature.edit_bones["thumb.01.L"].roll += 3.14 / 4 + armature.edit_bones["thumb.02.L"].roll += 3.14 / 4 + armature.edit_bones["thumb.03.L"].roll += 3.14 / 4 + armature.edit_bones["thumb.01.R"].roll -= 3.14 / 4 + armature.edit_bones["thumb.02.R"].roll -= 3.14 / 4 + armature.edit_bones["thumb.03.R"].roll -= 3.14 / 4 + + + + for bone in armature.edit_bones: + if "thumb" in bone.name or "index" in bone.name or "middle" in bone.name or "ring" in bone.name or "pinky" in bone.name: + if ".L" in bone.name: + armature.edit_bones[bone.name].roll -= 1.571 + else: + armature.edit_bones[bone.name].roll += 1.571 + ## Not sure why this bone exist but it's gotta go lmao + if bone.name == "Bip001": + for childbone in bone.children: + if childbone.name != "spine": + armature.edit_bones[childbone.name].parent = armature.edit_bones['spine'] + armature.edit_bones.remove(bone) + elif ".L" not in bone.name and ".R" not in bone.name: + armature.edit_bones[bone.name].roll = 0 + + + ## Fixes the weirdass pelvis/spine bone. Sets the spine's head and tail X to 0. + def realign(bone): + bone.head.x = 0 + bone.tail.x = 0 + realign(armature.edit_bones['spine']) + realign(armature.edit_bones['spine.006']) + + + ## Attaches the feet to the toes and the upperarms to lowerarms + def attachfeets(foot, toe): + armature.edit_bones[foot].tail.x = armature.edit_bones[toe].head.x + armature.edit_bones[foot].tail.y = armature.edit_bones[toe].head.y + armature.edit_bones[foot].tail.z = armature.edit_bones[toe].head.z + + if toe_bones_exist: + attachfeets('foot.L', 'toe.L') + attachfeets('foot.R', 'toe.R') + + attachfeets('upper_arm.L', 'forearm.L') + attachfeets('upper_arm.R', 'forearm.R') + attachfeets('thigh.L', 'shin.L') + attachfeets('thigh.R', 'shin.R') + attachfeets('forearm.L', 'hand.L') + attachfeets('forearm.R', 'hand.R') + attachfeets('spine', 'spine.001') + attachfeets('spine.001', 'spine.002') + attachfeets('spine.002', 'spine.003') + attachfeets('spine.003', 'spine.004') + attachfeets('spine.004', 'spine.006') + + ## Points toe bones in correct direction + if toe_bones_exist: + armature.edit_bones['toe.L'].tail.z = 0 + armature.edit_bones['toe.L'].tail.y -= 0.05 + + armature.edit_bones['toe.R'].tail.z = 0 + armature.edit_bones['toe.R'].tail.y -= 0.05 + + bpy.ops.armature.select_all(action='DESELECT') + try: + select_bone(armature.edit_bones["breast.L"]) + bpy.ops.armature.symmetrize() + bpy.ops.armature.select_all(action='DESELECT') + + except Exception: + pass + + try: + armature.edit_bones["eye.L"].name = "DEF-eye.L" + armature.edit_bones["eye.R"].name = "DEF-eye.R" + except: + pass + + bpy.ops.object.mode_set(mode='POSE') + + bpy.ops.object.expykit_convert_bone_names(src_preset='Rigify_Metarig.py', trg_preset='Rigify_Deform.py') + bpy.ops.object.expykit_extract_metarig(rig_preset='Rigify_Metarig.py', assign_metarig=True) + + + + ## Fixes the tiddy bones. Expykit, why did you neglect them + + metarm = bpy.data.objects["metarig"].data + bpy.ops.object.mode_set(mode='EDIT') + armature = bpy.data.objects[obj.name].data + + ## Left side first, right side's xyz is same as left, but x is negative + def getboob(bone, tip): + if tip == "head": + return armature.edit_bones[bone].head.x, armature.edit_bones[bone].head.y, armature.edit_bones[bone].head.z + else: + return armature.edit_bones[bone].tail.x, armature.edit_bones[bone].tail.y, armature.edit_bones[bone].tail.z + + + try: + xh, yh, zh = getboob("breast.L", "head") + xt, yt, zt = getboob("breast.L", "tail") + + ## Change the meta arm's boob positions + + def fixboob(bone, xh, yh, zh, xt, yt, zt): + bone.head.x = xh + bone.head.y = yh + bone.head.z = zh + bone.tail.x = xt + bone.tail.y = yt + bone.tail.z = zt + + boobL = metarm.edit_bones["breast.L"] + fixboob(boobL, xh, yh, zh, xt, yt, zt) + boobR = metarm.edit_bones["breast.R"] + fixboob(boobR, -xh, yh, zh, -xt, yt, zt) + + boobL.roll = armature.edit_bones["breast.L"].roll + boobR.roll = -boobL.roll + except Exception: + # If breast bones dont exist in the orig rig, then delete from the meta rig + metarm.edit_bones.remove(metarm.edit_bones["breast.L"]) + metarm.edit_bones.remove(metarm.edit_bones["breast.R"]) + + + + # Fixes the finger rolls + bpy.ops.object.mode_set(mode='OBJECT') + metapose = bpy.data.objects['metarig'].pose + for bone_name in ['f_index', 'f_middle', 'f_ring', 'f_pinky']: + metapose.bones[f"{bone_name}.01.L"].rigify_parameters.primary_rotation_axis = 'Z' + metapose.bones[f"{bone_name}.01.R"].rigify_parameters.primary_rotation_axis = '-Z' + + metapose.bones["thumb.01.L"].rigify_parameters.primary_rotation_axis = 'Z' + metapose.bones["thumb.01.R"].rigify_parameters.primary_rotation_axis = '-Z' + + + ## This part corrects metarm finger rolls + bpy.ops.object.mode_set(mode='OBJECT') + bpy.ops.object.select_all(action='DESELECT') + + armature = obj.data + + for o in bpy.data.objects: + # Check for given object names + if o.name in ("metarig", armature.name): + o.select_set(True) + + + bpy.ops.object.mode_set(mode='EDIT') + for bone in metarm.edit_bones: + if "f_" in bone.name or "thumb" in bone.name: + bone.roll = armature.edit_bones["DEF-"+bone.name].roll + + # Fix hand bones being rotated 90 degrees sideways and arm deformation bones being wonky + if "Loli" in obj.name: + metarm.edit_bones["upper_arm.L"].tail.y += .003 + metarm.edit_bones["upper_arm.R"].tail.y += .003 + + ########## DETACH PHYSICS BONES, + + metanames = ['eye.L', 'eye.R', 'spine', 'thigh.L', 'shin.L', 'foot.L', 'toe.L', 'thigh.R', 'shin.R', 'foot.R', 'toe.R', 'spine.001', 'spine.002', 'spine.003', 'breast.L', 'breast.R', 'shoulder.L', 'upper_arm.L', 'forearm.L', 'hand.L', 'thumb.01.L', 'thumb.02.L', 'thumb.03.L', 'f_index.01.L', 'f_index.02.L', 'f_index.03.L', 'f_middle.01.L', 'f_middle.02.L', 'f_middle.03.L', 'f_ring.01.L', 'f_ring.02.L', 'f_ring.03.L', 'f_pinky.01.L', 'f_pinky.02.L', 'f_pinky.03.L', 'spine.004', 'spine.006', 'shoulder.R', 'upper_arm.R', 'forearm.R', 'hand.R', 'thumb.01.R', 'thumb.02.R', 'thumb.03.R', 'f_index.01.R', 'f_index.02.R', 'f_index.03.R', 'f_middle.01.R', 'f_middle.02.R', 'f_middle.03.R', 'f_ring.01.R', 'f_ring.02.R', 'f_ring.03.R', 'f_pinky.01.R', 'f_pinky.02.R', 'f_pinky.03.R'] + if not toe_bones_exist: + metanames.remove("toe.L") + metanames.remove("toe.R") + + + pre_res = ["DEF-" + bonename for bonename in metanames] + armature = obj.data ## Original char rig + + + ## Make a dictionary. Key is a main body bone that exists in the Rigify (arm, leg, spine, etc), and the value is a list of all the children bones that aren't other main body bones (usually hair, clothes, deform, etc.) + savethechildren = { + + } + bpy.ops.object.mode_set(mode='EDIT') + for bone in armature.edit_bones: + if bone.name in pre_res: + childlist = [] + for childbone in armature.edit_bones[bone.name].children: + if childbone.name not in pre_res: # Adds only non-main body bones, avoids like forearm or knee etc + childlist.append(childbone.name) + if childlist: # If list isn't empty, add it to dict + wtf = bone.name + savethechildren[wtf] = childlist + + + ## Duplicates the physics bones + bpy.ops.object.mode_set(mode='EDIT') + bpy.ops.armature.select_all(action='DESELECT') + bones = armature.edit_bones[:] + for bone in bones: + if bone.name not in pre_res: + #this is a physics bone, so duplicate it. + bone.select = True + bone.select_tail = True + bone.select_head = True + + bpy.ops.armature.separate() + # Generates rigify rig and renames it to 'rigify' + bpy.ops.pose.rigify_generate() + bpy.data.objects[obj.name].name = "rigify" + bpy.context.view_layer.objects.active = bpy.data.objects[armature.name + ".001"] + + + for o in bpy.data.objects: + # Check for given object names + if o.name in ("rigify", armature.name): + o.select_set(True) + + # THEN REATTACH PHYSICS + + bpy.ops.object.mode_set(mode='OBJECT') + ### BLENDER ARE U GOOD LMAO WTF IS THIS (this joins two objects together) + newrig = armature.name + ".001" ## New temporary armature with the physics bones. Hopefully you didnt touch any names lmao + + ## Why's the list for selected objects ordered alphabetically instead of by selection order + objList = bpy.context.selected_objects + unselected = [obj for obj in objList if obj != context.active_object] + rigifyr = unselected[0] ## Rigified Rig + + obs = [bpy.data.objects.get("rigify"), bpy.data.objects.get(newrig)] + c={} + c["object"] = c["active_object"] = bpy.data.objects.get("rigify") + c["selected_objects"] = c["selected_editable_objects"] = obs + bpy.ops.object.mode_set(mode='OBJECT') + bpy.ops.object.select_all(action='DESELECT') + + with bpy.context.temp_override(active_object=bpy.data.objects.get("rigify"), selected_editable_objects=obs): + bpy.ops.object.join() + + + bpy.context.view_layer.objects.active = bpy.data.objects["rigify"] + + setup_neck_and_head_follow(neck_follow_value=1.0, head_follow_value=1.0) + setup_finger_scale_controls_on_x_axis_to_curl_just_the_fingertips(rigifyr) + + bpy.ops.object.mode_set(mode='EDIT') + + #### whats this for??? + #oh i think it's useless now bc there's only one rig LMAOLMAO + #for bone in bones_list: + # armature.edit_bones[bone.name].roll = rigifyr.data.edit_bones[bone.name].roll + #### + + ## Reattach the physics bones to their parents + #Go back into rigify, find the main body bones, and reattach every bone in the corresponding dict list + for mainbone in savethechildren: + for childbone in savethechildren[mainbone]: + rigifyr.data.edit_bones[childbone].parent = rigifyr.data.edit_bones[mainbone] + + print("donelol\n") + bpy.ops.object.mode_set(mode='OBJECT') + bpy.data.objects["rigify"].show_in_front = True + + # Symmetrize clothes/hair bones + bpy.ops.object.mode_set(mode='EDIT') + for bone in rigifyr.data.edit_bones: + if " L " in bone.name: # Finds clothes/hair bones with symmetrical bones + y = bone.name.find(' L ') # Finds index of "Hair L 1" + orgname = bone.name + try: + oppbone = orgname[:y] + " R " + orgname[y+3:] # oppbone = "Hair R 1" + bone.name = orgname[:y] + orgname[y+3:] + ".L" #Rename bones to "Hair 1.L/R" so Blender + rigifyr.data.edit_bones[oppbone].name = orgname[:y] + orgname[y+3:] + ".R" # goes ":o symmetry" + except: + pass + + rigifyr.pose.bones["upper_arm_parent.L"]["pole_parent"] = 2 + rigifyr.pose.bones["upper_arm_parent.R"]["pole_parent"] = 2 + rigifyr.pose.bones["thigh_parent.L"]["pole_parent"] = 2 + rigifyr.pose.bones["thigh_parent.R"]["pole_parent"] = 2 + + bpy.ops.object.mode_set(mode='OBJECT') + #change active object to rigifyr + + bpy.context.view_layer.objects.active = bpy.data.objects["rigify"] + + bpy.ops.object.mode_set(mode='OBJECT') + + # This part puts all the main bones I use into the secoond bone layer + listofbones = ["root", "foot_heel_ik.R", "foot_heel_ik.L", "toe_ik.R", "toe_ik.L", "foot_ik.R", "foot_ik.L", "thigh_ik_target.R", "thigh_ik_target.L", "hips", "torso", "chest", "neck", "head", "shoulder.L", "shoulder.R", "upper_arm_fk.L", "upper_arm_fk.R", "forearm_fk.L", "forearm_fk.R", "hand_fk.L", "hand_fk.R", "upper_arm_ik_target.L", "upper_arm_ik_target.R", "hand_ik.R", "hand_ik.L", ] + + if not toe_bones_exist: + listofbones.remove("toe_ik.R") + listofbones.remove("toe_ik.L") + + if not is_version_4: + for bone in listofbones: + bpy.context.active_object.pose.bones[bone].bone.layers[1] = True + + try: + bpy.data.objects["EyeStar"].hide_viewport = False + except: + pass + + x = original_name.split("_") + char_name = x[-1] + bpy.data.objects["rigify"].name = char_name + "Rig" + + bpy.ops.object.mode_set(mode='POSE') + bpy.ops.pose.select_all(action='DESELECT') + bones_list = obj.pose.bones + + # Creates selection sets for FK arms + shoulders, hair bones, and clothes bones. Selection Sets is an addon that comes with Blender. + try: + bpy.ops.object.mode_set(mode='POSE') + + arms = ['upper_arm_fk', 'forearm_fk', 'hand_fk', 'shoulder'] + bpy.ops.pose.select_all(action='DESELECT') + for side in ['.L', '.R']: + for bone in arms: + bonename = bone + side + rigifyr.pose.bones[bonename].bone.select= True + bpy.ops.pose.selection_set_add() + bpy.ops.pose.selection_set_assign() + bpy.ops.pose.select_all(action='DESELECT') + + ## Hair + for bone in bones_list: + if "Hair" in bone.name: + rigifyr.pose.bones[bone.name].bone.select = True + bpy.ops.pose.selection_set_add() + bpy.ops.pose.selection_set_assign() + bpy.ops.pose.select_all(action='DESELECT') + + ## Clothes + for bone in bones_list: + if "Amice" in bone.name or ("fk" not in bone.name and "tweak" not in bone.name and "Twist" not in bone.name and "Hair" not in bone.name and (bone.name[-1].isdigit() or bone.name[-3].isdigit())): + rigifyr.pose.bones[bone.name].bone.select = True + bpy.ops.pose.selection_set_add() + bpy.ops.pose.selection_set_assign() + bpy.ops.pose.select_all(action='DESELECT') + bpy.context.object.selection_sets[0].name = "FK Arms" + bpy.context.object.selection_sets[1].name = "Hair" + bpy.context.object.selection_sets[2].name = "Clothes...and teeth and eyes lmao" + except: + pass + + # Fix scaling for finger tips. + rig = bpy.context.object + + for oDrv in rig.animation_data.drivers: + for variable in oDrv.driver.variables: + for target in variable.targets: + if ".03" in oDrv.data_path and target.data_path[-7:] == "scale.y": + target.data_path = target.data_path[:-1] + "x" + + fingerlist = ["thumb.01_master", "f_index.01_master", "f_middle.01_master", "f_ring.01_master", "f_pinky.01_master"] + + for side in [".L", ".R"]: + for bone in fingerlist: + rig.pose.bones[bone + side].lock_scale[0] = False + + # Fix face shading being offset 90 degrees + bpy.ops.object.mode_set(mode='OBJECT') + try: + head_driver_obj = bpy.data.objects.get("Head Driver") or bpy.data.objects.get("Head Origin") + bpy.context.view_layer.objects.active = head_driver_obj + bpy.ops.constraint.childof_set_inverse(constraint="Child Of", owner='OBJECT') + except: + pass + + # POST RIGIFY SCRIPT EXECUTION -----------------> + + # Hide metarig (I think you can actually delete it instead?) + bpy.data.objects["metarig"].hide_select = True + bpy.data.objects["metarig"].hide_viewport = True + bpy.data.objects["metarig"].hide_render = True + + # Moves specified param and it's children into the collection + def move_into_collection(object,collection): + + # Get object + this_obj = bpy.context.scene.objects.get(object) + # Get existing collection or make new one + this_coll = bpy.data.collections.get(collection) + if not this_coll: + this_coll = bpy.data.collections.new(collection) + bpy.context.scene.collection.children.link(this_coll) + + # Move object into collection + if this_obj: + # Unlink it from all previous collections before moving it to new one + for coll in this_obj.users_collection: + coll.objects.unlink(this_obj) + + # Move it to our specified collection (This only does the parent obj) + this_coll.objects.link(this_obj) + + # Now we move the children of this object + for child_obj in this_obj.children: + # Same thing, unlink previous collections + for coll in child_obj.users_collection: + coll.objects.unlink(child_obj) + this_coll.objects.link(child_obj) + + # Move the rig into the char name's collection + move_into_collection(char_name+"Rig",char_name) + + # Let's make a new wgt collection inside the char coll. + char_coll = bpy.data.collections.get(char_name) + wgt_coll = bpy.data.collections.new("wgt") + char_coll.children.link(wgt_coll) + + # Rename our WGT collection and put the metarig into it. + for coll in bpy.data.collections: + if coll.name.startswith("WGTS"): + coll.name = "WG" + + move_into_collection("metarig","wgt") + + # Unlink all inner objects from the old WGT collection. We want them inside the new one. + for obj in bpy.data.objects: + if obj.name.startswith("WGT"): + for coll in obj.users_collection: + coll.objects.unlink(obj) + + wgt_coll.objects.link(obj) + + # Remove old unused wgt collection + bpy.data.collections.remove(bpy.data.collections.get("WG")) + + # Obfuscate light driving stuff not needed, keep the main light. + move_into_collection("Face Light Direction","wgt") + move_into_collection("Head Driver",char_name) + move_into_collection("Main Light Direction",char_name) + + # V3 Shader Support - New empty names + move_into_collection("Head Origin",char_name) + move_into_collection("Light Direction",char_name) + + bpy.data.collections["wgt"].hide_select = True + bpy.data.collections["wgt"].hide_viewport = True + bpy.data.collections["wgt"].hide_render = True + + head_driver_obj = bpy.data.objects.get("Head Driver") or bpy.data.objects.get("Head Origin") + if head_driver_obj: + head_driver_obj.hide_select = True + head_driver_obj.hide_viewport = True + head_driver_obj.hide_render = True + + head_forward_obj = bpy.data.objects.get("Head Forward") + head_forward_obj.hide_select = True + head_forward_obj.hide_viewport = True + head_forward_obj.hide_render = True + + head_up_obj = bpy.data.objects.get("Head Up") + head_up_obj.hide_select = True + head_up_obj.hide_viewport = True + head_up_obj.hide_render = True + + # If it exists, gets rid of the default collection. + camera_coll = bpy.data.collections.get("Collection") + if camera_coll: + bpy.data.collections.remove(camera_coll,do_unlink=True) + + # Let's 'exclude' that wgt collection: https://blenderartists.org/t/disable-exlude-from-view-layer-in-collection/1324744 + def recurLayerCollection(layerColl): + found = None + if (layerColl.name == "wgt"): + return layerColl + for layer in layerColl.children: + found = recurLayerCollection(layer) + if found: + return found + layer_collection = bpy.context.view_layer.layer_collection + layerColl = recurLayerCollection(layer_collection) + bpy.context.view_layer.active_layer_collection = layerColl + + layerColl.exclude = True + + # Make our lives easier, display the bones as sticks and make sure we can view from front. + bpy.data.armatures[original_name].display_type = 'STICK' + bpy.data.objects[char_name+"Rig"].show_in_front = True + + # Going into pose mode with our character selected. + bpy.ops.object.select_all(action='DESELECT') + our_char = bpy.data.objects.get(char_name+"Rig") + if our_char: + our_char.select_set(True) + bpy.context.view_layer.objects.active = our_char + + bpy.ops.object.mode_set(mode='POSE') + + # Function to automatically move a bone (if it exists) to the specified bone layer. pass in num+1 than layer desired. + def move_bone(bone_name,to_layers): + armature = bpy.context.active_object + armature_data = armature.data + + if bone_name in armature_data.bones: + bone = armature_data.bones[bone_name] + + for i in range(32): + bone.layers[i] = False + + to_layers = [to_layers] if isinstance(to_layers, int) else to_layers + + for layer in to_layers: + bone.layers[layer] = True + print("enabling layer: " + str(layer) + " for " + bone_name) + + + + if not is_version_4: + # Put away every other bone to the physics layer (22) + for bone in bpy.context.active_object.data.bones: + if bone.layers[0]: # Check if the bone is on layer face + move_bone(bone.name, 25) # Move the bone to layer 23 + + # Let's append our root_shape custom bones + path_to_file = file_path + "/Collection" + + # Bring in our collections: root shapes, face rig, and the eye rig + bpy.ops.wm.append(filename='append_Face Plate', directory=path_to_file) + + bpy.ops.wm.append(filename='append_Root', directory=path_to_file) + + bpy.ops.wm.append(filename='append_Eyes', directory=path_to_file) + + bpy.ops.wm.append(filename='append_Pelvis', directory=path_to_file) + + bpy.ops.wm.append(filename='append_Foot', directory=path_to_file) + + bpy.ops.wm.append(filename='append_Hand', directory=path_to_file) + + bpy.ops.wm.append(filename='append_Props', directory=path_to_file) + + this_obj = None + for obj in bpy.data.objects: + if "Rig" in obj.name: + this_obj = obj + + this_obj.pose.bones["root"].custom_shape = bpy.data.objects["root plate.002"] + this_obj.pose.bones["root"].use_custom_shape_bone_size = False + + this_obj.pose.bones["head"].custom_shape_scale_xyz = (1.65,1.65,1.65) + this_obj.pose.bones["head"].custom_shape = bpy.data.objects["neck"] + this_obj.pose.bones["head"].custom_shape_translation = (0.0,0.255,0.0) + this_obj.pose.bones["head"].custom_shape_rotation_euler[0] = 1.5708 + this_obj.pose.bones["head"].use_custom_shape_bone_size = False + + this_obj.pose.bones["neck"].use_custom_shape_bone_size = False + this_obj.pose.bones["neck"].custom_shape = bpy.data.objects["neck"] + this_obj.pose.bones["neck"].custom_shape_scale_xyz = (1,1,1) + this_obj.pose.bones["neck"].custom_shape_translation = (0.0,0.035,0.007) + this_obj.pose.bones["neck"].custom_shape_rotation_euler[0] = 1.5708 + + this_obj.pose.bones["foot_ik.L"].use_custom_shape_bone_size = False + this_obj.pose.bones["foot_ik.R"].use_custom_shape_bone_size = False + this_obj.pose.bones["foot_ik.L"].custom_shape = bpy.data.objects["foot1"] + this_obj.pose.bones["foot_ik.R"].custom_shape = bpy.data.objects["foot1"] + + this_obj.pose.bones["thigh_ik_target.L"].custom_shape = bpy.data.objects["primo-joint"] + this_obj.pose.bones["thigh_ik_target.R"].custom_shape = bpy.data.objects["primo-joint"] + this_obj.pose.bones["upper_arm_ik_target.R"].custom_shape = bpy.data.objects["primo-joint"] + this_obj.pose.bones["upper_arm_ik_target.L"].custom_shape = bpy.data.objects["primo-joint"] + + this_obj.pose.bones["thigh_ik_target.L"].custom_shape_scale_xyz[0] = 0.75 + this_obj.pose.bones["thigh_ik_target.L"].custom_shape_scale_xyz[1] = 0.75 + this_obj.pose.bones["thigh_ik_target.L"].custom_shape_scale_xyz[2] = 0.75 + this_obj.pose.bones["thigh_ik_target.R"].custom_shape_scale_xyz[0] = 0.75 + this_obj.pose.bones["thigh_ik_target.R"].custom_shape_scale_xyz[1] = 0.75 + this_obj.pose.bones["thigh_ik_target.R"].custom_shape_scale_xyz[2] = 0.75 + + this_obj.pose.bones["torso"].custom_shape = bpy.data.objects["pelvis2"] + this_obj.pose.bones["torso"].use_custom_shape_bone_size = False + + this_obj.pose.bones["hips"].custom_shape = bpy.data.objects["hips"] + this_obj.pose.bones["hips"].custom_shape_scale_xyz = (1,1,1) + this_obj.pose.bones["hips"].custom_shape_translation = (0.0,-0.04,0.044) + this_obj.pose.bones["hips"].custom_shape_rotation_euler[0] = 1.309 + this_obj.pose.bones["hips"].use_custom_shape_bone_size = False + + this_obj.pose.bones["chest"].custom_shape = bpy.data.objects["chest"] + this_obj.pose.bones["chest"].custom_shape_scale_xyz = (0.6,0.6,0.6) + this_obj.pose.bones["chest"].custom_shape_translation = (0.0,0.18,0.0) + this_obj.pose.bones["chest"].custom_shape_rotation_euler[0] = 1.5708 + this_obj.pose.bones["chest"].use_custom_shape_bone_size = False + + this_obj.pose.bones["shoulder.L"].custom_shape_scale_xyz = (1.6,1.6,1.6) + this_obj.pose.bones["shoulder.R"].custom_shape_scale_xyz = (1.6,1.6,1.6) + + this_obj.pose.bones["foot_heel_ik.L"].custom_shape_translation = (0.0,0.06,0.0) + this_obj.pose.bones["foot_heel_ik.R"].custom_shape_translation = (0.0,0.06,0.0) + + this_obj.pose.bones["foot_spin_ik.R"].custom_shape_translation = (0.0,-0.05,0.02) + this_obj.pose.bones["foot_spin_ik.L"].custom_shape_translation = (0.0,-0.05,0.02) + + this_obj.pose.bones["toe_ik.L"].custom_shape_translation = (0.0,0.06,0.00) + this_obj.pose.bones["toe_ik.R"].custom_shape_translation = (0.0,0.06,0.00) + this_obj.pose.bones["toe_ik.L"].custom_shape_scale_xyz = (0.781,0.781,0.350) + this_obj.pose.bones["toe_ik.R"].custom_shape_scale_xyz = (0.781,0.781,0.350) + + this_obj.pose.bones["hand_ik.R"].use_custom_shape_bone_size = False + this_obj.pose.bones["hand_ik.R"].custom_shape = bpy.data.objects["wrist"] + + this_obj.pose.bones["hand_ik.L"].use_custom_shape_bone_size = False + this_obj.pose.bones["hand_ik.L"].custom_shape = bpy.data.objects["wrist"] + + this_obj.pose.bones["palm.L"].custom_shape_scale_xyz = (1.2,1.2,1.2) + this_obj.pose.bones["palm.R"].custom_shape_scale_xyz = (1.2,1.2,1.2) + + + # Merge the armatures; go into object mode and make sure nothing is selected + bpy.ops.object.mode_set(mode='OBJECT') + bpy.ops.object.select_all(action='DESELECT') + + # Select custom face armature + face_rig_obj = bpy.data.objects.get("facerig") + if face_rig_obj: + face_rig_obj.select_set(True) + + # Select eye rig + eye_rig_obj = bpy.data.objects.get("eyerig") + if eye_rig_obj: + eye_rig_obj.select_set(True) + + # Select root rig + root_rig_obj = bpy.data.objects.get("rootrig") + if root_rig_obj: + root_rig_obj.select_set(True) + + # Select pelvis rig + pelvis_rig_obj = bpy.data.objects.get("pelvisrig") + if pelvis_rig_obj: + pelvis_rig_obj.select_set(True) + + # Select foot L rig + foot_l_rig_obj = bpy.data.objects.get("footrig-L") + if foot_l_rig_obj: + foot_l_rig_obj.select_set(True) + + # Select foot R rig + foot_r_rig_obj = bpy.data.objects.get("footrig-R") + if foot_r_rig_obj: + foot_r_rig_obj.select_set(True) + + # Select hand R rig + hand_r_rig_obj = bpy.data.objects.get("handrig-R") + if hand_r_rig_obj: + hand_r_rig_obj.select_set(True) + + # Select hand L rig + hand_l_rig_obj = bpy.data.objects.get("handrig-L") + if hand_l_rig_obj: + hand_l_rig_obj.select_set(True) + + # Select prop rig + prop_rig_obj = bpy.data.objects.get("prop-rig") + if prop_rig_obj: + prop_rig_obj.select_set(True) + + # Select char armature + if our_char: + our_char.select_set(True) + + # Join them + bpy.ops.object.join() + + # We want to save all the VG names here, perhaps we can use them to identify weighted def bones. + bpy.context.view_layer.objects.active = bpy.data.objects.get("Body") + vertex_groups_list = [vg.name for vg in bpy.context.object.vertex_groups] + bpy.context.view_layer.objects.active = head_bone_arm_target + + # Get the intersection point of a line with a perpendicular plane + def project_line_in_space(points1, points2, axis): + x1, y1, z1 = points1 + x2, y2, z2 = points2 + + m = (y2 - y1) / (x2 - x1) if (x2 - x1) != 0 else None + b = y1 - m * x1 if m is not None else None + + if m is None: + return None + + # Intersection point + intersection_x = axis + intersection_y = m * intersection_x + b + intersection_z = z1 + (intersection_y - y1) * (z2 - z1) / (y2 - y1) + + intersection_point = (intersection_x, intersection_y, intersection_z) + return intersection_point + + # Select the object then access it's rig (its obj data) + ob = bpy.data.objects[char_name+"Rig"] + armature = ob.data + + # In edit mode, select platebone and head controller and set their parent bones. + bpy.ops.object.mode_set(mode='EDIT') + armature.edit_bones['plate-border'].parent = armature.edit_bones['head'] + armature.edit_bones['plate-settings'].parent = armature.edit_bones['head'] + + armature.edit_bones['plate-border'].head = armature.edit_bones['neck'].head.copy() + armature.edit_bones['plate-border'].tail = armature.edit_bones['neck'].tail.copy() + armature.edit_bones['plate-border'].head.x = 0.33 + armature.edit_bones['plate-border'].head.y = 0 + armature.edit_bones['plate-border'].tail.y = 0 + armature.edit_bones['plate-border'].tail.x = 0.33 + + armature.edit_bones['plate-settings'].head = armature.edit_bones['head'].head.copy() + armature.edit_bones['plate-settings'].tail = armature.edit_bones['head'].head.copy() + armature.edit_bones['plate-settings'].head.y = 0 + armature.edit_bones['plate-settings'].tail.y = 0 + armature.edit_bones['plate-settings'].head.z += 0.5 + armature.edit_bones['plate-settings'].tail.z += 0.6 + + # While here, set inherit scales as needed. + armature.edit_bones['upper_arm_parent.L'].inherit_scale="NONE" + armature.edit_bones['upper_arm_parent.R'].inherit_scale="NONE" + armature.edit_bones['thigh_parent.L'].inherit_scale="NONE" + armature.edit_bones['thigh_parent.R'].inherit_scale="NONE" + armature.edit_bones['torso-outer'].inherit_scale="AVERAGE" + armature.edit_bones['torso-inner'].inherit_scale="FULL" + armature.edit_bones['torso'].inherit_scale="FULL" + # fix the bad rolls of the torso bone + armature.edit_bones['torso'].roll = 0 + armature.edit_bones['torso-inner'].roll = 0 + armature.edit_bones['torso-outer'].roll = 0 + + armature.edit_bones['forearm_tweak-pin.R'].inherit_scale="AVERAGE" + armature.edit_bones['forearm_tweak-pin.L'].inherit_scale="AVERAGE" + armature.edit_bones['shin_tweak-pin.L'].inherit_scale="AVERAGE" + armature.edit_bones['shin_tweak-pin.R'].inherit_scale="AVERAGE" + armature.edit_bones['hand-ik-L'].inherit_scale="AVERAGE" + armature.edit_bones['hand-ik-R'].inherit_scale="AVERAGE" + armature.edit_bones['hand_ik.L'].inherit_scale="FULL" + armature.edit_bones['hand_ik.R'].inherit_scale="FULL" + + # Fixing Foot spin bone pos for chars with generated feet bones. + if not toe_bones_exist: + armature.edit_bones['foot_spin_ik.L'].head.z = 0 + armature.edit_bones['foot_spin_ik.L'].tail.z = 0 + + armature.edit_bones['foot_spin_ik.R'].head.z = 0 + armature.edit_bones['foot_spin_ik.R'].tail.z = 0 + + # SET RELATIONSHIPS as needed after bringing in new bones + armature.edit_bones['root'].parent = armature.edit_bones['root-inner'] + + armature.edit_bones['torso-outer'].parent = armature.edit_bones['MCH-torso.parent'] + armature.edit_bones['torso'].parent = armature.edit_bones['torso-inner'] + armature.edit_bones['torso_pivot.002'].parent = armature.edit_bones['torso'] + armature.edit_bones['hips'].parent = armature.edit_bones['MCH-torso_pivot.002'] + armature.edit_bones['chest'].parent = armature.edit_bones['MCH-torso_pivot.002'] + armature.edit_bones['MCH-spine.001'].parent = armature.edit_bones['MCH-torso_pivot.002'] + armature.edit_bones['MCH-spine.002'].parent = armature.edit_bones['MCH-torso_pivot.002'] + + armature.edit_bones['ik-pivot-L'].parent = armature.edit_bones['foot_ik.L'] + armature.edit_bones['ik-pivot-R'].parent = armature.edit_bones['foot_ik.R'] + armature.edit_bones['foot_spin_ik.L'].parent = armature.edit_bones['ik-target-L'] + armature.edit_bones['foot_spin_ik.R'].parent = armature.edit_bones['ik-target-R'] + + armature.edit_bones['hand-ik-L'].parent = armature.edit_bones['MCH-hand_ik.parent.L'] + armature.edit_bones['hand-ik-R'].parent = armature.edit_bones['MCH-hand_ik.parent.R'] + armature.edit_bones['hand_ik.L'].parent = armature.edit_bones['mch-hand-ik-pivot-L'] + armature.edit_bones['hand_ik.R'].parent = armature.edit_bones['mch-hand-ik-pivot-R'] + armature.edit_bones['mch-hand-ik-wrist-L'].parent = armature.edit_bones['hand_ik.L'] + armature.edit_bones['mch-hand-ik-wrist-R'].parent = armature.edit_bones['hand_ik.R'] + armature.edit_bones['MCH-upper_arm_ik_target.L'].parent = armature.edit_bones['mch-hand-ik-wrist-L'] + armature.edit_bones['MCH-upper_arm_ik_target.R'].parent = armature.edit_bones['mch-hand-ik-wrist-R'] + + armature.edit_bones['shoulder_driver.L'].parent = armature.edit_bones['ORG-spine.003'] + armature.edit_bones['shoulder_driver.R'].parent = armature.edit_bones['ORG-spine.003'] + armature.edit_bones['MCH-shoulder_follow.L'].parent = armature.edit_bones['ORG-spine.003'] + armature.edit_bones['MCH-shoulder_follow.R'].parent = armature.edit_bones['ORG-spine.003'] + armature.edit_bones['shoulder.L'].parent = armature.edit_bones['MCH-shoulder_follow.L'] + armature.edit_bones['shoulder.R'].parent = armature.edit_bones['MCH-shoulder_follow.R'] + + # RENAME imported bones + rename_bones_list = [("root", "root.002")] + rename_bones_list.append(("root-inner", "root.001")) + rename_bones_list.append(("root-outer", "root")) + + rename_bones_list.append(("torso", "torso.002")) + rename_bones_list.append(("torso-inner", "torso.001")) + rename_bones_list.append(("torso-outer", "torso")) + + rename_bones_list.append(("ik-pivot-L", "foot_ik_pivot.L")) + rename_bones_list.append(("mch-ik-pivot-L", "MCH-foot_ik_pivot.L")) + rename_bones_list.append(("ik-sub-pivot-L", "foot_ik_sub.L")) + rename_bones_list.append(("ik-target-L", "MCH-thigh_ik_target_sub.L")) + + rename_bones_list.append(("ik-pivot-R", "foot_ik_pivot.R")) + rename_bones_list.append(("mch-ik-pivot-R", "MCH-foot_ik_pivot.R")) + rename_bones_list.append(("ik-sub-pivot-R", "foot_ik_sub.R")) + rename_bones_list.append(("ik-target-R", "MCH-thigh_ik_target_sub.R")) + + rename_bones_list.append(("hand_ik.L", "hand_ik_wrist.L")) + rename_bones_list.append(("hand-ik-L", "hand_ik.L")) + rename_bones_list.append(("hand-ik-pivot-L", "hand_ik_pivot.L")) + rename_bones_list.append(("mch-hand-ik-pivot-L", "MCH-hand_ik_pivot.L")) + rename_bones_list.append(("mch-hand-ik-wrist-L", "MCH-hand_ik_wrist.L")) + + rename_bones_list.append(("hand_ik.R", "hand_ik_wrist.R")) + rename_bones_list.append(("hand-ik-R", "hand_ik.R")) + rename_bones_list.append(("hand-ik-pivot-R", "hand_ik_pivot.R")) + rename_bones_list.append(("mch-hand-ik-pivot-R", "MCH-hand_ik_pivot.R")) + rename_bones_list.append(("mch-hand-ik-wrist-R", "MCH-hand_ik_wrist.R")) + + + # TORSO POS fixing + # armature.edit_bones['torso'].roll = -1.5708 + torso_head_pos = armature.edit_bones['torso'].head.copy() + torso_tail_pos = armature.edit_bones['torso'].tail.copy() + + armature.edit_bones['torso-inner'].head = torso_head_pos + armature.edit_bones['torso-inner'].tail = torso_tail_pos + armature.edit_bones['torso-inner'].tail.y += 0.05 + + armature.edit_bones['torso-outer'].head = torso_head_pos + armature.edit_bones['torso-outer'].tail = torso_tail_pos + armature.edit_bones['torso-outer'].tail.y += 0.1 + + armature.edit_bones['torso_pivot.002'].head = torso_head_pos + armature.edit_bones['torso_pivot.002'].tail = torso_tail_pos + + armature.edit_bones['MCH-torso_pivot.002'].head = torso_head_pos + armature.edit_bones['MCH-torso_pivot.002'].tail = torso_tail_pos + armature.edit_bones['MCH-torso_pivot.002'].length -= 0.09 + + # FOOT POS fixing: Remember to use old bone names pre renaming + foot_L_z_diff = armature.edit_bones['foot_ik.L'].tail.z - armature.edit_bones['foot_spin_ik.L'].tail.z + foot_R_z_diff = armature.edit_bones['foot_ik.R'].tail.z - armature.edit_bones['foot_spin_ik.R'].tail.z + + armature.edit_bones['ik-sub-pivot-L'].head = armature.edit_bones['foot_ik.L'].head.copy() + armature.edit_bones['ik-sub-pivot-L'].tail = armature.edit_bones['foot_ik.L'].tail.copy() + + armature.edit_bones['ik-sub-pivot-R'].head = armature.edit_bones['foot_ik.R'].head.copy() + armature.edit_bones['ik-sub-pivot-R'].tail = armature.edit_bones['foot_ik.R'].tail.copy() + + armature.edit_bones['ik-pivot-L'].head = armature.edit_bones['MCH-heel.02_roll2.L'].head.copy() + armature.edit_bones['ik-pivot-L'].tail = armature.edit_bones['MCH-heel.02_roll2.L'].tail.copy() + armature.edit_bones['ik-pivot-L'].tail.y += 0.05 + + armature.edit_bones['ik-pivot-R'].head = armature.edit_bones['MCH-heel.02_roll2.R'].head.copy() + armature.edit_bones['ik-pivot-R'].tail = armature.edit_bones['MCH-heel.02_roll2.R'].tail.copy() + armature.edit_bones['ik-pivot-R'].tail.y += 0.05 + + armature.edit_bones['mch-ik-pivot-L'].head = armature.edit_bones['MCH-heel.02_roll2.L'].head.copy() + armature.edit_bones['mch-ik-pivot-L'].tail = armature.edit_bones['MCH-heel.02_roll2.L'].tail.copy() + + armature.edit_bones['mch-ik-pivot-R'].head = armature.edit_bones['MCH-heel.02_roll2.R'].head.copy() + armature.edit_bones['mch-ik-pivot-R'].tail = armature.edit_bones['MCH-heel.02_roll2.R'].tail.copy() + + armature.edit_bones['ik-target-L'].head = armature.edit_bones['foot_tweak.L'].head.copy() + armature.edit_bones['ik-target-L'].tail = armature.edit_bones['foot_tweak.L'].tail.copy() + + armature.edit_bones['ik-target-R'].head = armature.edit_bones['foot_tweak.R'].head.copy() + armature.edit_bones['ik-target-R'].tail = armature.edit_bones['foot_tweak.R'].tail.copy() + + foot_L_x_diff = armature.edit_bones['ik-sub-pivot-L'].tail.x - armature.edit_bones['foot_spin_ik.L'].tail.x + foot_R_x_diff = armature.edit_bones['ik-sub-pivot-R'].tail.x - armature.edit_bones['foot_spin_ik.R'].tail.x + + armature.edit_bones['MCH-shin_tweak-pin.parent.R'].head = armature.edit_bones['MCH-shin_ik.L'].head.copy() + armature.edit_bones['MCH-shin_tweak-pin.parent.R'].tail.z = armature.edit_bones['MCH-shin_ik.L'].tail.z + armature.edit_bones['MCH-shin_tweak-pin.parent.R'].tail.x = armature.edit_bones['MCH-shin_ik.L'].tail.x + armature.edit_bones['MCH-shin_tweak-pin.parent.R'].roll = 0 + armature.edit_bones['MCH-shin_tweak-pin.parent.R'].length = .02 + + armature.edit_bones['shin_tweak-pin.L'].head = armature.edit_bones['MCH-shin_ik.L'].head.copy() + armature.edit_bones['shin_tweak-pin.L'].tail = armature.edit_bones['MCH-shin_ik.L'].tail.copy() + armature.edit_bones['shin_tweak-pin.L'].roll = armature.edit_bones['MCH-shin_ik.L'].roll + armature.edit_bones['shin_tweak-pin.L'].length -= 0.15 + + armature.edit_bones['MCH-shin_tweak-pin.parent.R'].head = armature.edit_bones['MCH-shin_ik.R'].head.copy() + armature.edit_bones['MCH-shin_tweak-pin.parent.R'].tail.z = armature.edit_bones['MCH-shin_ik.R'].tail.z + armature.edit_bones['MCH-shin_tweak-pin.parent.R'].tail.x = armature.edit_bones['MCH-shin_ik.R'].tail.x + armature.edit_bones['MCH-shin_tweak-pin.parent.R'].roll = 0 + armature.edit_bones['MCH-shin_tweak-pin.parent.R'].length = .02 + + armature.edit_bones['shin_tweak-pin.R'].head = armature.edit_bones['MCH-shin_ik.R'].head.copy() + armature.edit_bones['shin_tweak-pin.R'].tail = armature.edit_bones['MCH-shin_ik.R'].tail.copy() + armature.edit_bones['shin_tweak-pin.R'].roll = armature.edit_bones['MCH-shin_ik.R'].roll + armature.edit_bones['shin_tweak-pin.R'].length -= 0.15 + + # HAND POS Fixing + armature.edit_bones['hand-ik-L'].head = armature.edit_bones['hand_ik.L'].head.copy() + armature.edit_bones['hand-ik-L'].tail = armature.edit_bones['hand_ik.L'].tail.copy() + armature.edit_bones['hand-ik-L'].roll = armature.edit_bones['hand_ik.L'].roll + + armature.edit_bones['hand-ik-pivot-L'].head = armature.edit_bones['hand_ik.L'].head.copy() + armature.edit_bones['hand-ik-pivot-L'].tail = armature.edit_bones['hand_ik.L'].tail.copy() + armature.edit_bones['hand-ik-pivot-L'].roll = armature.edit_bones['hand_ik.L'].roll + + armature.edit_bones['mch-hand-ik-pivot-L'].head = armature.edit_bones['hand_ik.L'].head.copy() + armature.edit_bones['mch-hand-ik-pivot-L'].tail = armature.edit_bones['hand_ik.L'].tail.copy() + armature.edit_bones['mch-hand-ik-pivot-L'].roll = armature.edit_bones['hand_ik.L'].roll + armature.edit_bones['mch-hand-ik-pivot-L'].length -= 0.03 + + armature.edit_bones['mch-hand-ik-wrist-L'].head = armature.edit_bones['hand_ik.L'].head.copy() + armature.edit_bones['mch-hand-ik-wrist-L'].tail = armature.edit_bones['hand_ik.L'].tail.copy() + armature.edit_bones['mch-hand-ik-wrist-L'].roll = armature.edit_bones['hand_ik.L'].roll + armature.edit_bones['mch-hand-ik-wrist-L'].length -= 0.04 + + armature.edit_bones['hand-ik-R'].head = armature.edit_bones['hand_ik.R'].head.copy() + armature.edit_bones['hand-ik-R'].tail = armature.edit_bones['hand_ik.R'].tail.copy() + armature.edit_bones['hand-ik-R'].roll = armature.edit_bones['hand_ik.R'].roll + + armature.edit_bones['hand-ik-pivot-R'].head = armature.edit_bones['hand_ik.R'].head.copy() + armature.edit_bones['hand-ik-pivot-R'].tail = armature.edit_bones['hand_ik.R'].tail.copy() + armature.edit_bones['hand-ik-pivot-R'].roll = armature.edit_bones['hand_ik.R'].roll + + armature.edit_bones['mch-hand-ik-pivot-R'].head = armature.edit_bones['hand_ik.R'].head.copy() + armature.edit_bones['mch-hand-ik-pivot-R'].tail = armature.edit_bones['hand_ik.R'].tail.copy() + armature.edit_bones['mch-hand-ik-pivot-R'].roll = armature.edit_bones['hand_ik.R'].roll + armature.edit_bones['mch-hand-ik-pivot-R'].length -= 0.03 + + armature.edit_bones['mch-hand-ik-wrist-R'].head = armature.edit_bones['hand_ik.R'].head.copy() + armature.edit_bones['mch-hand-ik-wrist-R'].tail = armature.edit_bones['hand_ik.R'].tail.copy() + armature.edit_bones['mch-hand-ik-wrist-R'].roll = armature.edit_bones['hand_ik.R'].roll + armature.edit_bones['mch-hand-ik-wrist-R'].length -= 0.04 + + armature.edit_bones['MCH-forearm_tweak-pin.parent.L'].head = armature.edit_bones['MCH-forearm_ik.L'].head.copy() + armature.edit_bones['MCH-forearm_tweak-pin.parent.L'].tail.z = armature.edit_bones['MCH-forearm_ik.L'].tail.z + armature.edit_bones['MCH-forearm_tweak-pin.parent.L'].tail.x = armature.edit_bones['MCH-forearm_ik.L'].tail.x + armature.edit_bones['MCH-forearm_tweak-pin.parent.L'].roll = 0 + armature.edit_bones['MCH-forearm_tweak-pin.parent.L'].length = .02 + + armature.edit_bones['forearm_tweak-pin.L'].head = armature.edit_bones['MCH-forearm_ik.L'].head.copy() + armature.edit_bones['forearm_tweak-pin.L'].tail = armature.edit_bones['MCH-forearm_ik.L'].tail.copy() + armature.edit_bones['forearm_tweak-pin.L'].roll = armature.edit_bones['MCH-forearm_ik.L'].roll + armature.edit_bones['forearm_tweak-pin.L'].length -= 0.15 + + armature.edit_bones['MCH-forearm_tweak-pin.parent.R'].head = armature.edit_bones['MCH-forearm_ik.R'].head.copy() + armature.edit_bones['MCH-forearm_tweak-pin.parent.R'].tail.z = armature.edit_bones['MCH-forearm_ik.R'].tail.z + armature.edit_bones['MCH-forearm_tweak-pin.parent.R'].tail.x = armature.edit_bones['MCH-forearm_ik.R'].tail.x + armature.edit_bones['MCH-forearm_tweak-pin.parent.R'].roll = 0 + armature.edit_bones['MCH-forearm_tweak-pin.parent.R'].length = .02 + + armature.edit_bones['forearm_tweak-pin.R'].head = armature.edit_bones['MCH-forearm_ik.R'].head.copy() + armature.edit_bones['forearm_tweak-pin.R'].tail = armature.edit_bones['MCH-forearm_ik.R'].tail.copy() + armature.edit_bones['forearm_tweak-pin.R'].roll = armature.edit_bones['MCH-forearm_ik.R'].roll + armature.edit_bones['forearm_tweak-pin.R'].length -= 0.15 + + armature.edit_bones['shoulder_driver.L'].head = project_line_in_space(armature.edit_bones['shoulder.L'].head.copy(),armature.edit_bones['shoulder.L'].tail.copy(), armature.edit_bones['hand_ik.L'].head.x) + armature.edit_bones['shoulder_driver.L'].tail = project_line_in_space(armature.edit_bones['shoulder.L'].head.copy(),armature.edit_bones['shoulder.L'].tail.copy(), armature.edit_bones['hand_ik.L'].head.x) + armature.edit_bones['shoulder_driver.L'].tail.y += 0.1 + + armature.edit_bones['shoulder_driver.R'].head = project_line_in_space(armature.edit_bones['shoulder.R'].head.copy(),armature.edit_bones['shoulder.R'].tail.copy(), armature.edit_bones['hand_ik.R'].head.x) + armature.edit_bones['shoulder_driver.R'].tail = project_line_in_space(armature.edit_bones['shoulder.R'].head.copy(),armature.edit_bones['shoulder.R'].tail.copy(), armature.edit_bones['hand_ik.R'].head.x) + armature.edit_bones['shoulder_driver.R'].tail.y += 0.1 + + armature.edit_bones['MCH-shoulder_follow.L'].head = armature.edit_bones['shoulder.L'].head.copy() + armature.edit_bones['MCH-shoulder_follow.L'].tail = armature.edit_bones['shoulder.L'].tail.copy() + + armature.edit_bones['MCH-shoulder_follow.R'].head = armature.edit_bones['shoulder.R'].head.copy() + armature.edit_bones['MCH-shoulder_follow.R'].tail = armature.edit_bones['shoulder.R'].tail.copy() + + + try: + armature.edit_bones["DEF-eye.L"].name = "+EyeBone L A01" + armature.edit_bones["DEF-eye.R"].name = "+EyeBone R A01" + + # Properly finish the parenting of the eye rig we imported! + armature.edit_bones['eyetrack'].parent = armature.edit_bones['head'] + armature.edit_bones['+EyeBone R A01.001'].parent = armature.edit_bones['head'] + armature.edit_bones['+EyeBone L A01.001'].parent = armature.edit_bones['head'] + + # Now we need to position them to the existing bones. + eye_R_head_pos = armature.edit_bones['+EyeBone R A01'].head + eye_L_head_pos = armature.edit_bones['+EyeBone L A01'].head + + + armature.edit_bones['+EyeBone R A01.001'].head = eye_R_head_pos + armature.edit_bones['+EyeBone R A01.001'].tail.x = eye_R_head_pos[0] + armature.edit_bones['+EyeBone R A01.001'].tail.y = armature.edit_bones['+EyeBone R A01'].tail.y + armature.edit_bones['+EyeBone R A01.001'].tail.z = eye_R_head_pos[2] + + armature.edit_bones['+EyeBone L A01.001'].head = eye_L_head_pos + armature.edit_bones['+EyeBone L A01.001'].tail.x = eye_L_head_pos[0] + armature.edit_bones['+EyeBone L A01.001'].tail.y = armature.edit_bones['+EyeBone L A01'].tail.y + armature.edit_bones['+EyeBone L A01.001'].tail.z = eye_L_head_pos[2] + + armature.edit_bones['eyetrack_R'].head.x = eye_R_head_pos[0] + armature.edit_bones['eyetrack_R'].head.z = eye_R_head_pos[2] + + armature.edit_bones['eyetrack_R'].tail.x = eye_R_head_pos[0] + armature.edit_bones['eyetrack_R'].tail.z = eye_R_head_pos[2] + 0.01 + + armature.edit_bones['eyetrack_L'].head.x = eye_L_head_pos[0] + armature.edit_bones['eyetrack_L'].head.z = eye_L_head_pos[2] + + armature.edit_bones['eyetrack_L'].tail.x = eye_L_head_pos[0] + armature.edit_bones['eyetrack_L'].tail.z = eye_L_head_pos[2] + 0.01 + + armature.edit_bones['eyetrack'].head.x = (eye_R_head_pos[0]+eye_L_head_pos[0])/2 + armature.edit_bones['eyetrack'].head.z = (eye_R_head_pos[2]+eye_L_head_pos[2])/2 + + armature.edit_bones['eyetrack'].tail.x = (eye_R_head_pos[0]+eye_L_head_pos[0])/2 + armature.edit_bones['eyetrack'].tail.z = armature.edit_bones['eyetrack_L'].tail.z + except: + pass + + + # Still in edit mode, select Neck/Head bone and extract the Z loc + neck_bone = armature.edit_bones['neck'] + neck_pos = neck_bone.head[2] + + if(use_head_tracker): + # Let's position our head controller bone here. We need it to match our head bone's position + head_bone = armature.edit_bones['head'] + head_pos_head2 = head_bone.head[2] + head_pos_tail2 = head_bone.tail[2] + head_pos_head1 = head_bone.head[1] + head_pos_tail1 = head_bone.tail[1] + + # Select the head controller bone and position w/ head bone's location. + head_cont_bone = armature.edit_bones['head-controller'] + head_cont_bone.head[0] = 0 + head_cont_bone.head[1] = -0.3 + head_cont_bone.head[2] = head_pos_head2 + head_cont_bone.tail[0] = 0 + head_cont_bone.tail[1] = -0.3 + head_cont_bone.tail[2] = head_pos_tail2 + + # Delete ugly lines that connect to the pole bones. + def del_bone(bone_name): + to_del = armature.edit_bones.get(bone_name) + armature.edit_bones.remove(to_del) + + del_bone("VIS_upper_arm_ik_pole.L") + del_bone("VIS_upper_arm_ik_pole.R") + del_bone("VIS_thigh_ik_pole.L") + del_bone("VIS_thigh_ik_pole.R") + + del_bone("palm.L") + del_bone("palm.R") + + # Function that validates bone name given for respective area. (if bone passes checks to be considered front) + def validate_skirt(bone_name, area): + # Below is the list of bone 'prefix's we consider valid to send into the skirt/dress lists + if bone_name.startswith("+Skirt"): + temp_name = bone_name[6:] + elif bone_name.startswith("+Hem"): + temp_name = bone_name[4:] + elif bone_name.startswith("+Overcoat"): + temp_name = bone_name[9:] + elif bone_name.startswith("+VisionPelvis"): + temp_name = bone_name[13:] + else: return False + + if area == "FRONT": + if temp_name[0] == "F": + return True + + elif area == "SIDE": + if temp_name[0] == "S": + return True + + elif area == "BACK": + if temp_name[0] == "B": + return True + + else: return False + # Certain bones with skirt naming exist with pelvis spine as parent, but theyre NOT skirt bones we want. remove them. + def trunc_bad_bones(pb, current=None): + bad = [] + if current is None: + current = pb + + current_bone = armature.edit_bones[current] + + for bone in armature.edit_bones: + if bone.parent == current_bone: + bad.append(bone.name) + bad.extend(trunc_bad_bones(pb, bone.name)) + + return bad + + list_of_bad_bones = trunc_bad_bones("DEF-spine.003") + + # Functions that loop through skirt bones (Front, Sides, Back) each return a list + def identify_children_for_skirt(pb, current=None, excluded_parent="DEF-spine.003"): + child_bones = [] + if current is None: + current = pb + + current_bone = armature.edit_bones[current] + + for bone in armature.edit_bones: + if bone.parent == excluded_parent: + continue + elif bone.parent == current_bone: + child_bones.append(bone) + child_bones.extend(identify_children_for_skirt(pb, bone.name, excluded_parent)) + + return child_bones + + parent_bone_name = "DEF-spine.001" + weird_skeletons = ["Clorinde"] + for s in weird_skeletons: + if s in char_name: + parent_bone_name = "+PelvisTwist CF A01" + + skirt_children = identify_children_for_skirt(parent_bone_name) + + def scan_skirt(area): + skirt_bones = [] + + for edit_bone in skirt_children: + if edit_bone.name not in list_of_bad_bones: + if validate_skirt(edit_bone.name, area): + skirt_bones.append(edit_bone.name) + + return skirt_bones + + # On each list, straighten the bone (Straighten on the head) + front_skirt_bones = scan_skirt("FRONT") + side_skirt_bones = scan_skirt("SIDE") + back_skirt_bones = scan_skirt("BACK") + + def zero_roll(bone_name): + this_bone = armature.edit_bones[bone_name].roll = 0 + for bone in front_skirt_bones: + zero_roll(bone) + + for bone in side_skirt_bones: + zero_roll(bone) + + for bone in back_skirt_bones: + zero_roll(bone) + # In pose mode select the rig, then select the bone + bpy.ops.object.mode_set(mode='POSE') + faceplate_arm = bpy.context.scene.objects[char_name+"Rig"] + selected_bone = faceplate_arm.pose.bones["Plate"] + + # Change the values to what we want, use neckpos to base the height off the ground. + selected_bone.location[0] = .33 + #selected_bone.location[1] = 0.9 + selected_bone.location[2] = neck_pos + selected_bone.rotation_quaternion[1] = 1 + selected_bone.scale[0] = 0.1 + selected_bone.scale[1] = 0.1 + selected_bone.scale[2] = 0.1 + + + + # Begin moving extra wgt bones to the wgt collection while discarding old collections + # 1 Root and Eye Bones + move_into_collection("eye circle","wgt") + move_into_collection("eye controller","wgt") + move_into_collection("root plate","wgt") + move_into_collection("head-control-shape","wgt") + + # 1 Face Bones + to_del_coll = bpy.data.collections.get("wgt.001") + for obj in to_del_coll.objects: + move_into_collection(obj.name,"wgt") + + # 2 Pelvis Bones + to_del_coll = bpy.data.collections.get("wgt.002") + for obj in to_del_coll.objects: + move_into_collection(obj.name,"wgt") + + # 3 feet Bones + to_del_coll = bpy.data.collections.get("wgt.003") + for obj in to_del_coll.objects: + move_into_collection(obj.name,"wgt") + + # 4 hand Bones + to_del_coll = bpy.data.collections.get("wgt.004") + for obj in to_del_coll.objects: + move_into_collection(obj.name,"wgt") + + # idk bro math is wrong delete whatever this is too + to_del_coll = bpy.data.collections.get("wgt.005") + for obj in to_del_coll.objects: + move_into_collection(obj.name,"wgt") + + to_del_coll = bpy.data.collections.get("wgt.006") + for obj in to_del_coll.objects: + move_into_collection(obj.name,"wgt") + + # After moving into collection, delete the old empty ones. + bpy.data.collections.remove(bpy.data.collections.get("append_Root"),do_unlink=True) + bpy.data.collections.remove(bpy.data.collections.get("append_Face Plate"),do_unlink=True) + bpy.data.collections.remove(bpy.data.collections.get("append_Eyes"),do_unlink=True) + bpy.data.collections.remove(bpy.data.collections.get("append_Pelvis"),do_unlink=True) + bpy.data.collections.remove(bpy.data.collections.get("append_Foot"),do_unlink=True) + bpy.data.collections.remove(bpy.data.collections.get("append_Hand"),do_unlink=True) + bpy.data.collections.remove(bpy.data.collections.get("append_Props"),do_unlink=True) + + # Adding Shape Key Drivers + ourRig = char_name+"Rig" + + # Loop through skirt bones list. + + # converts deg to calc + def rad(num): + return num * (pi/180) + + # Perform more operations on number if needed. + def calc(num, cut=False): + percent = 0.8 + if cut: + return rad(num*percent) + else: return rad(num) + + # For front bones adjust number by depth + def add_const(skirt_bone, name, bone, expression, driver=True, trans_rot="ROT_X", f_min_x=calc(-1), f_max_x = calc(1), f_min_y = 0, f_max_y = 0, f_min_z = 0, f_max_z = 0, map_x='X', map_y='Y', map_z='Z', t_min_x=0, t_max_x=0, t_min_y=0, t_max_y=0, t_min_z=0, t_max_z=0): + armature = bpy.context.scene.objects[ourRig] + + this_bone = bpy.context.scene.objects[char_name+"Rig"].pose.bones[skirt_bone] + co = this_bone.constraints.new('TRANSFORM') + co.name = name + co.target = our_char + co.subtarget = bone + co.use_motion_extrapolate = True + + if driver and name != "X": + influence_driver = co.driver_add("influence").driver + # DRIVER STUFF + var = influence_driver.variables.new() + var.name = "bone" + var.type = 'TRANSFORMS' + + var.targets[0].id = armature + var.targets[0].bone_target = bone + var.targets[0].transform_space = 'LOCAL_SPACE' + var.targets[0].transform_type = trans_rot + + var2 = influence_driver.variables.new() + var2.name = "toggle" + var2.type = "SINGLE_PROP" + + var2.targets[0].id = armature + var2.targets[0].data_path = "pose.bones[\"plate-settings\"][\"Toggle Skirt Constraints\"]" + + influence_driver.type = 'SCRIPTED' + influence_driver.expression = "(" + expression + ")*toggle" + + depsgraph = bpy.context.evaluated_depsgraph_get() + depsgraph.update() + # END DRIVER STUFF + + # drivers for just the sides + elif driver and name == "X": + influence_driver = co.driver_add("influence").driver + # DRIVER STUFF + var2 = influence_driver.variables.new() + var2.name = "toggle" + var2.type = "SINGLE_PROP" + + var2.targets[0].id = armature + var2.targets[0].data_path = "pose.bones[\"plate-settings\"][\"Toggle Skirt Constraints\"]" + + influence_driver.type = 'SCRIPTED' + influence_driver.expression = "toggle" + + depsgraph = bpy.context.evaluated_depsgraph_get() + depsgraph.update() + + co.target_space = "LOCAL" + co.owner_space = "LOCAL" + co.map_from = "ROTATION" + co.map_to = "ROTATION" + + # Do transform constraint math + # MAP FROM (put in t/e block?) + co.from_min_x_rot = f_min_x + co.from_max_x_rot = f_max_x + + co.from_min_y_rot = f_min_y + co.from_max_y_rot = f_max_y + + co.from_min_z_rot = f_min_z + co.from_max_z_rot = f_max_z + + # MAP TO + co.map_to_x_from = map_x + co.to_min_x_rot = t_min_x + co.to_max_x_rot = t_max_x + + co.map_to_y_from = map_y + co.to_min_y_rot = t_min_y + co.to_max_y_rot = t_max_y + + co.map_to_z_from = map_z + co.to_min_z_rot = t_min_z + co.to_max_z_rot = t_max_z + + + def add_leg_follow_const(bone_name, area): + # skirt_bone, name, bone, f_min_x=calc(-1), f_max_x=calc(1), f_min_y=0, f_max_y=0, f_min_z=0, f_max_z=0, map_x='X', map_y='Y', map_z='Z', t_min_x=0, t_max_x=0, t_min_y=0, t_max_y=0, t_min_z=0, t_max_y=0 + + # FRONT + if area == "FRONT": + # Front Center + if " CF " in bone_name: + if bone_name[-1] == "1": + add_const(bone_name, "Left Leg", "DEF-thigh.L", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="X", map_z="X", t_min_x=calc(-0.125), t_max_x=calc(0.125), t_min_y=calc(0.5), t_max_y=calc(-0.5), t_min_z=calc(0), t_max_z=calc(0)) + add_const(bone_name, "Right Leg", "DEF-thigh.R", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="X", map_z="Z", t_min_x=calc(-0.125), t_max_x=calc(0.125), t_min_y=calc(-0.5), t_max_y=calc(0.5), t_min_z=calc(0), t_max_z=calc(0)) + + elif bone_name[-1] == "2": + add_const(bone_name, "Left Leg", "DEF-thigh.L", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="X", map_z="X", t_min_x=calc(0.125,True), t_max_x=calc(-0.125,True), t_min_y=calc(0.5,True), t_max_y=calc(-0.5,True), t_min_z=calc(-0.125,True), t_max_z=calc(0.125,True)) + add_const(bone_name, "Right Leg", "DEF-thigh.R", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="X", map_z="X", t_min_x=calc(0.125), t_max_x=calc(-0.125), t_min_y=calc(-0.5), t_max_y=calc(0.5), t_min_z=calc(0.125), t_max_z=calc(-0.125)) + + elif bone_name[-1] == "3": + add_const(bone_name, "Left Leg", "DEF-thigh.L", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="X", map_z="X", t_min_x=calc(0), t_max_x=calc(0), t_min_y=calc(0.5,True), t_max_y=calc(-0.5,True), t_min_z=calc(0.125,True), t_max_z=calc(-0.125,True)) + add_const(bone_name, "Right Leg", "DEF-thigh.R", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="X", map_z="Z", t_min_x=calc(0), t_max_x=calc(0), t_min_y=calc(-0.5,True), t_max_y=calc(0.5,True), t_min_z=calc(0), t_max_z=calc(0)) + # Front Left + elif ".L" in bone_name: + if bone_name[-3] == "1": + add_const(bone_name, "X+", "DEF-thigh.L", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="Y", map_z="Z", t_min_x=calc(-0.75,True), t_max_x=calc(0.75,True), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0), t_max_z=calc(0)) + add_const(bone_name, "X-", "DEF-thigh.L", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="Y", map_z="Z", t_min_x=calc(-0.3,True), t_max_x=calc(0.3,True), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0), t_max_z=calc(0)) + add_const(bone_name, "Z+", "DEF-thigh.L", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", f_min_x=0, f_max_x=0, f_min_z=calc(-1), f_max_z=calc(1), map_x="X", map_y="Y", map_z="Z", t_min_x=calc(0), t_max_x=calc(0), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(-0.1,True), t_max_z=calc(0.1,True)) + + elif bone_name[-3] == "2": + add_const(bone_name, "Transformation", "DEF-thigh.L", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="Y", map_z="X", t_min_x=calc(0.25,True), t_max_x=calc(-0.25,True), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0.125,True), t_max_z=calc(0.0)) + elif bone_name[-3] == "3": + add_const(bone_name, "Transformation", "DEF-thigh.L", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="Y", map_z="Z", t_min_x=calc(0.25,True), t_max_x=calc(-0.25,True), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0), t_max_z=calc(0)) + elif " L " in bone_name: + if bone_name[-1] == "1": + add_const(bone_name, "X+", "DEF-thigh.L", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="Y", map_z="Z", t_min_x=calc(-0.75,True), t_max_x=calc(0.75,True), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0), t_max_z=calc(0)) + add_const(bone_name, "X-", "DEF-thigh.L", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="Y", map_z="Z", t_min_x=calc(-0.3,True), t_max_x=calc(0.3,True), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0), t_max_z=calc(0)) + add_const(bone_name, "Z+", "DEF-thigh.L", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", f_min_x=0, f_max_x=0, f_min_z=calc(-1), f_max_z=calc(1), map_x="X", map_y="Y", map_z="Z", t_min_x=calc(0), t_max_x=calc(0), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(-0.1,True), t_max_z=calc(0.1,True)) + + elif bone_name[-1] == "2": + add_const(bone_name, "Transformation", "DEF-thigh.L", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="Y", map_z="X", t_min_x=calc(0.25,True), t_max_x=calc(-0.25,True), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0.125,True), t_max_z=calc(0.0)) + elif bone_name[-1] == "3": + add_const(bone_name, "Transformation", "DEF-thigh.L", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="Y", map_z="Z", t_min_x=calc(0.25,True), t_max_x=calc(-0.25,True), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0), t_max_z=calc(0)) + + # Front Right + elif ".R" in bone_name: + if bone_name[-3] == "1": + add_const(bone_name, "X+", "DEF-thigh.R", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="Y", map_z="Z", t_min_x=calc(-0.75,True), t_max_x=calc(0.75,True), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0), t_max_z=calc(0)) + add_const(bone_name, "X-", "DEF-thigh.R", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="Y", map_z="Z", t_min_x=calc(-0.3,True), t_max_x=calc(0.3,True), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0), t_max_z=calc(0)) + add_const(bone_name, "Z+", "DEF-thigh.R", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", trans_rot="ROT_Z", f_min_x=0, f_max_x=0, f_min_z=calc(-1), f_max_z=calc(1), map_x="X", map_y="Y", map_z="Z", t_min_x=calc(0), t_max_x=calc(0), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(-0.1), t_max_z=calc(0.1,True)) + elif bone_name[-3] == "2": + add_const(bone_name, "Transformation", "DEF-thigh.R", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="Y", map_z="X", t_min_x=calc(0.25,True), t_max_x=calc(-0.25,True), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(-0.125,True), t_max_z=calc(0)) + elif bone_name[-3] == "3": + add_const(bone_name, "Transformation", "DEF-thigh.R", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="Y", map_z="Z", t_min_x=calc(0.25,True), t_max_x=calc(-0.25,True), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0), t_max_z=calc(0)) + elif " R " in bone_name: + if bone_name[-1] == "1": + add_const(bone_name, "X+", "DEF-thigh.R", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="Y", map_z="Z", t_min_x=calc(-0.75,True), t_max_x=calc(0.75,True), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0), t_max_z=calc(0)) + add_const(bone_name, "X-", "DEF-thigh.R", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="Y", map_z="Z", t_min_x=calc(-0.3,True), t_max_x=calc(0.3,True), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0), t_max_z=calc(0)) + add_const(bone_name, "Z+", "DEF-thigh.R", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", trans_rot="ROT_Z", f_min_x=0, f_max_x=0, f_min_z=calc(-1), f_max_z=calc(1), map_x="X", map_y="Y", map_z="Z", t_min_x=calc(0), t_max_x=calc(0), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(-0.1), t_max_z=calc(0.1,True)) + elif bone_name[-1] == "2": + add_const(bone_name, "Transformation", "DEF-thigh.R", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="Y", map_z="X", t_min_x=calc(0.25,True), t_max_x=calc(-0.25,True), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(-0.125,True), t_max_z=calc(0)) + elif bone_name[-1] == "3": + add_const(bone_name, "Transformation", "DEF-thigh.R", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="Y", map_z="Z", t_min_x=calc(0.25,True), t_max_x=calc(-0.25,True), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0), t_max_z=calc(0)) + + # SIDE + elif area == "SIDE": + # Side Left + if ".L" in bone_name: + if bone_name[-3] == "1": + add_const(bone_name, "X", "DEF-thigh.L", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="Y", map_z="Z", t_min_x=calc(-0.15), t_max_x=calc(0.15), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0), t_max_z=calc(0)) + add_const(bone_name, "Z+", "DEF-thigh.L", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", trans_rot="ROT_Z",f_min_x=0,f_max_x=0,f_min_z=calc(-1),f_max_z=calc(1),map_x="X", map_y="Y", map_z="Z", t_min_x=calc(0), t_max_x=calc(0), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(-0.2), t_max_z=calc(0.2)) + + # Side Right + elif ".R" in bone_name: + if bone_name[-3] == "1": + add_const(bone_name, "X", "DEF-thigh.R", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="Y", map_z="Z", t_min_x=calc(-0.15), t_max_x=calc(0.15), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0), t_max_z=calc(0)) + add_const(bone_name, "Z+", "DEF-thigh.R", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", trans_rot="ROT_Z",f_min_x=0,f_max_x=0,f_min_z=calc(-1),f_max_z=calc(1),map_x="X", map_y="Y", map_z="Z", t_min_x=calc(0), t_max_x=calc(0), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(-0.2), t_max_z=calc(0.2)) + elif " L " in bone_name: + if bone_name[-1] == "1": + add_const(bone_name, "X", "DEF-thigh.L", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="Y", map_z="Z", t_min_x=calc(-0.15), t_max_x=calc(0.15), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0), t_max_z=calc(0)) + add_const(bone_name, "Z+", "DEF-thigh.L", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", trans_rot="ROT_Z",f_min_x=0,f_max_x=0,f_min_z=calc(-1),f_max_z=calc(1),map_x="X", map_y="Y", map_z="Z", t_min_x=calc(0), t_max_x=calc(0), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(-0.2), t_max_z=calc(0.2)) + + # Side Right + elif " R " in bone_name: + if bone_name[-1] == "1": + add_const(bone_name, "X", "DEF-thigh.R", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", map_x="X", map_y="Y", map_z="Z", t_min_x=calc(-0.15), t_max_x=calc(0.15), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0), t_max_z=calc(0)) + add_const(bone_name, "Z+", "DEF-thigh.R", "0.35 + 0.65 * max(0, min(1, (bone*-1)*3))", trans_rot="ROT_Z",f_min_x=0,f_max_x=0,f_min_z=calc(-1),f_max_z=calc(1),map_x="X", map_y="Y", map_z="Z", t_min_x=calc(0), t_max_x=calc(0), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(-0.2), t_max_z=calc(0.2)) + + # BACK + elif area == "BACK": + # Back Left + if ".L" in bone_name: + if bone_name[-3] == "1": + add_const(bone_name, "Transformation", "DEF-thigh.L", "0.5 + 0.5 * max(0, min(1, (bone)*3))", map_x="X", map_y="Y", map_z="Z", t_min_x=calc(-0.3), t_max_x=calc(0.3), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0), t_max_z=calc(0)) + + # Back Right + if ".R" in bone_name: + if bone_name[-3] == "1": + add_const(bone_name, "Transformation", "DEF-thigh.R", "0.5 + 0.5 * max(0, min(1, (bone)*3))", map_x="X", map_y="Y", map_z="Z", t_min_x=calc(-0.3), t_max_x=calc(0.3), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0), t_max_z=calc(0)) + # Back Left + elif " L " in bone_name: + if bone_name[-1] == "1": + add_const(bone_name, "Transformation", "DEF-thigh.L", "0.5 + 0.5 * max(0, min(1, (bone)*3))", map_x="X", map_y="Y", map_z="Z", t_min_x=calc(-0.3), t_max_x=calc(0.3), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0), t_max_z=calc(0)) + + # Back Right + elif " R " in bone_name: + if bone_name[-1] == "1": + add_const(bone_name, "Transformation", "DEF-thigh.R", "0.5 + 0.5 * max(0, min(1, (bone)*3))", map_x="X", map_y="Y", map_z="Z", t_min_x=calc(-0.3), t_max_x=calc(0.3), t_min_y=calc(0), t_max_y=calc(0), t_min_z=calc(0), t_max_z=calc(0)) + + # Back Center + if " CB " in bone_name: + if bone_name[-1] == "1": + add_const(bone_name, "Left Leg", "DEF-thigh.L", "0.5 + 0.5 * max(0, min(1, (bone)*3))", map_x="X", map_y="X", map_z="X", t_min_x=calc(-0.125), t_max_x=calc(0.125), t_min_y=calc(0.5), t_max_y=calc(-0.5), t_min_z=calc(0), t_max_z=calc(0)) + add_const(bone_name, "Right Leg", "DEF-thigh.R", "0.5 + 0.5 * max(0, min(1, (bone)*3))", map_x="X", map_y="X", map_z="Z", t_min_x=calc(-0.125), t_max_x=calc(0.125), t_min_y=calc(-0.5), t_max_y=calc(0.5), t_min_z=calc(0), t_max_z=calc(0)) + + + for bone in front_skirt_bones: + add_leg_follow_const(bone, "FRONT") + + for bone in side_skirt_bones: + add_leg_follow_const(bone, "SIDE") + + for bone in back_skirt_bones: + add_leg_follow_const(bone, "BACK") + + # Let's go into object mode and select the three face parts to begin adding shape key drivers + bpy.ops.object.mode_set(mode='OBJECT') + bpy.ops.object.select_all(action='DESELECT') + + bpy.ops.object.select_all(action='DESELECT') + + + def makeCon(shape_key,bone_name,expression,transform): + # Get the bone object by name + armature = bpy.context.scene.objects[ourRig] + bone = armature.pose.bones[bone_name] + + # Create a driver for the shape key + shape_key = obj.data.shape_keys.key_blocks[shape_key] + driver = shape_key.driver_add("value").driver + + # Create variables for the driver + var = driver.variables.new() + var.name = "bone" + var.type = 'TRANSFORMS' + var.targets[0].id = armature + var.targets[0].bone_target = bone_name + var.targets[0].transform_space = 'LOCAL_SPACE' + var.targets[0].transform_type = transform + + # Create the scripted expression driver + driver.type = 'SCRIPTED' + driver.expression = expression + + # Update the dependencies + depsgraph = bpy.context.evaluated_depsgraph_get() + depsgraph.update() + + # BROW SHAPE KEYS + # Get the selected object with the shape key + try: + obj = bpy.data.objects.get("Brow") or (bpy.data.objects.get("Body") if meshes_joined else None) + makeCon("Brow_Down_L","Brow-L-Control","bone * -4","LOC_Y") + makeCon("Brow_Down_R","Brow-R-Control","bone * -4","LOC_Y") + makeCon("Brow_Up_L","Brow-L-Control","bone * 4","LOC_Y") + makeCon("Brow_Up_R","Brow-R-Control","bone * 4","LOC_Y") + makeCon("Brow_Trouble_L", "Brow-Trouble-L-Control", "bone * 2", "LOC_X") + makeCon("Brow_Trouble_R", "Brow-Trouble-R-Control", "bone * 2", "LOC_X") + makeCon("Brow_Smily_R", "Brow-Smily-R-Control", "bone * 2", "LOC_X") + makeCon("Brow_Smily_L", "Brow-Smily-L-Control", "bone * 2", "LOC_X") + makeCon("Brow_Angry_L", "Brow-Angry-L-Control", "bone * 2", "LOC_X") + makeCon("Brow_Angry_R", "Brow-Angry-R-Control", "bone * 2", "LOC_X") + makeCon("Brow_Shy_L", "Brow-Shy-L-Control", "bone * 2", "LOC_X") + makeCon("Brow_Shy_R", "Brow-Shy-R-Control", "bone * 2", "LOC_X") + makeCon("Brow_Squeeze_R", "Brow-R-Control", "bone * 4", "LOC_X") + makeCon("Brow_Squeeze_L", "Brow-L-Control", "bone * -4", "LOC_X") + except: + pass + + try: + # EYE SHAPE KEYS + obj = bpy.data.objects.get("Face_Eye") or (bpy.data.objects.get("Body") if meshes_joined else None) + makeCon("Eye_WinkA_L","WinkA-L-Invis","bone * -.82","LOC_Y") + makeCon("Eye_WinkA_R","WinkA-R-Invis","bone * -.82","LOC_Y") + makeCon("Eye_WinkB_L","WinkB-L-Invis","bone * -.82","LOC_Y") + makeCon("Eye_WinkB_R","WinkB-R-Invis","bone * -.82","LOC_Y") + makeCon("Eye_WinkC_L","WinkC-L-Invis","bone * -.82","LOC_Y") + makeCon("Eye_WinkC_R","WinkC-R-Invis","bone * -.82","LOC_Y") + + makeCon("Eye_Ha","Eye-Ha-Control","bone * -2.22","LOC_Y") + makeCon("Eye_Jito","Eye-Jito-Control","bone * -2.22","LOC_Y") + makeCon("Eye_Wail","Eye-Wail-Control","bone * -2.22","LOC_Y") + makeCon("Eye_Hostility","Eye-Hostility-Control","bone * -2.22","LOC_Y") + makeCon("Eye_Tired","Eye-Tired-Control","bone * -2.22","LOC_Y") + makeCon("Eye_WUp","Eye-Up-Control","bone * -2.22","LOC_Y") + makeCon("Eye_WDown","Eye-Down-Control","bone * -2.22","LOC_Y") + makeCon("Eye_Lowereyelid","Eye-LowerEyelid-Control","bone * -2.22","LOC_Y") + + # Pupils shape key drivers are set up below + obj = bpy.data.objects.get("EyeStar") or (bpy.data.objects.get("Body") if meshes_joined else None) + makeCon("EyeStar","Eye-Star-Control","1+(bone*2.23)","LOC_Y") + + except: + pass + + # MOUTH SHAPE KEYS + obj = bpy.data.objects.get("Face") or (bpy.data.objects.get("Body") if meshes_joined else None) + makeCon("Mouth_Default","Mouth-Default-Control","bone * 1.67","LOC_X") + makeCon("Mouth_A01","Mouth-Control","bone * -1.33","LOC_Y") + makeCon("Mouth_Open01","Mouth-Control","bone * 1.33","LOC_Y") + makeCon("Mouth_Smile01","Mouth-Smile1-Control","bone * 1.67","LOC_X") + makeCon("Mouth_Smile02","Mouth-Smile2-Control","bone * 1.67","LOC_X") + makeCon("Mouth_Angry01","Mouth-Angry1-Control","bone * 1.67","LOC_X") + makeCon("Mouth_Angry02","Mouth-Angry2-Control","bone * 1.67","LOC_X") + makeCon("Mouth_Angry03","Mouth-Angry3-Control","bone * 1.67","LOC_X") + makeCon("Mouth_Fury01","Mouth-Fury1-Control","bone * 1.67","LOC_X") + makeCon("Mouth_Doya01","Mouth-Doya1-Control","bone * 1.67","LOC_X") + makeCon("Mouth_Doya02","Mouth-Doya2-Control","bone * 1.67","LOC_X") + makeCon("Mouth_Pero01","Mouth-Pero1-Control","bone * 1.67","LOC_X") + makeCon("Mouth_Pero02","Mouth-Pero2-Control","bone * 1.67","LOC_X") + makeCon("Mouth_Line01","Mouth-Control","bone * 1.33","LOC_X") + makeCon("Mouth_Line02","Mouth-Control","bone * -1.33","LOC_X") + makeCon("Mouth_Neko01","Mouth-Neko1-Control","bone * 1.67","LOC_X") + + # Special drivers for pushing pupils back on blink + def makeCon2(shape_key,bn1,bn2,bn3,expression,transform): + # Get the bone object by name + armature = bpy.context.scene.objects[ourRig] + bone = armature.pose.bones[bn1] + + # Create a driver for the shape key + shape_key = obj.data.shape_keys.key_blocks[shape_key] + driver = shape_key.driver_add("value").driver + + # Create variables for the driver + var = driver.variables.new() + var.name = "invisA" + var.type = 'TRANSFORMS' + var.targets[0].id = armature + var.targets[0].bone_target = bn1 + var.targets[0].transform_space = 'LOCAL_SPACE' + var.targets[0].transform_type = transform + + # Create variables for the driver + var1 = driver.variables.new() + var1.name = "invisB" + var1.type = 'TRANSFORMS' + var1.targets[0].id = armature + var1.targets[0].bone_target = bn2 + var1.targets[0].transform_space = 'LOCAL_SPACE' + var1.targets[0].transform_type = transform + + # Create variables for the driver + var2 = driver.variables.new() + var2.name = "invisC" + var2.type = 'TRANSFORMS' + var2.targets[0].id = armature + var2.targets[0].bone_target = bn3 + var2.targets[0].transform_space = 'LOCAL_SPACE' + var2.targets[0].transform_type = transform + + # Create the scripted expression driver + driver.type = 'SCRIPTED' + driver.expression = expression + + # Update the dependencies + depsgraph = bpy.context.evaluated_depsgraph_get() + depsgraph.update() + obj = bpy.data.objects.get("Body") + try: + makeCon2("pupil-pushback-R","WinkA-R-Invis","WinkB-R-Invis","WinkC-R-Invis","max(invisA * -1.55, invisB * -1.55, invisC * -1.55)","LOC_Y") # -1.45 + makeCon2("pupil-pushback-L","WinkA-L-Invis","WinkB-L-Invis","WinkC-L-Invis","max(invisA * -1.55, invisB * -1.55, invisC * -1.55)","LOC_Y") + except: + pass + # Pupils shape key driver is set up below. Like Eye Star, the shape key has to be made FIRST before adding a driver + + if(use_head_tracker): + # Since we're still in object mode, here we can add the head pole object in the neck to track head movement + bpy.ops.object.empty_add(type='PLAIN_AXES', align='WORLD', location=(0, 0, 0), scale=(1, 1, 1)) + bpy.data.objects["Empty"].name = "Head_Pole" + bpy.data.objects["Head_Pole"].empty_display_size = 0.01 + bpy.data.objects["Head_Pole"].parent = bpy.data.objects[char_name+"Rig"] + bpy.data.objects["Head_Pole"].parent_type = "BONE" + bpy.data.objects["Head_Pole"].parent_bone = "neck" + + # Let's go into object mode and select the body for the pupil shape keys, and to control our glow sliders. + bpy.ops.object.select_all(action='DESELECT') + obj = bpy.data.objects.get("Body") + bpy.ops.object.select_all(action='DESELECT') + + try: + makeCon("pupils","Eye-Pupil-Control","bone * -2.4","LOC_Y") + except: + pass + + # Going into pose mode with our character selected. + bpy.ops.object.select_all(action='DESELECT') + our_char = bpy.data.objects.get(char_name+"Rig") + if our_char: + our_char.select_set(True) + bpy.context.view_layer.objects.active = our_char + + bpy.ops.object.mode_set(mode='POSE') + + + def add_driver_to_eyelid(): + eyelid_invis_bone = bpy.context.scene.objects[char_name+"Rig"].pose.bones["eyelid-invis-control"] + eyelid_control_driver = eyelid_invis_bone.driver_add('location', 1).driver + # Create variables for the driver + var = eyelid_control_driver.variables.new() + var.name = "bone" + var.type = 'TRANSFORMS' + var.targets[0].id = bpy.data.objects.get(ourRig) + var.targets[0].bone_target = "eyetrack" + var.targets[0].transform_space = 'LOCAL_SPACE' + var.targets[0].transform_type = "LOC_Y" + + # Create the scripted expression driver + eyelid_control_driver.type = 'SCRIPTED' + eyelid_control_driver.expression = "bone * 5" + + # Update the dependencies + depsgraph = bpy.context.evaluated_depsgraph_get() + depsgraph.update() + + try: + add_driver_to_eyelid() + except: + pass + + # Disable IK Stretching & Turn on IK Poles. Toggle manually as needed. + if disallow_leg_ik_stretch: + bpy.data.objects[char_name+"Rig"].pose.bones["thigh_parent.L"]["IK_Stretch"] = 0.0 + bpy.data.objects[char_name+"Rig"].pose.bones["thigh_parent.R"]["IK_Stretch"] = 0.0 + + if disallow_arm_ik_stretch: + bpy.data.objects[char_name+"Rig"].pose.bones["upper_arm_parent.L"]["IK_Stretch"] = 0.0 + bpy.data.objects[char_name+"Rig"].pose.bones["upper_arm_parent.R"]["IK_Stretch"] = 0.0 + + if use_arm_ik_poles: + bpy.data.objects[char_name+"Rig"].pose.bones["upper_arm_parent.L"]["pole_vector"] = 1 + bpy.data.objects[char_name+"Rig"].pose.bones["upper_arm_parent.R"]["pole_vector"] = 1 + + if use_leg_ik_poles: + bpy.data.objects[char_name+"Rig"].pose.bones["thigh_parent.L"]["pole_vector"] = 1 + bpy.data.objects[char_name+"Rig"].pose.bones["thigh_parent.R"]["pole_vector"] = 1 + + bpy.data.objects[char_name+"Rig"].pose.bones["torso"]["head_follow"] = 1.0 + bpy.data.objects[char_name+"Rig"].pose.bones["upper_arm_parent.L"]["IK_parent"] = 4 + bpy.data.objects[char_name+"Rig"].pose.bones["upper_arm_parent.R"]["IK_parent"] = 4 + + def add_shoulder_const(follow, driver, hand): + armature = bpy.context.scene.objects[ourRig] + + # make shoulder follow driver bone + this_bone = bpy.context.scene.objects[char_name+"Rig"].pose.bones[follow] + co = this_bone.constraints.new('DAMPED_TRACK') + co.target = our_char + co.subtarget = driver + + # make driver bone follow hand + drive = bpy.context.scene.objects[char_name+"Rig"].pose.bones[driver] + co2 = drive.constraints.new('COPY_LOCATION') + co2.target = our_char + co2.subtarget = hand + co2.target_space = "LOCAL_OWNER_ORIENT" + co2.owner_space = "LOCAL" + + # make driver to control influence + driver = co.driver_add("influence").driver + var = driver.variables.new() + var.name = "bone" + var.type = 'SINGLE_PROP' + + var.targets[0].id = armature + var.targets[0].data_path = "pose.bones[\"plate-settings\"][\"Toggle Shoulder Constraints\"]" + driver.type = 'SCRIPTED' + driver.expression = "(bone * 0.4)" + + depsgraph = bpy.context.evaluated_depsgraph_get() + depsgraph.update() + + + add_shoulder_const("MCH-shoulder_follow.L","shoulder_driver.L","hand-ik-L") + add_shoulder_const("MCH-shoulder_follow.R","shoulder_driver.R","hand-ik-R") + + def add_eye_bone_const(bone_name, to_bone): + this_bone = bpy.context.scene.objects[char_name+"Rig"].pose.bones[bone_name] + co = this_bone.constraints.new('COPY_ROTATION') + co.target = our_char + co.subtarget = to_bone + co.target_space = "LOCAL_OWNER_ORIENT" + co.owner_space = "LOCAL" + + try: + add_eye_bone_const("+EyeBone R A01", "+EyeBone R A01.001") + add_eye_bone_const("+EyeBone L A01", "+EyeBone L A01.001") + except: + pass + + # Let's add empty 'child of' constraints to limbs, torso and root. Ready to use in case char holds obj/stands on obj + def add_child_of(bone_name): + this_bone = bpy.context.scene.objects[char_name+"Rig"].pose.bones[bone_name] + co = this_bone.constraints.new('CHILD_OF') + + if add_child_of_constraints: + add_child_of("hand-ik-L") + add_child_of("hand-ik-R") + add_child_of("foot_ik.R") + add_child_of("foot_ik.L") + add_child_of("torso-outer") + add_child_of("root") + + + if(use_head_tracker): + + # Here we can set up the two damped track constraints to make the head follow the controller bone. + # This makes the head bone follow the controller + head_controller = bpy.context.scene.objects[char_name+"Rig"].pose.bones["head"] + co = head_controller.constraints.new('DAMPED_TRACK') + head_track_const = bpy.data.objects[char_name+"Rig"].pose.bones["head"].constraints["Damped Track"] + head_track_const.target = our_char + head_track_const.subtarget = "head-controller" + head_track_const.track_axis = "TRACK_Z" + + # This makes the controller follow the obj in the neck to keep it 'on' the head. + head_pole_cont = bpy.context.scene.objects[char_name+"Rig"].pose.bones["head-controller"] + co2 = head_pole_cont.constraints.new('DAMPED_TRACK') + head_pole_const = bpy.data.objects[char_name+"Rig"].pose.bones["head-controller"].constraints["Damped Track"] + head_pole_const.target = bpy.data.objects.get("Head_Pole") + head_pole_const.track_axis = "TRACK_NEGATIVE_Z" + + # We can now make our final bone groups look good! (Both 3.6 and 4.0 functionality.) + def assign_bone_to_group(bone_name, group_name): + # Perform old functionality to make BGs to then color. + if not is_version_4: + # Switch to object mode + bpy.ops.object.mode_set(mode='OBJECT') + + # Get the armature object + armature_obj = our_char + if not armature_obj or armature_obj.type != 'ARMATURE': + return + + # Switch to pose mode + bpy.context.view_layer.objects.active = armature_obj + bpy.ops.object.mode_set(mode='POSE') + + # Get the pose bone + pose_bone = armature_obj.pose.bones.get(bone_name) + if not pose_bone: + return + + # Get the bone group + bone_group = armature_obj.pose.bone_groups.get(group_name) + if not bone_group: + # Create a new bone group if it doesn't exist + bone_group = armature_obj.pose.bone_groups.new(name=group_name) + + # Assign the bone to the bone group + pose_bone.bone_group = bone_group + + # New 4.0 functionality: change the bone itself to the color of the group it was originally assigned to. + else: + # 4.0: Armature bones or Pose bones? + bone = bpy.context.object.pose.bones[bone_name] + + if group_name == "Root": + bone.color.palette = 'CUSTOM' + bone.color.custom.normal = (0,1,0.169) + bone.color.custom.select = (0.184,1,0.713) + bone.color.custom.active = (0.125,0.949,0.816) + elif group_name == "Torso": + bone.color.palette = 'CUSTOM' + bone.color.custom.normal = (1,0.867,0) + bone.color.custom.select = (1,0.671,0.502) + bone.color.custom.active = (0.949,0.431,0) + elif group_name == "Limbs L": + bone.color.palette = 'CUSTOM' + bone.color.custom.normal = (1,0,1) + bone.color.custom.select = (1,0.129,0.467) + bone.color.custom.active = (1,0.518,0.969) + elif group_name == "Limbs R": + bone.color.palette = 'CUSTOM' + bone.color.custom.normal = (0,0.839,1) + bone.color.custom.select = (0.227,0.357,0.902) + bone.color.custom.active = (0.035,0.333,0.878) + elif group_name == "Face": + bone.color.palette = 'CUSTOM' + bone.color.custom.normal = (1,0,0) + bone.color.custom.select = (0.506,0.902,0.078) + bone.color.custom.active = (0.094,0.714,0.878) + + # Root BG + assign_bone_to_group("root", "Root") + assign_bone_to_group("root-outer", "Root") + assign_bone_to_group("root-inner", "Root") + + # Torso BG + assign_bone_to_group("torso", "Torso") + assign_bone_to_group("torso-inner", "Torso") + assign_bone_to_group("torso-outer", "Torso") + assign_bone_to_group("torso_pivot.002", "Torso") + assign_bone_to_group("hips", "Torso") + assign_bone_to_group("chest", "Torso") + assign_bone_to_group("neck", "Torso") + assign_bone_to_group("head-controller", "Torso") + assign_bone_to_group("head", "Torso") + + # Left Arm BG + assign_bone_to_group("hand_ik.L", "Limbs L") + assign_bone_to_group("upper_arm_ik_target.L", "Limbs L") + assign_bone_to_group("shoulder.L", "Limbs L") + assign_bone_to_group("hand-ik-pivot-L", "Limbs L") + assign_bone_to_group("hand-ik-L", "Limbs L") + assign_bone_to_group("upper_arm_parent.L", "Limbs L") + assign_bone_to_group("forearm_tweak-pin.L", "Limbs L") + assign_bone_to_group("prop.L", "Limbs L") + if not use_arm_ik_poles: + assign_bone_to_group("upper_arm_ik.L", "Limbs L") + + # Right Arm BG + assign_bone_to_group("hand_ik.R", "Limbs R") + assign_bone_to_group("upper_arm_ik_target.R", "Limbs R") + assign_bone_to_group("shoulder.R", "Limbs R") + assign_bone_to_group("hand-ik-pivot-R", "Limbs R") + assign_bone_to_group("hand-ik-R", "Limbs R") + assign_bone_to_group("upper_arm_parent.R", "Limbs R") + assign_bone_to_group("forearm_tweak-pin.R", "Limbs R") + assign_bone_to_group("prop.R", "Limbs R") + if not use_arm_ik_poles: + assign_bone_to_group("upper_arm_ik.R", "Limbs R") + + # Left Foot BG + assign_bone_to_group("foot_ik.L", "Limbs L") + assign_bone_to_group("toe_ik.L", "Limbs L") + assign_bone_to_group("foot_spin_ik.L", "Limbs L") + assign_bone_to_group("foot_heel_ik.L", "Limbs L") + assign_bone_to_group("thigh_ik_target.L", "Limbs L") + assign_bone_to_group("ik-pivot-L", "Limbs L") + assign_bone_to_group("ik-sub-pivot-L", "Limbs L") + assign_bone_to_group("thigh_parent.L", "Limbs L") + assign_bone_to_group("shin_tweak-pin.L", "Limbs L") + if not use_leg_ik_poles: + assign_bone_to_group("thigh_ik.L", "Limbs L") + + # Right Foot BG + assign_bone_to_group("foot_ik.R", "Limbs R") + assign_bone_to_group("toe_ik.R", "Limbs R") + assign_bone_to_group("foot_spin_ik.R", "Limbs R") + assign_bone_to_group("foot_heel_ik.R", "Limbs R") + assign_bone_to_group("thigh_ik_target.R", "Limbs R") + assign_bone_to_group("ik-pivot-R", "Limbs R") + assign_bone_to_group("ik-sub-pivot-R", "Limbs R") + assign_bone_to_group("thigh_parent.R", "Limbs R") + assign_bone_to_group("shin_tweak-pin.R", "Limbs R") + if not use_leg_ik_poles: + assign_bone_to_group("thigh_ik.R", "Limbs R") + + # Face BG + assign_bone_to_group("Mouth-Control", "Face") + assign_bone_to_group("Mouth-Smile1-Control", "Face") + assign_bone_to_group("Mouth-Smile2-Control", "Face") + assign_bone_to_group("Mouth-Angry1-Control", "Face") + assign_bone_to_group("Mouth-Angry2-Control", "Face") + assign_bone_to_group("Mouth-Angry3-Control", "Face") + assign_bone_to_group("Mouth-Fury1-Control", "Face") + assign_bone_to_group("Mouth-Doya1-Control", "Face") + assign_bone_to_group("Mouth-Doya2-Control", "Face") + assign_bone_to_group("Mouth-Pero1-Control", "Face") + assign_bone_to_group("Mouth-Pero2-Control", "Face") + assign_bone_to_group("Mouth-Neko1-Control", "Face") + assign_bone_to_group("Mouth-Default-Control", "Face") + assign_bone_to_group("plate-settings", "Face") + + assign_bone_to_group("Eye-Down-Control", "Face") + assign_bone_to_group("Eye-Up-Control", "Face") + assign_bone_to_group("Eye-Jito-Control", "Face") + assign_bone_to_group("Eye-Tired-Control", "Face") + assign_bone_to_group("Eye-Hostility-Control", "Face") + assign_bone_to_group("Eye-Wail-Control", "Face") + assign_bone_to_group("Eye-LowerEyelid-Control", "Face") + assign_bone_to_group("Eye-Ha-Control", "Face") + assign_bone_to_group("Eye-WinkA-Control", "Face") + assign_bone_to_group("Eye-WinkB-Control", "Face") + assign_bone_to_group("Eye-WinkC-Control", "Face") + assign_bone_to_group("Eye-Star-Control", "Face") + assign_bone_to_group("Eye-Pupil-Control", "Face") + assign_bone_to_group("eyetrack", "Face") + assign_bone_to_group("eyetrack_L", "Face") + assign_bone_to_group("eyetrack_R", "Face") + + assign_bone_to_group("Wink-Control-R", "Face") + assign_bone_to_group("Wink-Control-L", "Face") + assign_bone_to_group("Brow-Trouble-L-Control", "Face") + assign_bone_to_group("Brow-Trouble-R-Control", "Face") + assign_bone_to_group("Brow-Shy-R-Control", "Face") + assign_bone_to_group("Brow-Shy-L-Control", "Face") + assign_bone_to_group("Brow-Angry-R-Control", "Face") + assign_bone_to_group("Brow-Angry-L-Control", "Face") + assign_bone_to_group("Brow-Smily-R-Control", "Face") + assign_bone_to_group("Brow-Smily-L-Control", "Face") + assign_bone_to_group("Brow-R-Control", "Face") + assign_bone_to_group("Brow-L-Control", "Face") + + try: + this_obj.pose.bones["eyetrack_L"].custom_shape_scale_xyz = (2,2,2) + this_obj.pose.bones["eyetrack_R"].custom_shape_scale_xyz = (2,2,2) + this_obj.pose.bones["eyetrack"].custom_shape_scale_xyz = (6.5,5,1) + except: + pass + + # Default bone group colors are ugly. We can change them. + def change_bone_group_colors(bone_group_name, color1, color2, color3): + active_bg = bpy.context.active_object.pose.bone_groups[bone_group_name] + active_bg.color_set = "CUSTOM" + active_bg.colors.normal = Color((color1)) + active_bg.colors.select = Color((color2)) + active_bg.colors.active = Color((color3)) + + if not is_version_4: + change_bone_group_colors('Root',(0,1,0.169),(0.184,1,0.713),(0.125,0.949,0.816)) + change_bone_group_colors('Torso',(1,0.867,0),(1,0.671,0.502),(0.949,0.431,0)) + change_bone_group_colors('Limbs L',(1,0,1),(1,0.129,0.467),(1,0.518,0.969)) + change_bone_group_colors('Limbs R',(0,0.839,1),(0.227,0.357,0.902),(0.035,0.333,0.878)) + change_bone_group_colors('Face',(1,0,0),(0.506,0.902,0.078),(0.094,0.714,0.878)) + + + # Automatically builds the constraint stuff for SWITCH PARENT. DO NOT FORGET TO REENABLE THE CONSTRAINTS BELOW!!!!!! + def generate_switch_parent_constraints(toggle_parent, location_of_switcher): + const = this_obj.pose.bones[toggle_parent].constraints["SWITCH PARENT"] + const.targets[0].target = bpy.data.objects[char_name+"Rig"] + const.targets[0].subtarget = "root" + + const.targets[1].target = bpy.data.objects[char_name+"Rig"] + const.targets[1].subtarget = "root.001" + + const.targets[2].target = bpy.data.objects[char_name+"Rig"] + const.targets[2].subtarget = "root.002" + + const.targets[3].target = bpy.data.objects[char_name+"Rig"] + const.targets[3].subtarget = "torso.002" + + const.targets[4].target = bpy.data.objects[char_name+"Rig"] + const.targets[4].subtarget = "chest" + + location_str = "pose.bones[\"" + location_of_switcher + "\"][\"parent_switch\"]" + + for x in range(5): + driver = const.targets[x].driver_add("weight").driver + var = driver.variables.new() + var.name = "toggle" + var.type = 'SINGLE_PROP' + var.targets[0].id = bpy.context.scene.objects[ourRig] + var.targets[0].data_path = location_str + + driver.type = 'SCRIPTED' + driver.expression = "toggle == " + str(x+1) + + depsgraph = bpy.context.evaluated_depsgraph_get() + depsgraph.update() + + # Toggle the constraint off, we HAVE to reenable it later to work!! + const.enabled = False + + + # REENABLE CONSTRAINTS BELOW + + if use_head_tracker: + generate_switch_parent_constraints("MCH-head-controller-parent","head-controller") + + # REENABLE THE CONSTRAINT BELOW. + generate_switch_parent_constraints("MCH-forearm_tweak-pin.parent.L","forearm_tweak-pin.L") + generate_switch_parent_constraints("MCH-forearm_tweak-pin.parent.R","forearm_tweak-pin.R") + generate_switch_parent_constraints("MCH-shin_tweak-pin.parent.L","shin_tweak-pin.L") + generate_switch_parent_constraints("MCH-shin_tweak-pin.parent.R","shin_tweak-pin.R") + + # For each tweak bone, we make the custom property, the constraint and driver. + def prepare_tweak_bone(tweak_bone, pin_bone): + # Make Custom Property + cust_bone = this_obj.pose.bones[tweak_bone] + cust_bone["tweak_pin"] = 0.00 + # Setting the min/max ranges: https://blender.stackexchange.com/a/258099 + id_prop = cust_bone.id_properties_ui("tweak_pin") + id_prop.update(min=0.0,max=1.0) + + # Make Constraint + con = this_obj.pose.bones[tweak_bone].constraints.new('COPY_LOCATION') + con.target = our_char + con.subtarget = pin_bone + + path_str = "pose.bones[\"" + tweak_bone+"\"][\"tweak_pin\"]" + + driver = con.driver_add("influence").driver + driver.type = 'SUM' + var = driver.variables.new() + var.name = "bone" + var.type = 'SINGLE_PROP' + var.targets[0].id = bpy.context.scene.objects[ourRig] + var.targets[0].data_path = path_str + depsgraph = bpy.context.evaluated_depsgraph_get() + depsgraph.update() + + prepare_tweak_bone("forearm_tweak.L", "forearm_tweak-pin.L") + prepare_tweak_bone("forearm_tweak.R", "forearm_tweak-pin.R") + prepare_tweak_bone("shin_tweak.L", "shin_tweak-pin.L") + prepare_tweak_bone("shin_tweak.R", "shin_tweak-pin.R") + + # To repair the now missing custom property, let's remake it. + def make_torso_custom(): + cust_bone = this_obj.pose.bones["torso-outer"] + cust_bone["torso_parent"] = 1 + id_prop = cust_bone.id_properties_ui("torso_parent") + id_prop.update(min=0,max=2) + + make_torso_custom() + + # Adjustments to positioning + this_obj.pose.bones["foot_ik.L"].custom_shape_transform = bpy.data.objects[char_name+"Rig"].pose.bones["mch-ik-pivot-L"] + this_obj.pose.bones["foot_ik.R"].custom_shape_transform = bpy.data.objects[char_name+"Rig"].pose.bones["mch-ik-pivot-R"] + this_obj.pose.bones["hand-ik-L"].custom_shape_transform = bpy.data.objects[char_name+"Rig"].pose.bones["mch-hand-ik-pivot-L"] + this_obj.pose.bones["hand-ik-R"].custom_shape_transform = bpy.data.objects[char_name+"Rig"].pose.bones["mch-hand-ik-pivot-R"] + + this_obj.pose.bones["ik-sub-pivot-L"].custom_shape_translation = (foot_L_x_diff*-1.0, 0.0, foot_L_z_diff*-1.0) + this_obj.pose.bones["ik-sub-pivot-R"].custom_shape_translation = (foot_R_x_diff*-1.0, 0.0, foot_R_z_diff*-1.0) + + + # Penultimate: Rename bones as needed + for oldname, newname in rename_bones_list: + bone = bpy.context.object.pose.bones.get(oldname) + if bone is None: + continue + bone.name = newname + + # We have to nuke the existing driver in the torso. + def nuke_old_torso_const(): + const = this_obj.pose.bones["MCH-torso.parent"].constraints + to_del = [c for c in const] + for c in to_del: + const.remove(c) + + new = const.new('ARMATURE') + new.name = 'SWITCH_PARENT' + # add target + new.targets.new() + new.targets[0].target = bpy.data.objects[char_name+"Rig"] + new.targets[0].subtarget = "root.002" + + location_str = "pose.bones[\"torso\"][\"torso_parent\"]" + + driver = new.targets[0].driver_add("weight").driver + for variable in driver.variables: + if variable.type == 'SINGLE_PROP': + variable.targets[0].data_path = location_str + + driver.expression = "var == 1" + + depsgraph = bpy.context.evaluated_depsgraph_get() + depsgraph.update() + + # Toggle the constraint off, we HAVE to reenable it later to work!! + new.enabled = False + + nuke_old_torso_const() + + # Use this to swap a variable in a constraint + def swap_const_follow_in_const(bone, constraint_type, new_var): + const = this_obj.pose.bones[bone].constraints + for c in const: + if c.type == constraint_type: + const.remove(c) + + new = const.new(constraint_type) + new.target = bpy.data.objects[char_name+"Rig"] + new.subtarget = "torso.002" + + driver = new.driver_add("influence").driver + driver.type = 'SUM' + for variable in driver.variables: + if variable.type == 'SINGLE_PROP': + variable.targets[0].data_path = new_var + + depsgraph = bpy.context.evaluated_depsgraph_get() + depsgraph.update() + + swap_const_follow_in_const("MCH-ROT-head","COPY_ROTATION","pose.bones[\"plate-settings\"][\"Head Follow\"]") + swap_const_follow_in_const("MCH-ROT-neck","COPY_ROTATION","pose.bones[\"plate-settings\"][\"Neck Follow\"]") + + # Delete all existing bone collections, and make new ones. + if is_version_4: + armature = bpy.context.object.data + collections = armature.collections + for coll in collections: + collections.remove(coll) + + collections.new("Tweaks") + collections.new("Pivots & Pins") + collections.new("Offsets") + collections.new("Props") + collections.new("Face") + collections.new("Torso (IK)") + collections.new("Torso (FK)") + collections.new("Fingers") + collections.new("Fingers (Detail)") + collections.new("Arm.L (IK)") + collections.new("Arm.R (IK)") + collections.new("Arm.L (FK)") + collections.new("Arm.R (FK)") + collections.new("Leg.L (IK)") + collections.new("Leg.R (IK)") + collections.new("Leg.L (FK)") + collections.new("Leg.R (FK)") + collections.new("Root") + collections.new("Physics") + collections.new("Cage") + collections.new("Other") + + for bone in armature.bones: + collections["Other"].assign(bone) + + #Thanks Enthralpy for the code to ensure that the arm/leg "gears" are moveable. + for bone in ['thigh_parent.L', 'thigh_parent.R', 'upper_arm_parent.L', 'upper_arm_parent.R']: + this_obj.pose.bones[bone].custom_shape_transform = None + this_obj.pose.bones[bone].lock_location[0] = False + this_obj.pose.bones[bone].lock_location[1] = False + this_obj.pose.bones[bone].lock_location[2] = False + this_obj.pose.bones[bone].lock_rotation_w = False + this_obj.pose.bones[bone].lock_rotation[0] = False + this_obj.pose.bones[bone].lock_rotation[1] = False + this_obj.pose.bones[bone].lock_rotation[2] = False + this_obj.pose.bones[bone].lock_scale[0] = False + this_obj.pose.bones[bone].lock_scale[1] = False + this_obj.pose.bones[bone].lock_scale[2] = False + + # Customize bones + this_obj.pose.bones[bone].custom_shape = bpy.data.objects["setting-circle"] + this_obj.pose.bones[bone].custom_shape_scale_xyz=(0.5,0.5,0.5) + this_obj.pose.bones[bone].use_custom_shape_bone_size = False + + if "upper_arm" in bone: + if ".L" in bone: + this_obj.pose.bones[bone].custom_shape_translation=(-0.05,0.0,0.0) + this_obj.pose.bones[bone].custom_shape_rotation_euler=(0,-1.5708,0) + this_obj.pose.bones[bone].custom_shape_transform = this_obj.pose.bones["MCH-upper_arm_parent_widget.L"] + else: + this_obj.pose.bones[bone].custom_shape_translation=(0.05,0.0,0.0) + this_obj.pose.bones[bone].custom_shape_rotation_euler=(0,-1.5708,0) + this_obj.pose.bones[bone].custom_shape_transform = this_obj.pose.bones["MCH-upper_arm_parent_widget.R"] + else: + if ".L" in bone: + this_obj.pose.bones[bone].custom_shape_translation=(0.1,0,0) + this_obj.pose.bones[bone].custom_shape_rotation_euler=(-0.0820305, -1.5708, 0) + this_obj.pose.bones[bone].custom_shape_transform = this_obj.pose.bones["MCH-thigh_parent_widget.L"] + else: + this_obj.pose.bones[bone].custom_shape_translation=(-0.1,0,0) + this_obj.pose.bones[bone].custom_shape_rotation_euler=(-0.0820305, 1.5708, 0) + this_obj.pose.bones[bone].custom_shape_transform = this_obj.pose.bones["MCH-thigh_parent_widget.R"] + + # ENABLE CONSTRAINTS AGAIN HERE + if use_head_tracker: + this_obj.pose.bones["MCH-head-controller-parent"].constraints[0].enabled = True + this_obj.pose.bones["MCH-forearm_tweak-pin.parent.L"].constraints[0].enabled = True + this_obj.pose.bones["MCH-forearm_tweak-pin.parent.R"].constraints[0].enabled = True + this_obj.pose.bones["MCH-shin_tweak-pin.parent.L"].constraints[0].enabled = True + this_obj.pose.bones["MCH-shin_tweak-pin.parent.R"].constraints[0].enabled = True + this_obj.pose.bones["MCH-torso.parent"].constraints[0].enabled = True + + # Deselect everything, we're done. + for bone in bpy.context.active_object.pose.bones: + bone.bone.select = False + + # EDITING ui.py TEXT FILE -------------------------------------------- + rig_file = bpy.data.texts[original_name+'_ui.py'] # Rig script for this char in question + + # Convert it to text + rig_text = rig_file.as_string() + complete_rig_text = rig_text + # My disclaimer, out of respect for modifying Rigify core's script + rig_text_disclaimer = "\n# This RigUI script has been modified by Llama for use with Genshin Impact characters using a custom made rig. Any issues arising as a result of these modifications are not indicitive of Rigify's original functionalities. \n# Rigify's writers bare no responsibility for issues/errors made here. Additionally, these modifications have been made to improve the custom made rigs for Genshin Impact characters, meaning that\n# attempting to use this script elsewhere for characters/models/skeletons it was NOT intended to be used with, could yield improper or erroneous results - of which neither Rigify's development team nor I, am responsible for. \n\n# Otherwise, if you are seeing this disclaimer with a Hoyoverse character made with the proper addons, run this as needed. (Such as after appending to build the rig layers)\n# Do NOT however, attempt to use this rig in another version of blender than what it was made in. (3.6.X rigs will NOT work adequately in 4.X or beyond; and 4.X rigs will not work in previous versions before 4.0)\n" + + # MODIFICATIONS to the text file are made here: + # Get the ID of this char's rig ui script. + rig_char_id = rig_text.split("rig_id = \"")[1].split("\"")[0] + + def make_layer_str(text, layer, version): + string3 = "row.prop(context.active_object.data, 'layers', index="+str(layer)+", toggle=True, text='"+text+"')" + string4 = "row.prop(collection[\""+text+"\"], 'is_visible', toggle=True, text='"+text+"')" + + if version == 4: + return string4 + else: + return string3 + + def layers_to_generate(vers): + str = "\n row=col.row()\n "+make_layer_str("Tweaks", 2, vers)+"\n row=col.row()\n "+make_layer_str("Pivots & Pins", 19, vers)+"\n row = col.row()\n "+make_layer_str("Offsets", 26, vers)+"\n row = col.row()\n "+make_layer_str("Props", 21, vers)+"\n row = col.row()\n row.separator()\n row = col.row()\n row.separator()\n row = col.row()\n "+make_layer_str("Face", 0, vers)+"\n row = col.row()\n "+make_layer_str("Torso (IK)", 3, vers)+"\n row = col.row()\n "+make_layer_str("Torso (FK)",4,vers)+"\n row = col.row()\n "+make_layer_str("Fingers", 5, vers)+"\n row = col.row()\n "+make_layer_str("Fingers (Detail)", 6, vers)+"\n row = col.row()\n "+make_layer_str("Arm.L (IK)", 7, vers)+"\n "+make_layer_str("Arm.R (IK)", 10, vers)+"\n row = col.row()\n "+make_layer_str("Arm.L (FK)", 8, vers)+"\n "+make_layer_str("Arm.R (FK)", 11, vers)+"\n row = col.row()\n "+make_layer_str("Leg.L (IK)", 13, vers)+"\n "+make_layer_str("Leg.R (IK)", 16, vers)+"\n row = col.row()\n "+make_layer_str("Leg.L (FK)", 14, vers)+"\n "+make_layer_str("Leg.R (FK)", 17, vers)+"\n row = col.row()\n row.separator()\n row = col.row()\n row.separator()\n row = col.row()\n "+make_layer_str("Root", 28, vers)+"\n row = col.row()\n "+make_layer_str("Physics", 20, vers)+"\n row = col.row()\n "+make_layer_str("Cage", 24, vers)+"\n "+make_layer_str("Other", 25, vers) + + return str + + # Function to add layer to rigUI. This should add it to both 3.6 and 4.0 versions of the UI. + def generate_rig_layers(): + # Add the physics button to the UI # text=v_str+" rig for " + char_name + rig_add_layer_code = "\n layout = self.layout\n col = layout.column()\n row = col.row()\n v_str = \""+bpy.app.version_string+"\"\n if not v_str[0] == \"4\" and bpy.app.version_string[0] == \"3\":\n row.label(text=v_str+\" rig for "+char_name.split("Costume")[0]+"\")\n "+layers_to_generate(3)+"\n elif v_str[0] == \"4\" and bpy.app.version_string[0] == \"4\":\n row.label(text=v_str+\" rig for "+char_name.split("Costume")[0]+"\")\n # If you have duplicate armatures of the same character (if you see .001 or similar) in one scene,\n # Please change the name below to what it is in the Outliner so that you can rig all your characters :)\n # (It's the green person symbol in your rig)\n collection = bpy.data.armatures[\""+original_name+"\"].collections\n "+layers_to_generate(4)+"\n else:\n row.label(text=\"ERROR: Version mismatch!\")\n row = col.row()\n row.label(text=\"Your rig was made in a version of Blender/Goo Engine that is not compatible!\")\n row = col.row()\n row.label(text=\"Please remake your rig for this version!\")" + cut_rig_layer = rig_text.split("class RigLayers(bpy.types.Panel):") + separate_draw_func = cut_rig_layer[1].split("def draw(self, context):") + separate_draw_end = separate_draw_func[1].split("def register():") + + merged_layer_code = cut_rig_layer[0]+"class RigLayers(bpy.types.Panel):"+separate_draw_func[0]+"def draw(self, context):"+rig_add_layer_code+"\ndef register():"+separate_draw_end[1] + + return merged_layer_code + + complete_rig_text = generate_rig_layers() + + # These functions make it easy to quickly write to the text file. Use as needed. + def generate_string_for_limb_pin(pin_bone, gear_bone, tweak_bone, text): + str = "\n if is_selected({'"+pin_bone+"'}):\n layout.prop(pose_bones['"+tweak_bone+"'], '[\"tweak_pin\"]', text='"+text+"', slider=True)\n if is_selected({'"+gear_bone+"'}):\n layout.prop(pose_bones['"+tweak_bone+"'], '[\"tweak_pin\"]', text='"+text+"', slider=True)" + return str + + def generate_string_for_parent_switch(bone): + str = "\n if is_selected({'"+bone+"'}):\n group1 = layout.row(align=True)\n group2 = group1.split(factor=0.75, align=True)\n props = group2.operator('pose.rigify_switch_parent_"+rig_char_id+"\', text=\'Parent Switch\', icon=\'DOWNARROW_HLT\')\n props.bone = \'"+bone+"\'\n props.prop_bone = \'"+bone+"\'\n props.prop_id=\'parent_switch\'\n props.parent_names = '[\"None\", \"root\", \"root.001\", \"root.002\", \"torso\", \"chest\"]'\n props.locks = (False, False, False)\n group2.prop(pose_bones['"+bone+"'], '[\"parent_switch\"]', text='')\n props = group1.operator('pose.rigify_switch_parent_bake_"+rig_char_id+"', text='', icon='ACTION_TWEAK')\n props.bone = '"+bone+"'\n props.prop_bone='"+bone+"'\n props.prop_id='parent_switch'\n props.parent_names='[\"None\", \"root\", \"root.001\", \"root.002\", \"torso\", \"chest\"]'\n props.locks = (False, False, False)" + return str + # Used for already existing bones (torso and limbs) + def generate_string_for_ik_switch(bone, prop1, prop2): + str = "\n if is_selected({'"+bone+"'}):\n group1 = layout.row(align=True)\n group2 = group1.split(factor=0.75, align=True)\n props = group2.operator('pose.rigify_switch_parent_"+rig_char_id+"\', text=\'Parent Switch\', icon=\'DOWNARROW_HLT\')\n props.bone = \'"+prop1+"\'\n props.prop_bone = \'"+prop2+"\'\n props.prop_id=\'IK_parent\'\n props.parent_names = '[\"None\", \"root\", \"root.001\", \"root.002\", \"torso\", \"chest\"]'\n props.locks = (False, False, False)\n group2.prop(pose_bones['"+prop2+"'], '[\"IK_parent\"]', text='')\n props = group1.operator('pose.rigify_switch_parent_bake_"+rig_char_id+"', text='', icon='ACTION_TWEAK')\n props.bone = '"+prop1+"'\n props.prop_bone='"+prop2+"'\n props.prop_id='IK_parent'\n props.parent_names='[\"None\", \"root\", \"root.001\", \"root.002\", \"torso\", \"chest\"]'\n props.locks = (False, False, False)" + return str + + # because rigify makes the rig ui before i get to it, we have to change this stuff for the torso sliders below. + def torso_str(): + torso="\n props.bone = 'torso.002'\n props.prop_bone = 'torso.002'\n props.prop_id = 'torso_parent'\n props.parent_names = '[\"None\", \"Root\"]'\n props.locks = (False, False, False)\n group2.prop(pose_bones['torso.002'], '[\"torso_parent\"]', text='')\n props = group1.operator('pose.rigify_switch_parent_bake_"+rig_char_id+"', text='', icon='ACTION_TWEAK')\n props.bone = 'torso.002'\n props.prop_bone = 'torso.002'\n props.prop_id = 'torso_parent'\n props.parent_names = '[\"None\", \"Root\"]'\n props.locks = (False, False, False)" + return torso + + def torso_repair(): + cut = complete_rig_text.split("props = group2.operator('pose.rigify_switch_parent_"+rig_char_id+"', text='Torso Parent', icon='DOWNARROW_HLT')") + second_str = "if is_selected({'foot_fk.L', 'foot_ik.L', 'thigh_ik_target.L', 'foot_tweak.L', 'shin_tweak.L', 'foot_heel_ik.L', 'thigh_ik.L', 'VIS_thigh_ik_pole.L', 'toe_fk.L', 'shin_fk.L', 'thigh_parent.L', 'foot_spin_ik.L', 'thigh_fk.L', 'toe_ik.L', 'thigh_tweak.L', 'thigh_tweak.L.001', 'shin_tweak.L.001'}):" + second_half = cut[1] + new_cut = second_half.split(second_str) + final = new_cut[1] + + merged_text = cut[0]+"props = group2.operator('pose.rigify_switch_parent_"+rig_char_id+"', text='Torso Parent', icon='DOWNARROW_HLT')"+torso_str()+second_str+final + + return merged_text + + # give this a position in the text file (a string to look for), after that position it'll add the text passed in + def splice_into_text(divider, text): + split = complete_rig_text.split(divider) + return split[0]+divider+text+split[1] + + # If head controller, add the rig main controls for it. + if use_head_tracker: + complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_parent_switch("head-controller")) + + # Make the limb edits + # Below is the emergency cut for the torso repair. (WHY rigify?!?!?) + + #complete_rig_text = complete_rig_text.replace("props.bone = 'torso'","props.bone = 'torso.002'").replace("props.prop_bone = 'torso'","props.prop_bone = 'torso.002'").replace("group2.prop(pose_bones['torso'], '[\"torso_parent\"]', text='')","group2.prop(pose_bones['torso.002'], '[\"torso_parent\"]', text='')") + + complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_parent_switch("forearm_tweak-pin.L")) + complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_limb_pin("forearm_tweak-pin.L","upper_arm_parent.L","forearm_tweak.L","Elbow Pin")) + complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_parent_switch("forearm_tweak-pin.R")) + complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_limb_pin("forearm_tweak-pin.R","upper_arm_parent.R","forearm_tweak.R","Elbow Pin")) + + complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_ik_switch("hand_ik_pivot.L","hand_ik.L","upper_arm_parent.L")) + complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_ik_switch("hand_ik_pivot.R","hand_ik.R","upper_arm_parent.R")) + complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_ik_switch("foot_ik_pivot.L","foot_ik.L","thigh_parent.L")) + complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_ik_switch("foot_ik_pivot.R","foot_ik.R","thigh_parent.R")) + + + complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_parent_switch("shin_tweak-pin.L")) + complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_limb_pin("shin_tweak-pin.L","thigh_parent.L","shin_tweak.L","Knee Pin")) + complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_parent_switch("shin_tweak-pin.R")) + complete_rig_text = splice_into_text("num_rig_separators[0] += 1", generate_string_for_limb_pin("shin_tweak-pin.R","thigh_parent.R","shin_tweak.R","Knee Pin")) + + # Clear the text from the text block, reassemble it as needed with strings and modifications. + rig_file.clear() + rig_file.write(complete_rig_text) + rig_file.write(rig_text_disclaimer) + + + # After all text block modifications, run the new edited script. + ctx = bpy.context.copy() + ctx['edit_text'] = rig_file + with bpy.context.temp_override(edit_text=rig_file): + bpy.ops.text.run_script() + + # DONE MODIFYING ui.py FILE -------------------------------------------- + + # Post modification, Adjustment of bone layers/collections. + if not is_version_4: + for x in range(29): + if x>0: + bpy.context.object.data.layers[x] = False + + # Disable/Enable Rig UI layers we care about + bpy.context.object.data.layers[0] = True + bpy.context.object.data.layers[3] = True + bpy.context.object.data.layers[4] = False + bpy.context.object.data.layers[5] = True + bpy.context.object.data.layers[6] = False + bpy.context.object.data.layers[7] = True + bpy.context.object.data.layers[8] = False + bpy.context.object.data.layers[10] = True + bpy.context.object.data.layers[11] = False + bpy.context.object.data.layers[13] = True + bpy.context.object.data.layers[14] = False + bpy.context.object.data.layers[16] = True + bpy.context.object.data.layers[17] = False + bpy.context.object.data.layers[21] = True + bpy.context.object.data.layers[28] = True + bpy.context.object.data.layers[26] = True + else: + bpy.context.object.data.collections["Tweaks"].is_visible = False + bpy.context.object.data.collections["Pivots & Pins"].is_visible = False + bpy.context.object.data.collections["Torso (FK)"].is_visible = False + bpy.context.object.data.collections["Fingers (Detail)"].is_visible = False + bpy.context.object.data.collections["Arm.L (FK)"].is_visible = False + bpy.context.object.data.collections["Arm.R (FK)"].is_visible = False + bpy.context.object.data.collections["Leg.L (FK)"].is_visible = False + bpy.context.object.data.collections["Leg.R (FK)"].is_visible = False + bpy.context.object.data.collections["Physics"].is_visible = False + bpy.context.object.data.collections["Cage"].is_visible = False + bpy.context.object.data.collections["Other"].is_visible = False + + # Send the given bone to its new location for either version. Adjusted for actual layer num. + # MOVING OF BONES BELOW ------------------------------- + def bone_to_layer(bone, layer, collection, second_coll="None"): + arm = bpy.context.object + if bone in arm.data.bones: + if is_version_4: + if collection == "Other": + bpy.context.object.data.collections[collection].assign(bpy.context.object.data.bones[bone]) + else: + bpy.context.object.data.collections[collection].assign(bpy.context.object.data.bones[bone]) + bpy.context.object.data.collections["Other"].unassign(bpy.context.object.data.bones[bone]) + if second_coll != "None": + bpy.context.object.data.collections[second_coll].assign(bpy.context.object.data.bones[bone]) + else: + move_bone(bone,layer) + + # Since we've looped through ever 4.0 bone to place in 'other' above, we'll have to do so as well for 3.6 + if not is_version_4: + for bone in bpy.context.active_object.pose.bones: + bone_to_layer(bone.name, 25, "Other") + + loop_arm = bpy.context.object.data + for bone in loop_arm.bones: + if "tweak" in bone.name and "MCH" not in bone.name and "pin" not in bone.name: + bone_to_layer(bone.name, 2, "Tweaks") + + # Moving to Tweaks (werent catched in loop) + bone_to_layer("tweak_spine", 2, "Tweaks") + bone_to_layer("tweak_spine.001", 2, "Tweaks") + bone_to_layer("tweak_spine.002", 2, "Tweaks") + bone_to_layer("tweak_spine.003", 2, "Tweaks") + bone_to_layer("tweak_spine.004", 2, "Tweaks") + bone_to_layer("tweak_spine.005", 2, "Tweaks") + # MOVING PIVOTS AND PINS + bone_to_layer("torso_pivot.002", 19, "Pivots & Pins") + bone_to_layer("forearm_tweak-pin.L", 19, "Pivots & Pins") + bone_to_layer("hand_ik_pivot.L", 19, "Pivots & Pins") + bone_to_layer("hand_ik_pivot.R", 19, "Pivots & Pins") + bone_to_layer("forearm_tweak-pin.R", 19, "Pivots & Pins") + bone_to_layer("shin_tweak-pin.L", 19, "Pivots & Pins") + bone_to_layer("shin_tweak-pin.R", 19, "Pivots & Pins") + bone_to_layer("foot_ik_pivot.L", 19, "Pivots & Pins") + bone_to_layer("foot_ik_pivot.R", 19, "Pivots & Pins") + + # MOVING FACE + bone_to_layer("plate-settings", 0, "Face") + bone_to_layer("plate-border", 0, "Face") + bone_to_layer("Plate", 0, "Face") + bone_to_layer("eyetrack", 0, "Face") + if use_head_tracker: + bone_to_layer("head-controller", 0, "Face") + else: + bone_to_layer("head-controller", 25, "Other") + bone_to_layer("eyetrack_L", 0, "Face") + bone_to_layer("eyetrack_R", 0, "Face") + + # Disable selection of face bone + selected_bone = faceplate_arm.pose.bones["Plate"] + selected_bone.bone.hide_select = True + + bone_to_layer("Brow-Trouble-R-Control", 0, "Face") + bone_to_layer("Brow-Trouble-L-Control", 0, "Face") + bone_to_layer("Brow-Shy-R-Control", 0, "Face") + bone_to_layer("Brow-Shy-L-Control", 0, "Face") + bone_to_layer("Brow-Angry-R-Control", 0, "Face") + bone_to_layer("Brow-Angry-L-Control", 0, "Face") + bone_to_layer("Brow-Smily-R-Control", 0, "Face") + bone_to_layer("Brow-Smily-L-Control", 0, "Face") + bone_to_layer("Brow-R-Control", 0, "Face") + bone_to_layer("Brow-L-Control", 0, "Face") + + bone_to_layer("Eye-Up-Control", 0, "Face") + bone_to_layer("Eye-Tired-Control", 0, "Face") + bone_to_layer("Eye-Wail-Control", 0, "Face") + bone_to_layer("Eye-Ha-Control", 0, "Face") + bone_to_layer("Wink-Control-R", 0, "Face") + bone_to_layer("Eye-WinkA-Control", 0, "Face") + bone_to_layer("Eye-WinkB-Control", 0, "Face") + bone_to_layer("Eye-WinkC-Control", 0, "Face") + bone_to_layer("Wink-Control-L", 0, "Face") + bone_to_layer("Eye-Down-Control", 0, "Face") + bone_to_layer("Eye-Jito-Control", 0, "Face") + bone_to_layer("Eye-Hostility-Control", 0, "Face") + bone_to_layer("Eye-LowerEyelid-Control", 0, "Face") + bone_to_layer("Eye-Star-Control", 0, "Face") + bone_to_layer("Eye-Pupil-Control", 0, "Face") + + bone_to_layer("Mouth-Control", 0, "Face") + bone_to_layer("Mouth-Smile1-Control", 0, "Face") + bone_to_layer("Mouth-Smile2-Control", 0, "Face") + bone_to_layer("Mouth-Angry1-Control", 0, "Face") + bone_to_layer("Mouth-Angry2-Control", 0, "Face") + bone_to_layer("Mouth-Angry3-Control", 0, "Face") + bone_to_layer("Mouth-Fury1-Control", 0, "Face") + bone_to_layer("Mouth-Doya1-Control", 0, "Face") + bone_to_layer("Mouth-Doya2-Control", 0, "Face") + bone_to_layer("Mouth-Pero1-Control", 0, "Face") + bone_to_layer("Mouth-Pero2-Control", 0, "Face") + bone_to_layer("Mouth-Neko1-Control", 0, "Face") + bone_to_layer("Mouth-Default-Control", 0, "Face") + + # Moving Torso + bone_to_layer("head", 3, "Torso (IK)") + bone_to_layer("neck", 3, "Torso (IK)") + bone_to_layer("chest", 3, "Torso (IK)") + bone_to_layer("torso", 3, "Torso (IK)") + bone_to_layer("torso.001", 26, "Offsets") + bone_to_layer("torso.002", 26, "Offsets") + bone_to_layer("hips", 3, "Torso (IK)") + + bone_to_layer("spine_fk.003", 4, "Torso (FK)") + bone_to_layer("spine_fk.002", 4, "Torso (FK)") + bone_to_layer("spine_fk.001", 4, "Torso (FK)") + bone_to_layer("spine_fk", 4, "Torso (FK)") + + # Moving Fingers + bone_to_layer("thumb.01_master.L", 5, "Fingers") + bone_to_layer("thumb.01_master.R", 5, "Fingers") + bone_to_layer("f_index.01_master.L", 5, "Fingers") + bone_to_layer("f_index.01_master.R", 5, "Fingers") + bone_to_layer("f_middle.01_master.L", 5, "Fingers") + bone_to_layer("f_middle.01_master.R", 5, "Fingers") + bone_to_layer("f_ring.01_master.L", 5, "Fingers") + bone_to_layer("f_ring.01_master.R", 5, "Fingers") + bone_to_layer("f_pinky.01_master.L", 5, "Fingers") + bone_to_layer("f_pinky.01_master.R", 5, "Fingers") + + bone_to_layer("thumb.01.L", 6, "Fingers (Detail)") + bone_to_layer("thumb.01.R", 6, "Fingers (Detail)") + bone_to_layer("thumb.02.L", 6, "Fingers (Detail)") + bone_to_layer("thumb.02.R", 6, "Fingers (Detail)") + bone_to_layer("thumb.03.L", 6, "Fingers (Detail)") + bone_to_layer("thumb.03.R", 6, "Fingers (Detail)") + bone_to_layer("thumb.01.L.001", 6, "Fingers (Detail)") + bone_to_layer("thumb.01.R.001", 6, "Fingers (Detail)") + bone_to_layer("f_index.01.L", 6, "Fingers (Detail)") + bone_to_layer("f_index.01.R", 6, "Fingers (Detail)") + bone_to_layer("f_index.02.L", 6, "Fingers (Detail)") + bone_to_layer("f_index.02.R", 6, "Fingers (Detail)") + bone_to_layer("f_index.03.L", 6, "Fingers (Detail)") + bone_to_layer("f_index.03.R", 6, "Fingers (Detail)") + bone_to_layer("f_index.01.L.001", 6, "Fingers (Detail)") + bone_to_layer("f_index.01.R.001", 6, "Fingers (Detail)") + bone_to_layer("f_middle.01.L", 6, "Fingers (Detail)") + bone_to_layer("f_middle.01.R", 6, "Fingers (Detail)") + bone_to_layer("f_middle.02.L", 6, "Fingers (Detail)") + bone_to_layer("f_middle.02.R", 6, "Fingers (Detail)") + bone_to_layer("f_middle.03.L", 6, "Fingers (Detail)") + bone_to_layer("f_middle.03.R", 6, "Fingers (Detail)") + bone_to_layer("f_middle.01.L.001", 6, "Fingers (Detail)") + bone_to_layer("f_middle.01.R.001", 6, "Fingers (Detail)") + bone_to_layer("f_ring.01.L", 6, "Fingers (Detail)") + bone_to_layer("f_ring.01.R", 6, "Fingers (Detail)") + bone_to_layer("f_ring.02.L", 6, "Fingers (Detail)") + bone_to_layer("f_ring.02.R", 6, "Fingers (Detail)") + bone_to_layer("f_ring.03.L", 6, "Fingers (Detail)") + bone_to_layer("f_ring.03.R", 6, "Fingers (Detail)") + bone_to_layer("f_ring.01.L.001", 6, "Fingers (Detail)") + bone_to_layer("f_ring.01.R.001", 6, "Fingers (Detail)") + bone_to_layer("f_pinky.01.L", 6, "Fingers (Detail)") + bone_to_layer("f_pinky.01.R", 6, "Fingers (Detail)") + bone_to_layer("f_pinky.02.L", 6, "Fingers (Detail)") + bone_to_layer("f_pinky.02.R", 6, "Fingers (Detail)") + bone_to_layer("f_pinky.03.L", 6, "Fingers (Detail)") + bone_to_layer("f_pinky.03.R", 6, "Fingers (Detail)") + bone_to_layer("f_pinky.01.L.001", 6, "Fingers (Detail)") + bone_to_layer("f_pinky.01.R.001", 6, "Fingers (Detail)") + + # Pass in a list, all of those bones will be moved accordingly. + def fast_bone_move(bone_list, layer, collection): + for bone in bone_list: + bone_to_layer(bone, layer, collection) + + # Refactoring old bone move functionalities + list_move_to_other = ["+UpperArmTwistA02.L","+UpperArmTwistA01.L","+UpperArmTwistA01.R","+UpperArmTwistA02.R","eye.R","eye.L","+ToothBone D A01","+ToothBone U A01","+ToothBone A A01"] + fast_bone_move(list_move_to_other, 25, "Other") + + if toe_bones_exist: + bone_to_layer("toe_ik.L", 13, "Leg.L (IK)") + bone_to_layer("toe_ik.R", 16, "Leg.R (IK)") + else: + bone_to_layer("toe_ik.L", 25, "Other") + bone_to_layer("toe_ik.R", 25, "Other") + + if use_arm_ik_poles: + bone_to_layer("upper_arm_ik.L", 25, "Other") + bone_to_layer("upper_arm_ik.R", 25, "Other") + else: + bone_to_layer("upper_arm_ik.L", 7, "Arm.L (IK)") + bone_to_layer("upper_arm_ik.R", 10, "Arm.R (IK)") + + if use_leg_ik_poles: + bone_to_layer("thigh_ik.L", 25, "Other") + bone_to_layer("thigh_ik.R", 25, "Other") + else: + bone_to_layer("thigh_ik.L", 13, "Leg.L (IK)") + bone_to_layer("thigh_ik.R", 16, "Leg.R (IK)") + + try: + bone_to_layer("+EyeBone L A01.001", 25, "Other") + bone_to_layer("+EyeBone R A01.001", 25, "Other") + except: + pass + + if not use_head_tracker: + bone_to_layer("head-controller", 25, "Other") + + if no_eyes: + bone_to_layer("eyetrack",25,"Other") + bone_to_layer("eyetrack_L",25,"Other") + bone_to_layer("eyetrack_R",25,"Other") + + # New bones, post append + list_to_send_other = ["MCH-thigh_ik_target_sub.L","MCH-thigh_ik_target_sub.R","MCH-foot_ik_pivot.L","MCH-foot_ik_pivot.R","MCH-hand_ik_pivot.L","MCH-hand_ik_pivot.R","MCH-hand_ik_wrist.L","MCH-hand_ik_wrist.R","MCH-torso_pivot.002","shoulder_driver.R","shoulder_driver.L","MCH-shoulder_follow.R","MCH-shoulder_follow.L"] + + fast_bone_move(list_to_send_other,25,"Other") + + send_to_pivots = ["foot_ik_pivot.L","foot_ik_pivot.R","hand_ik_pivot.L","hand_ik_pivot.R","torso_pivot.002","forearm_tweak-pin.L","forearm_tweak-pin.R","shin_tweak-pin.L","shin_tweak-pin.R"] + fast_bone_move(send_to_pivots, 19, "Pivots & Pins") + + bone_to_layer("root.002", 28, "Root") + bone_to_layer("root.001", 26, "Offsets") + bone_to_layer("root", 26, "Offsets") + + bone_to_layer("hand_ik.L",7,"Arm.L (IK)") + bone_to_layer("hand_ik_wrist.L",26,"Offsets") + bone_to_layer("upper_arm_parent.L",[7,8],"Arm.L (IK)","Arm.L (FK)") + bone_to_layer("upper_arm_ik_target.L",7,"Arm.L (IK)") + bone_to_layer("shoulder.L",[7,8],"Arm.L (IK)","Arm.L (FK)") + + bone_to_layer("hand_ik.R",10,"Arm.R (IK)") + bone_to_layer("upper_arm_parent.R",[10,11],"Arm.R (IK)","Arm.R (FK)") + bone_to_layer("hand_ik_wrist.R",26,"Offsets") + bone_to_layer("upper_arm_ik_target.R",10,"Arm.R (IK)") + bone_to_layer("shoulder.R",[10,11],"Arm.R (IK)","Arm.R (FK)") + + bone_to_layer("upper_arm_fk.L",8,"Arm.L (FK)") + bone_to_layer("forearm_fk.L",8,"Arm.L (FK)") + bone_to_layer("hand_fk.L",8,"Arm.L (FK)") + + bone_to_layer("upper_arm_fk.R",11,"Arm.R (FK)") + bone_to_layer("forearm_fk.R",11,"Arm.R (FK)") + bone_to_layer("hand_fk.R",11,"Arm.R (FK)") + + bone_to_layer("foot_ik.L",13,"Leg.L (IK)") + bone_to_layer("thigh_parent.L",[13,14],"Leg.L (IK)","Leg.L (FK)") + bone_to_layer("thigh_ik_target.L",13,"Leg.L (IK)") + bone_to_layer("foot_ik_sub.L",26,"Offsets") + bone_to_layer("foot_spin_ik.L",13,"Leg.L (IK)") + bone_to_layer("foot_heel_ik.L",13,"Leg.L (IK)") + + bone_to_layer("thigh_fk.L",14,"Leg.L (FK)") + bone_to_layer("shin_fk.L",14,"Leg.L (FK)") + bone_to_layer("foot_fk.L",14,"Leg.L (FK)") + bone_to_layer("toe_fk.L",14,"Leg.L (FK)") + + bone_to_layer("foot_ik.R",16,"Leg.R (IK)") + bone_to_layer("thigh_parent.R",[16,17],"Leg.R (IK)","Leg.R (FK)") + bone_to_layer("thigh_ik_target.R",16,"Leg.R (IK)") + bone_to_layer("foot_ik_sub.R",26,"Offsets") + bone_to_layer("foot_spin_ik.R",16,"Leg.R (IK)") + bone_to_layer("foot_heel_ik.R",16,"Leg.R (IK)") + + bone_to_layer("thigh_fk.R",17,"Leg.R (FK)") + bone_to_layer("shin_fk.R",17,"Leg.R (FK)") + bone_to_layer("foot_fk.R",17,"Leg.R (FK)") + bone_to_layer("toe_fk.R",17,"Leg.R (FK)") + + bone_to_layer("breast.L",20,"Physics") + bone_to_layer("breast.R",20,"Physics") + + bone_to_layer("prop.L",21,"Props") + bone_to_layer("prop.R",21,"Props") + + def loop_place_physics(): + if is_version_4: + armature = bpy.context.object.data + collections = armature.collections + + for bone in armature.bones: + # The gods of the universe have blessed us with every physics bone starting with "+". We just do some extra filtering and we got what we need. + if bone.name[0] == "+" and "Twist" not in bone.name and "ToothBone" not in bone.name and "EyeBone" not in bone.name: + bone_to_layer(bone.name,20,"Physics") + else: + for bone in bpy.context.active_object.pose.bones: + if bone.name[0] == "+" and "Twist" not in bone.name and "ToothBone" not in bone.name and "EyeBone" not in bone.name: + bone_to_layer(bone.name,20,"Physics") + + loop_place_physics() + + def loop_place_def(): + # Handpicked bones to serve as the def layer. + list_custom_skel = ["DEF-thigh.L", "DEF-thigh.R","DEF-shin.L","DEF-shin.R","DEF-foot.L","DEF-foot.R","DEF-spine.001","DEF-spine.002","DEF-spine.003","DEF-spine.004","DEF-spine.006","+UpperArmTwistA02.L","+UpperArmTwistA02.R","DEF-forearm.L","DEF-forearm.R","DEF-hand.R","DEF-hand.L","DEF-shoulder.R","DEF-shoulder.L"] + + for bone in list_custom_skel: + bone_to_layer(bone,24,"Cage") + + # Otherwise, anything picked up by VG scan, enable below and disable above. + #for bone in armature.bones: + # if bone.name in vertex_groups_list: + # bone_to_layer(bone.name,24,"Cage") + + + loop_place_def() + + # MOVING OF BONES END ------------------------------- + +def setup_neck_and_head_follow(neck_follow_value, head_follow_value): + bpy.context.object.pose.bones["torso"]["neck_follow"] = neck_follow_value + bpy.context.object.pose.bones["torso"]["head_follow"] = head_follow_value + + +# Make it so that the finger scale controls can be scaled on the X axis to curl in just the fingertips instead of the entire finger. +def setup_finger_scale_controls_on_x_axis_to_curl_just_the_fingertips(rigified_rig): + bpy.ops.object.mode_set(mode='POSE') + + for oDrv in rigified_rig.animation_data.drivers: + for variable in oDrv.driver.variables: + for target in variable.targets: + if ".03" in oDrv.data_path and target.data_path[-7:] == "scale.y": + target.data_path = target.data_path[:-1] + "x" + + + fingerlist = ["thumb.01_master", "f_index.01_master", "f_middle.01_master", "f_ring.01_master", "f_pinky.01_master"] + for side in [".L", ".R"]: + for bone in fingerlist: + rigified_rig.pose.bones[bone + side].lock_scale[0] = False