diff --git a/addon dev/mabulig-rigger/__init__.py b/addon dev/mabulig-rigger/__init__.py index cc3c98d..6ce17bc 100644 --- a/addon dev/mabulig-rigger/__init__.py +++ b/addon dev/mabulig-rigger/__init__.py @@ -1,7 +1,7 @@ bl_info = { "name": "Mabulig Rigger Plugin", "author": "Fritz Villahermosa", - "version": (1, 0), + "version": (1, 1), "blender": (5, 2, 0), "location": "View3D > Sidebar > Mabulig Rigger", "description": "Frog rigging made simple!", diff --git a/addon dev/mabulig-rigger/__pycache__/__init__.cpython-313.pyc b/addon dev/mabulig-rigger/__pycache__/__init__.cpython-313.pyc index 8cbb975..4a02f50 100644 Binary files a/addon dev/mabulig-rigger/__pycache__/__init__.cpython-313.pyc and b/addon dev/mabulig-rigger/__pycache__/__init__.cpython-313.pyc differ diff --git a/addon dev/mabulig-rigger/__pycache__/bones_fingers_struct.cpython-313.pyc b/addon dev/mabulig-rigger/__pycache__/bones_fingers_struct.cpython-313.pyc index 8466007..060ac9c 100644 Binary files a/addon dev/mabulig-rigger/__pycache__/bones_fingers_struct.cpython-313.pyc and b/addon dev/mabulig-rigger/__pycache__/bones_fingers_struct.cpython-313.pyc differ diff --git a/addon dev/mabulig-rigger/__pycache__/bones_ik_struct.cpython-313.pyc b/addon dev/mabulig-rigger/__pycache__/bones_ik_struct.cpython-313.pyc new file mode 100644 index 0000000..c6001c7 Binary files /dev/null and b/addon dev/mabulig-rigger/__pycache__/bones_ik_struct.cpython-313.pyc differ diff --git a/addon dev/mabulig-rigger/__pycache__/bones_skel_struct.cpython-313.pyc b/addon dev/mabulig-rigger/__pycache__/bones_skel_struct.cpython-313.pyc index 86114db..9d08694 100644 Binary files a/addon dev/mabulig-rigger/__pycache__/bones_skel_struct.cpython-313.pyc and b/addon dev/mabulig-rigger/__pycache__/bones_skel_struct.cpython-313.pyc differ diff --git a/addon dev/mabulig-rigger/__pycache__/bones_toes_struct.cpython-313.pyc b/addon dev/mabulig-rigger/__pycache__/bones_toes_struct.cpython-313.pyc index fc839d5..4c09f06 100644 Binary files a/addon dev/mabulig-rigger/__pycache__/bones_toes_struct.cpython-313.pyc and b/addon dev/mabulig-rigger/__pycache__/bones_toes_struct.cpython-313.pyc differ diff --git a/addon dev/mabulig-rigger/__pycache__/bones_web_struct.cpython-313.pyc b/addon dev/mabulig-rigger/__pycache__/bones_web_struct.cpython-313.pyc index 063a02f..a06a921 100644 Binary files a/addon dev/mabulig-rigger/__pycache__/bones_web_struct.cpython-313.pyc and b/addon dev/mabulig-rigger/__pycache__/bones_web_struct.cpython-313.pyc differ diff --git a/addon dev/mabulig-rigger/__pycache__/controlrig_generate.cpython-313.pyc b/addon dev/mabulig-rigger/__pycache__/controlrig_generate.cpython-313.pyc index 4b4421f..dff088f 100644 Binary files a/addon dev/mabulig-rigger/__pycache__/controlrig_generate.cpython-313.pyc and b/addon dev/mabulig-rigger/__pycache__/controlrig_generate.cpython-313.pyc differ diff --git a/addon dev/mabulig-rigger/__pycache__/ctrl_bones_color_struct.cpython-313.pyc b/addon dev/mabulig-rigger/__pycache__/ctrl_bones_color_struct.cpython-313.pyc index 9d367f5..70ab54e 100644 Binary files a/addon dev/mabulig-rigger/__pycache__/ctrl_bones_color_struct.cpython-313.pyc and b/addon dev/mabulig-rigger/__pycache__/ctrl_bones_color_struct.cpython-313.pyc differ diff --git a/addon dev/mabulig-rigger/__pycache__/ctrl_bones_shape_struct.cpython-313.pyc b/addon dev/mabulig-rigger/__pycache__/ctrl_bones_shape_struct.cpython-313.pyc index 5e41a70..010ac12 100644 Binary files a/addon dev/mabulig-rigger/__pycache__/ctrl_bones_shape_struct.cpython-313.pyc and b/addon dev/mabulig-rigger/__pycache__/ctrl_bones_shape_struct.cpython-313.pyc differ diff --git a/addon dev/mabulig-rigger/__pycache__/ctrl_ik_struct.cpython-313.pyc b/addon dev/mabulig-rigger/__pycache__/ctrl_ik_struct.cpython-313.pyc new file mode 100644 index 0000000..53fd6b3 Binary files /dev/null and b/addon dev/mabulig-rigger/__pycache__/ctrl_ik_struct.cpython-313.pyc differ diff --git a/addon dev/mabulig-rigger/__pycache__/deform_bones_struct.cpython-313.pyc b/addon dev/mabulig-rigger/__pycache__/deform_bones_struct.cpython-313.pyc index 52b4365..bf832a7 100644 Binary files a/addon dev/mabulig-rigger/__pycache__/deform_bones_struct.cpython-313.pyc and b/addon dev/mabulig-rigger/__pycache__/deform_bones_struct.cpython-313.pyc differ diff --git a/addon dev/mabulig-rigger/__pycache__/ik_bones_struct.cpython-313.pyc b/addon dev/mabulig-rigger/__pycache__/ik_bones_struct.cpython-313.pyc index dca6828..c78f5a6 100644 Binary files a/addon dev/mabulig-rigger/__pycache__/ik_bones_struct.cpython-313.pyc and b/addon dev/mabulig-rigger/__pycache__/ik_bones_struct.cpython-313.pyc differ diff --git a/addon dev/mabulig-rigger/__pycache__/rigger_functionality.cpython-313.pyc b/addon dev/mabulig-rigger/__pycache__/rigger_functionality.cpython-313.pyc index 220574e..7d8ec9d 100644 Binary files a/addon dev/mabulig-rigger/__pycache__/rigger_functionality.cpython-313.pyc and b/addon dev/mabulig-rigger/__pycache__/rigger_functionality.cpython-313.pyc differ diff --git a/addon dev/mabulig-rigger/bones_ik_struct.py b/addon dev/mabulig-rigger/bones_ik_struct.py new file mode 100644 index 0000000..84951bd --- /dev/null +++ b/addon dev/mabulig-rigger/bones_ik_struct.py @@ -0,0 +1,27 @@ +# Position of Ctrl bone when Armature Adjust +bones_ik_data = [ + { + "bone_name": "ctrl_ik_arm_target_l", + "pos_helper": "elbow_l" + }, + { + "bone_name": "ctrl_ik_arm_target_r", + "pos_helper": "elbow_r" + }, + { + "bone_name": "ctrl_ik_hand_l", + "pos_helper": "wrist_l" + }, + { + "bone_name": "ctrl_ik_hand_r", + "pos_helper": "wrist_r" + }, + { + "bone_name": "ctrl_ik_foot_l", + "pos_helper": "heel_l" + }, + { + "bone_name": "ctrl_ik_foot_r", + "pos_helper": "heel_r" + } +] \ No newline at end of file diff --git a/addon dev/mabulig-rigger/bones_skel_struct.py b/addon dev/mabulig-rigger/bones_skel_struct.py index 4eea90d..f5c3b99 100644 --- a/addon dev/mabulig-rigger/bones_skel_struct.py +++ b/addon dev/mabulig-rigger/bones_skel_struct.py @@ -148,5 +148,25 @@ bones_data = [ "bone_name": "feet_r", "head_helper": "heel_r", "tail_helper": "foot_r" + }, + { + "bone_name": "mouth_01_l", + "head_helper": "mouth_01_l", + "tail_helper": "mouth_02_l" + }, + { + "bone_name": "mouth_02_l", + "head_helper": "mouth_02_l", + "tail_helper": "mouth_tip" + }, + { + "bone_name": "mouth_01_r", + "head_helper": "mouth_01_r", + "tail_helper": "mouth_02_r" + }, + { + "bone_name": "mouth_02_r", + "head_helper": "mouth_02_r", + "tail_helper": "mouth_tip" } ] \ No newline at end of file diff --git a/addon dev/mabulig-rigger/controlrig_generate.py b/addon dev/mabulig-rigger/controlrig_generate.py index 0d53108..03109d6 100644 --- a/addon dev/mabulig-rigger/controlrig_generate.py +++ b/addon dev/mabulig-rigger/controlrig_generate.py @@ -5,6 +5,7 @@ from . import ctrl_bones_shape_struct from . import ctrl_bones_color_struct from . import ik_bones_struct from . import deform_bones_struct +from . import ctrl_ik_struct # Modify Control Bone Shape Function @@ -41,6 +42,9 @@ def addIK(bone_name, ik_target, ik_pole_target, ik_chain, armature): pose_bone = armature.pose.bones.get(bone_name) if pose_bone: + for constraint in list(pose_bone.constraints): + pose_bone.constraints.remove(constraint) + ik_constraint = pose_bone.constraints.new(type='IK') ik_constraint.target = armature ik_constraint.subtarget = ik_target @@ -58,11 +62,30 @@ def addCopyScale(bone_name, parent_bone, parent_influence, armature): pose_bone = armature.pose.bones.get(bone_name) if pose_bone: + for constraint in list(pose_bone.constraints): + pose_bone.constraints.remove(constraint) + constraint = pose_bone.constraints.new(type='COPY_SCALE') constraint.target = armature constraint.subtarget = parent_bone - constraint.power = parent_influence - print(f"Successfully added Copy Scale constraint to {bone_name}") + constraint.influence = parent_influence + # print(f"Successfully added Copy Scale constraint to {bone_name}") + + +# Add IK Controller Function +def addIKcontroller(bone_name, ctrl_empt, armature): + pose_bone = armature.pose.bones.get(bone_name) + + if pose_bone: + for constraint in list(pose_bone.constraints): + pose_bone.constraints.remove(constraint) + + ik_ctrl_constraint = pose_bone.constraints.new(type='CHILD_OF') + ik_ctrl_constraint.target = armature + ik_ctrl_constraint.subtarget = ctrl_empt + print(f"Successfully added ChildOf constraint to {bone_name}") + # # Calculate and apply the inverse matrix so the object doesn't jump position + # ik_ctrl_constraint.inverse_matrix = ctrl_empt.matrix_world.inverted() @@ -89,7 +112,7 @@ def generatecontrolrig(): shape_color = item["color"] shape_width = float(item["width"]) - print(f"Modifying Bone Shape for: {b_name}") + # print(f"Modifying Bone Shape for: {b_name}") modifyctrlbone(b_name, rotation_x, rotation_y, rotation_z, shape_scale, shape_obj, shape_width, shape_color, new_amt_obj) # Call Modify Control Bone Shape Function @@ -100,9 +123,19 @@ def generatecontrolrig(): b_name = item["bone_name"] shape_color = item["color"] - print(f"Modifying Bone Color for: {b_name}") + # print(f"Modifying Bone Color for: {b_name}") modifyctrlbonecolor(b_name, shape_color, new_amt_obj) # Call Modify Bone Function + # =========== Setup IK Controls =========== + + IK_controls = ctrl_ik_struct.ctrl_ik_data + + for item in IK_controls: + b_name = item["bone_name"] + ctrl_name = item["ctrl_controller"] + + print(f"Adding Child constraint for bone: {b_name}") + addIKcontroller(b_name, ctrl_name, new_amt_obj) # Call Add IK Controller Function # =========== Setup IK Bones =========== IK_bones = ik_bones_struct.IK_bones_data @@ -114,7 +147,7 @@ def generatecontrolrig(): ik_chain = int(item["chain"]) - print(f"Adding IK constraint for bone: {b_name}") + # print(f"Adding IK constraint for bone: {b_name}") addIK(b_name, ik_target, ik_pole_target, ik_chain, new_amt_obj) # Call Add IK Function @@ -127,7 +160,7 @@ def generatecontrolrig(): parent_influence = float(item["influence"]) - print(f"Adding copy scale constraint for bone: {b_name}") + # print(f"Adding copy scale constraint for bone: {b_name}") addCopyScale(b_name, parent_bone, parent_influence, new_amt_obj) # Call Copy Scale constraints Function diff --git a/addon dev/mabulig-rigger/ctrl_bones_shape_struct.py b/addon dev/mabulig-rigger/ctrl_bones_shape_struct.py index 13cdd44..eb122d0 100644 --- a/addon dev/mabulig-rigger/ctrl_bones_shape_struct.py +++ b/addon dev/mabulig-rigger/ctrl_bones_shape_struct.py @@ -1,39 +1,39 @@ bone_shape_data = [ { - "bone_name": "hand_l", - "rot_X": "20", - "rot_Y": "0", - "rot_Z": "4", + "bone_name": "ctrl_ik_hand_l", + "rot_X": "0", + "rot_Y": "90", + "rot_Z": "0", "scale": "0.750", "shape": "rig_shape_circle", "color": "THEME09", "width": "3" }, { - "bone_name": "hand_r", - "rot_X": "20", - "rot_Y": "0", - "rot_Z": "-4", + "bone_name": "ctrl_ik_hand_r", + "rot_X": "0", + "rot_Y": "90", + "rot_Z": "0", "scale": "0.750", "shape": "rig_shape_circle", "color": "THEME09", "width": "3" }, { - "bone_name": "feet_l", - "rot_X": "12", - "rot_Y": "0", - "rot_Z": "-5", + "bone_name": "ctrl_ik_foot_l", + "rot_X": "0", + "rot_Y": "90", + "rot_Z": "0", "scale": "1.0", "shape": "rig_shape_circle", "color": "THEME09", "width": "3" }, { - "bone_name": "feet_r", - "rot_X": "12", - "rot_Y": "0", - "rot_Z": "5", + "bone_name": "ctrl_ik_foot_r", + "rot_X": "0", + "rot_Y": "90", + "rot_Z": "0", "scale": "1.0", "shape": "rig_shape_circle", "color": "THEME09", diff --git a/addon dev/mabulig-rigger/ctrl_ik_struct.py b/addon dev/mabulig-rigger/ctrl_ik_struct.py new file mode 100644 index 0000000..460005a --- /dev/null +++ b/addon dev/mabulig-rigger/ctrl_ik_struct.py @@ -0,0 +1,19 @@ +# Positioning of Ctrl Bones for Hand and Foot +ctrl_ik_data = [ + { + "bone_name": "hand_l", + "ctrl_controller": "ctrl_ik_hand_l" + }, + { + "bone_name": "hand_r", + "ctrl_controller": "ctrl_ik_hand_r" + }, + { + "bone_name": "feet_l", + "ctrl_controller": "ctrl_ik_foot_l" + }, + { + "bone_name": "feet_r", + "ctrl_controller": "ctrl_ik_foot_r" + } +] \ No newline at end of file diff --git a/addon dev/mabulig-rigger/ik_bones_struct.py b/addon dev/mabulig-rigger/ik_bones_struct.py index 278cf23..6028528 100644 --- a/addon dev/mabulig-rigger/ik_bones_struct.py +++ b/addon dev/mabulig-rigger/ik_bones_struct.py @@ -1,25 +1,26 @@ +#Apply IK constraints IK_bones_data = [ { "bone_name": "lowerarm_l", - "target": "hand_l", + "target": "ctrl_ik_hand_l", "pole_target": "ctrl_ik_arm_target_l", "chain": "2" }, { "bone_name": "lowerarm_r", - "target": "hand_r", + "target": "ctrl_ik_hand_r", "pole_target": "ctrl_ik_arm_target_r", "chain": "2" }, { "bone_name": "tarsus_l", - "target": "feet_l", + "target": "ctrl_ik_foot_l", "pole_target": "none", "chain": "5" }, { "bone_name": "tarsus_r", - "target": "feet_r", + "target": "ctrl_ik_foot_r", "pole_target": "none", "chain": "5" } diff --git a/addon dev/mabulig-rigger/rig_setup.blend b/addon dev/mabulig-rigger/rig_setup.blend index c368517..873fd6f 100644 Binary files a/addon dev/mabulig-rigger/rig_setup.blend and b/addon dev/mabulig-rigger/rig_setup.blend differ diff --git a/addon dev/mabulig-rigger/rig_setup.blend1 b/addon dev/mabulig-rigger/rig_setup.blend1 index e12f741..caf4097 100644 Binary files a/addon dev/mabulig-rigger/rig_setup.blend1 and b/addon dev/mabulig-rigger/rig_setup.blend1 differ diff --git a/addon dev/mabulig-rigger/rigger_functionality.py b/addon dev/mabulig-rigger/rigger_functionality.py index a0f4f73..aaa9144 100644 --- a/addon dev/mabulig-rigger/rigger_functionality.py +++ b/addon dev/mabulig-rigger/rigger_functionality.py @@ -5,6 +5,7 @@ from . import bones_skel_struct from . import bones_fingers_struct from . import bones_toes_struct from . import bones_web_struct +from . import bones_ik_struct @@ -20,7 +21,7 @@ def modifybone(bone, head_empt, tail_empt, armature, matrixworldinv): allowtail = False alloweditbone = False - print(f"modifying bone: {edit_bone}") + # print(f"modifying bone: {edit_bone}") # Fetch world coordinates of the empties if empty_head: @@ -50,7 +51,23 @@ def fixbonestretching(bone, armature): if constaint.type == 'STRETCH_TO': constaint.rest_length = 0.0 - + +# Setup IK Bones +def setupIKbones(bone, helper_name, armature, matrixworldinv): + bpy.context.view_layer.objects.active = armature + bpy.ops.object.mode_set(mode='EDIT') + + edit_bone = armature.data.edit_bones.get(bone) + helper_empt = bpy.data.objects.get(helper_name) + + if edit_bone: + target_length = 0.025 + direction = (edit_bone.tail - edit_bone.head).normalized() + + empty_pos = helper_empt.matrix_world.translation + edit_bone.head = matrixworldinv @ empty_pos + edit_bone.tail = edit_bone.head + direction * target_length + def startAutoRig(): @@ -256,6 +273,17 @@ def startAutoRig(): + # =========== IK Bones =========== + + bones_ik_data_list = bones_ik_struct.bones_ik_data + + for item in bones_ik_data_list: + b_name = item["bone_name"] + pos_helper = item["pos_helper"] + + setupIKbones(b_name, pos_helper, new_amt_obj, matrix_world_inv) # Call Setup IK Bone Function + + # Returns 'helpers' collection to restore hide state prior to bone modification if ishelperscollhidden: diff --git a/addon dev/mabulig-rigger_v01.1.zip b/addon dev/mabulig-rigger_v01.1.zip new file mode 100644 index 0000000..85a8737 Binary files /dev/null and b/addon dev/mabulig-rigger_v01.1.zip differ diff --git a/addon dev/mabulig-rigger_v01.zip b/addon dev/mabulig-rigger_v01.zip new file mode 100644 index 0000000..e40c0f6 Binary files /dev/null and b/addon dev/mabulig-rigger_v01.zip differ