Created
August 9, 2020 08:47
-
-
Save slapin/8458c9d5735d63a156b283fc1891e4f7 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import bpy | |
from mathutils import Vector | |
from math import pi | |
context = bpy.context | |
namelist = [("Root", "root")] | |
fix_ptail = ["LowerLeg_L", "LowerLeg_R"] | |
ik_targets = { | |
"elbow_ik_L": ["LowerArm_L", Vector((0, 0.5, 0)), Vector((0, 0.5, 0.2)), False], | |
"elbow_ik_R": ["LowerArm_R", Vector((0, 0.5, 0)), Vector((0, 0.5, 0.2)), False], | |
"knee_ik_L": ["LowerLeg_L", Vector((0, -0.5, 0)), Vector((0, -0.5, 0.2)), False], | |
"knee_ik_R": ["LowerLeg_R", Vector((0, -0.5, 0)), Vector((0, -0.5, 0.2)), False], | |
"foot_ik_L": ["Foot_L", Vector((0, 0, 0)), Vector((0, -0.15, 0)), True], | |
"foot_ik_R": ["Foot_R", Vector((0, 0, 0)), Vector((0, -0.15, 0)), True], | |
"wrist_ik_L": ["Hand_L", Vector((0, 0, 0)), Vector((0, 0, 0.15)), True], | |
"wrist_ik_R": ["Hand_R", Vector((0, 0, 0)), Vector((0, 0, 0.15)), True] | |
} | |
bb_size = { | |
"Hips": [0.25, 0.004] | |
} | |
ik = { | |
"LowerArm_L": ["wrist_ik_L", "elbow_ik_L", 2.008], | |
"LowerArm_R": ["wrist_ik_R", "elbow_ik_R", pi - 2.008], | |
"LowerLeg_L": ["foot_ik_L", "knee_ik_L", -2.4], | |
"LowerLeg_R": ["foot_ik_R", "knee_ik_R", -pi + 2.4] | |
} | |
for obj in bpy.data.objects: | |
print(obj.type) | |
if obj.type != "ARMATURE": | |
continue | |
bpy.context.view_layer.objects.active = obj | |
for name, newname in namelist: | |
pb = obj.pose.bones.get(name) | |
if pb is None: | |
continue | |
print(pb.name) | |
pb.name = newname | |
print(pb.name) | |
bpy.ops.object.mode_set(mode='EDIT') | |
for bone in obj.pose.bones: | |
print(bone.name) | |
if bone.name.startswith("J_Bip_"): | |
bone.name = bone.name[6:] | |
if bone.name.startswith("J_Sec_"): | |
bone.name = bone.name[6:] | |
if bone.name.startswith("J_Adj_"): | |
bone.name = bone.name[6:] + "Adj" | |
if bone.name.startswith("L_"): | |
bone.name = bone.name[2:] + "_L" | |
if bone.name.startswith("R_"): | |
bone.name = bone.name[2:] + "_R" | |
if bone.name.startswith("C_"): | |
bone.name = bone.name[2:] | |
print(bone.name) | |
print(bone.head) | |
print(bone.tail) | |
ebone = obj.data.edit_bones[bone.name] | |
if bone.parent: | |
if not ebone.use_connect: | |
if (bone.parent.tail - bone.head).length < 0.001: | |
ebone.use_connect = True | |
print(ebone.bbone_x) | |
print(ebone.bbone_z) | |
for bname in fix_ptail: | |
bdata = obj.data.edit_bones[bname] | |
bdata.parent.tail = bdata.head | |
for ikt in ik_targets.keys(): | |
bname = ik_targets[ikt][0] | |
bdata = obj.data.edit_bones[bname] | |
nbone = obj.data.edit_bones.new(ikt) | |
nbone.head = bdata.head + ik_targets[ikt][1] | |
nbone.tail = bdata.head + ik_targets[ikt][2] | |
nbone.parent = obj.data.edit_bones["root"] | |
nbone.use_connect = False | |
nbone.use_deform = False | |
if ik_targets[ikt][3]: | |
bdata.use_connect = False | |
bdata.parent = nbone | |
for ebone in obj.data.edit_bones: | |
ebone.bbone_x = 0.004 | |
ebone.bbone_z = 0.004 | |
for kb in bb_size.keys(): | |
ebone = obj.data.edit_bones[kb] | |
ebone.bbone_x = bb_size[kb][0] | |
ebone.bbone_z = bb_size[kb][1] | |
bpy.ops.object.mode_set(mode='POSE') | |
for pb in ik.keys(): | |
bone = obj.pose.bones[pb] | |
c = bone.constraints.new("IK") | |
c.target = obj | |
c.subtarget = ik[pb][0] | |
c.chain_count = 2 | |
c.pole_target = obj | |
c.pole_subtarget = ik[pb][1] | |
c.pole_angle = ik[pb][2] | |
bpy.ops.pose.armature_apply() | |
bpy.ops.object.mode_set(mode='OBJECT') | |
for mat in bpy.data.materials: | |
print(mat.name) | |
if mat.use_nodes: | |
for node in mat.node_tree.nodes: | |
print(node.name) | |
print(node.label) | |
print(node.type) | |
nnode = mat.node_tree.nodes.new("ShaderNodeBsdfPrincipled") | |
nnode.location = (400, 200) | |
nnode.label = "Mat" | |
diffuse = None | |
normal = None | |
emission = None | |
for k in mat.node_tree.nodes: | |
if k.type == "TEX_IMAGE": | |
if k.label == "MainTexture": | |
diffuse = k | |
elif k.label == "NomalmapTexture": | |
normal = k | |
elif k.label == "Emission_Texture": | |
emission = k | |
if k.type == "GROUP": | |
mat.node_tree.nodes.remove(k) | |
print(diffuse) | |
material_output = mat.node_tree.nodes.get('Material Output') | |
#for tx in diffuse.outputs.keys(): | |
# print(tx) | |
if diffuse: | |
mat.node_tree.links.new(nnode.inputs["Base Color"], diffuse.outputs[0]) | |
mat.node_tree.links.new(nnode.inputs["Alpha"], diffuse.outputs[1]) | |
if normal: | |
mat.node_tree.links.new(nnode.inputs["Normal"], normal.outputs[0]) | |
if emission: | |
mat.node_tree.links.new(nnode.inputs["Emission"], emission.outputs[0]) | |
mat.node_tree.links.new(material_output.inputs[0], nnode.outputs[0]) | |
print("done") | |
bpy.ops.wm.save_as_mainfile(filepath=bpy.data.filepath.replace(".blend", ".mod.blend")) | |
bpy.ops.wm.quit_blender() | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment