4 Name: 'MikuMikuDance model (.pmd)...'
7 Tooltip: 'Import PMD file for MikuMikuDance.'
9 __author__= ["ousttrue"]
15 This script imports a pmd into Blender for editing.
17 0.1: 20091126: first implement.
18 0.2: 20091209: implement IK.
19 0.3: 20091210: implement morph target.
20 0.4: 20100305: use english name.
21 0.5: 20100408: cleanup not used vertices.
22 0.6: 20100416: fix fornt face. texture load fail safe. add progress.
23 0.7: 20100506: C extension.
24 0.8: 20100521: add shape_key group.
25 1.0: 20100530: add invisilbe bone tail(armature layer 2).
26 1.1: 20100608: integrate 2.4 and 2.5.
29 MMD_SHAPE_GROUP_NAME='_MMD_SHAPE'
32 ###############################################################################
34 ###############################################################################
41 from meshio import pmd, englishmap
44 return sys.version_info[0]<3
49 from Blender import Mathutils
57 from bpy.props import *
64 ###############################################################################
66 ###############################################################################
67 def progress_start(base):
69 progressBar=bl.ProgressBar(base)
71 def progress_finish():
75 def progress_print(message, progress=0.05):
77 progressBar.advance(message, progress)
79 def progress_set(message, progress):
81 progressBar.set(message, progress)
86 def convert_coord(pos):
88 Left handed y-up to Right handed z-up
90 return (pos.x, pos.z, pos.y)
94 return (uv.x, 1.0 - uv.y)
97 def get_bone_name(l, index):
98 name=englishmap.getEnglishBoneName(l.bones[index].getName())
99 return name if name else l.bones[index].getName().encode(bl.INTERNAL_ENCODING)
102 def createMaterial():
104 create default materil
106 material=Blender.Material.New()
107 material.setDiffuseShader(Blender.Material.Shaders.DIFFUSE_TOON)
109 material.diffuseSize = 3.14/2
110 material.setDiffuseSmooth(0)
111 material.setSpecShader(Blender.Material.Shaders.SPEC_TOON)
112 material.setSpecSize(0)
117 def importMesh(scene, l, tex_dir):
119 @param l[in] mmd.PMDLoader
123 ############################################################
124 # shpaeキーで使われるマテリアル優先的に前に並べる
125 ############################################################
126 # shapeキーで使われる頂点インデックスを集める
127 shape_key_used_vertices=set()
128 if len(l.morph_list)>0:
131 for s in l.morph_list:
138 for index in base.indices:
139 shape_key_used_vertices.add(index)
141 # マテリアルに含まれる頂点がshape_keyに含まれるか否か?
142 def isMaterialUsedInShape(offset, m):
143 for i in xrange(offset, offset+m.vertex_count):
144 if l.indices[i] in shape_key_used_vertices:
147 # shapeキーで使われるマテリアルを記録する
148 shape_key_materials=set()
149 # 各マテリアルの開始頂点インデックスを記録する
152 for i, m in enumerate(l.materials):
153 face_map[i]=face_count
154 if isMaterialUsedInShape(face_count, m):
155 shape_key_materials.add(i)
156 face_count+=m.vertex_count
159 material_order=list(shape_key_materials)
161 # shapeキーに使われていないマテリアルを後ろに追加
162 for i in range(len(l.materials)):
163 if not i in material_order:
164 material_order.append(i)
166 # マテリアル16個ごとに分割したメッシュを作成する
169 while material_offset<len(l.materials):
171 mesh = Blender.Mesh.New()
174 obj = scene.objects.new(mesh)
176 mesh_objects.append(obj)
178 # shapeキーで使われる順に並べなおしたマテリアル16個分の
180 vertex_map=import16MaerialAndMesh(
182 material_order[material_offset:material_offset+16],
186 importShape(obj, l, vertex_map)
194 def import16MaerialAndMesh(mesh, l, material_order, face_map, tex_dir):
195 ############################################################
197 ############################################################
198 progress_print('create materials')
202 for material_index in material_order:
204 m=l.materials[material_index]
205 mesh_material_map[material_index]=index
209 material=createMaterial()
210 material.setRGBCol([m.diffuse.r, m.diffuse.g, m.diffuse.b])
211 material.setAlpha(m.diffuse.a)
212 material.setSpec(m.shinness*0.1)
213 material.setSpecCol([m.specular.r, m.specular.g, m.specular.b])
214 material.setMirCol([m.ambient.r, m.ambient.g, m.ambient.b])
215 material.enableSSS=True if m.flag==1 else False
217 if m.getTexture()!='':
218 tex_file=re.compile('\*.*.spa$').sub('', m.getTexture())
219 tex_path = os.path.join(tex_dir, tex_file).encode(
220 bl.INTERNAL_ENCODING)
221 tex = Blender.Texture.New()
224 tex.image = Blender.Image.Load(tex_path)
225 material.setTexture(0, tex)
226 material.getTextures()[0].texco = Blender.Texture.TexCo.UV
228 print(material.name, "fail to load", tex_path)
229 materials.append(material)
230 # lookup table for assign
232 mesh.materials=materials
234 ############################################################
236 ############################################################
237 progress_print('create vertices')
241 for v in l.each_vertex():
242 vertices.append(convert_coord(v.pos))
243 vertex_groups[v.bone0]=True
244 vertex_groups[v.bone1]=True
245 mesh.verts.extend(vertices)
247 # create vertex group
248 for i in vertex_groups.keys():
249 mesh.addVertGroup(get_bone_name(l, i))
252 for i, v, mvert in zip(xrange(len(l.vertices)), l.each_vertex(), mesh.verts):
253 mvert.no=Mathutils.Vector(*convert_coord(v.normal))
254 mvert.uvco=convert_uv(v.uv)
255 w1=float(v.weight0)/100.0
257 mesh.assignVertsToGroup(get_bone_name(l, v.bone0), [i], w1,
258 Blender.Mesh.AssignModes.ADD)
259 mesh.assignVertsToGroup(get_bone_name(l, v.bone1), [i], w2,
260 Blender.Mesh.AssignModes.ADD)
262 ############################################################
264 ############################################################
265 progress_print('create faces')
268 mesh_face_materials=[]
271 def degenerate(i0, i1, i2):
272 return i0==i1 or i1==i2 or i2==i0
274 for material_index in material_order:
275 face_offset=face_map[material_index]
276 m=l.materials[material_index]
277 material_faces=l.indices[face_offset:face_offset+m.vertex_count]
278 for j in xrange(0, len(material_faces), 3):
280 i1=material_faces[j+1]
281 i2=material_faces[j+2]
282 triangle=[i0, i1, i2]
283 if degenerate(*triangle):
285 mesh_face_indices.append(triangle)
286 mesh_face_materials.append(material_index)
287 used_vertices.add(i0)
288 used_vertices.add(i1)
289 used_vertices.add(i2)
291 mesh.faces.extend(mesh_face_indices, ignoreDups=True)
295 mesh.addUVLayer('NewUV')
296 for face, material_index in zip(mesh.faces, mesh_face_materials):
298 index=mesh_material_map[material_index]
299 except KeyError as message:
300 print(message, mesh_material_map, m)
303 material=mesh.materials[index]
304 texture=material.getTextures()[0]
307 face.image=texture.tex.image
308 texture.tex.imageFlags|=Blender.Texture.ImageFlags.USEALPHA
309 face.uv=[face.verts[0].uvco, face.verts[1].uvco, face.verts[2].uvco]
315 ############################################################
316 # clean up not used vertices
317 ############################################################
318 progress_print('clean up vertices not used')
321 for i, v in enumerate(l.each_vertex()):
322 if i in used_vertices:
323 vertex_map[i]=len(vertex_map)
325 remove_vertices.append(i)
326 mesh.verts.delete(remove_vertices)
328 progress_print('%s created' % mesh.name)
332 class Builder(object):
336 def build(self, armature, bones):
339 self.__build(armature, b, None, None)
342 def __build(self, armature, b, p, parent):
343 name=englishmap.getEnglishBoneName(b.getName())
345 name=b.getName().encode(bl.INTERNAL_ENCODING)
348 bone=Blender.Armature.Editbone()
350 armature.bones[name]=bone
354 assert(b.type==6 or b.type==7)
355 bone.head = Mathutils.Vector(*convert_coord(b.pos))
356 bone.tail=bone.head+Mathutils.Vector(0, 1, 0)
359 if bone.name=="center_t":
360 # センターボーンは(0, 1, 0)の方向を向いていないと具合が悪い
361 parent.tail=parent.head+Mathutils.Vector(0, 1, 0)
362 bone.head=parent.tail
363 bone.tail=bone.head+Mathutils.Vector(0, 1, 0)
365 assert(parent.tail==bone.head)
366 bone.options=[Blender.Armature.CONNECTED]
368 bone.layerMask = (1<<1)
370 bone.head = Mathutils.Vector(*convert_coord(b.pos))
371 bone.tail = Mathutils.Vector(*convert_coord(b.tail))
374 if parent.tail==bone.head:
375 bone.options=[Blender.Armature.CONNECTED]
377 if bone.head==bone.tail:
378 bone.tail=bone.head+Mathutils.Vector(0, 1, 0)
381 self.__build(armature, c, b, bone)
384 def importArmature(scene, l):
386 armature = Blender.Armature.New()
388 armature_object = scene.objects.new(armature)
390 act = Blender.Armature.NLA.NewAction()
391 act.setActive(armature_object)
393 armature_object.drawMode = (
394 armature_object.drawMode | Blender.Object.DrawModes.XRAY)
396 armature.drawType = Blender.Armature.OCTAHEDRON
397 armature.drawNames=True
398 armature.envelopes = False
399 armature.vertexGroups = True
400 armature.mirrorEdit = True
403 armature.makeEditable()
405 ############################################################
407 ############################################################
409 builder.build(armature, l.bones)
411 ############################################################
413 ############################################################
414 pose = armature_object.getPose()
415 cSetting = Blender.Constraint.Settings
417 # IKtarget->parent(=IK).name
418 target=l.bones[ik.target]
419 name = englishmap.getEnglishBoneName(target.getName())
420 p_bone = pose.bones[name]
422 print('not found', name)
424 if len(ik.children) >= 16:
425 print('over MAX_CHAINLEN', ik, len(ik.children))
428 ik_solver = p_bone.constraints.append(Blender.Constraint.Type.IKSOLVER)
429 ik_solver[cSetting.CHAINLEN]=len(ik.children)
430 ik_solver[cSetting.TARGET]=armature_object
431 ik_solver[cSetting.USETIP]=False
433 effector_name=englishmap.getEnglishBoneName(
434 l.bones[ik.index].getName())
435 if not effector_name:
436 effector_name=l.bones[ik.index].getName()
438 ik_solver[cSetting.BONE]=effector_name
439 #ik_solver.influence=ik.weight
440 # not used. place folder when export.
441 ik_solver[cSetting.ROTWEIGHT]=ik.weight
442 ik_solver[cSetting.ITERATIONS]=ik.iterations * 10
444 armature.makeEditable()
447 return armature_object
450 def importShape(obj, l, vertex_map):
451 if len(l.morph_list)==0:
454 mesh=obj.getData(mesh=True)
458 for s in l.morph_list:
462 # create vertex group
463 mesh.addVertGroup(MMD_SHAPE_GROUP_NAME)
469 indices.append(vertex_map[i])
470 mesh.assignVertsToGroup(MMD_SHAPE_GROUP_NAME, indices, 0,
471 Blender.Mesh.AssignModes.ADD)
477 assert(len(mesh.key.blocks)==1)
479 baseShapeBlock=mesh.key.blocks[baseShapeIndex]
480 baseShapeBlock.name='Basis'
481 obj.activeShape=baseShapeIndex
488 for s in l.morph_list:
489 if s.name==base.name:
492 for index, offset in zip(s.indices, s.pos_list):
494 vertex_index=vertex_map[base.indices[index]]
495 v=mesh.verts[vertex_index].co
496 offset=convert_coord(offset)
500 except IndexErrora as msg:
502 print(index, len(base.indices), len(vertex_map))
503 print(len(mesh.verts))
504 print(base.indices[index])
508 #print 'this mesh not has shape vertices'
512 name=englishmap.getEnglishSkinName(s.getName())
514 name=s.getName().encode(bl.INTERNAL_ENCODING)
517 # create shapekey block
519 shapeIndex=len(mesh.key.blocks)-1
520 keyBlock=mesh.key.blocks[shapeIndex]
523 # copy vertex to shape key
527 for mv, v in zip(mesh.verts, baseShapeBlock.getData()):
534 obj.activeShape=baseShapeIndex
538 def to_radian(degree):
539 return math.pi * degree / 180
542 def convert_coord(pos):
544 Left handed y-up to Right handed z-up
546 return (pos.x, pos.z, pos.y)
550 return (uv.x, 1.0 - uv.y)
553 def getBoneName(bone):
554 name = englishmap.getEnglishBoneName(bone.getName())
555 return name if name else bone.getName()
558 def create_texture(directory, texture_name):
559 texture=bpy.data.textures.new(texture_name)
561 texture=texture.recast_type()
562 texturePath=os.path.join(directory, texture_name)
563 print('create_texture', texturePath)
564 image=bpy.data.images.load(texturePath)
566 texture.mipmap = True
567 texture.interpolation = True
568 texture.use_alpha = True
572 def createMaterial():
574 create default materil
576 material = bpy.data.materials.new("Material")
577 material.diffuse_shader='TOON'
578 material.specular_shader='TOON'
584 def importMesh(scene, l, tex_dir):
586 @param l[in] mmd.PMDLoader
590 ############################################################
591 # shpaeキーで使われるマテリアル優先的に前に並べる
592 ############################################################
593 # shapeキーで使われる頂点インデックスを集める
594 shape_key_used_vertices=set()
595 if len(l.morph_list)>0:
598 for s in l.morph_list:
605 for index in base.indices:
606 shape_key_used_vertices.add(index)
608 # マテリアルに含まれる頂点がshape_keyに含まれるか否か?
609 def isMaterialUsedInShape(offset, m):
610 for i in range(offset, offset+m.vertex_count):
611 if l.indices[i] in shape_key_used_vertices:
614 # shapeキーで使われるマテリアルを記録する
615 shape_key_materials=set()
616 # 各マテリアルの開始頂点インデックスを記録する
619 for i, m in enumerate(l.materials):
620 face_map[i]=face_count
621 if isMaterialUsedInShape(face_count, m):
622 shape_key_materials.add(i)
623 face_count+=m.vertex_count
625 # shapeキーで使われるマテリアルを前に並べるインデックスマップを作る
628 not_used_index=len(shape_key_materials)
629 for i, m in enumerate(l.materials):
630 if i in shape_key_materials:
631 material_map[i]=used_index
634 material_map[i]=not_used_index
637 # マテリアル16個ごとに分割したメッシュを作成する
640 while material_index<len(l.materials):
641 # shapeキーで使われる順に並べなおしたマテリアル16個分の
643 meshObject, used_vertices=import16MaerialAndMesh(l,
644 material_index, material_map, face_map, tex_dir)
645 scene.objects.link(meshObject)
647 mesh_objects.append(meshObject)
650 bpy.ops.object.select_all(action='DESELECT')
651 meshObject.selected=True
652 scene.objects.active=meshObject
653 bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
656 importShape(meshObject, l)
658 ############################################################
659 # clean up not used vertices
660 ############################################################
661 #progress_print('clean up vertices not used')
664 for i, v in enumerate(mesh.verts):
665 if i in used_vertices:
666 vertex_map[i]=len(vertex_map)
670 assert(mesh.verts[i].selected)
671 bpy.ops.object.mode_set(mode='EDIT', toggle=False)
672 print("%d vertices selected" % mesh.total_vert_sel)
673 print("used %d/%d" % (len(vertex_map), len(mesh.verts)))
674 bpy.ops.mesh.delete(type='VERT')
676 ############################################################
678 ############################################################
679 bpy.ops.mesh.select_all(action='SELECT')
680 bpy.ops.mesh.flip_normals()
681 bpy.ops.mesh.select_all(action='DESELECT')
684 bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
692 def import16MaerialAndMesh(l,
693 material_offset, material_map, face_map, tex_dir):
695 mesh=bpy.data.meshes.new("Mesh")
698 meshObject= bpy.data.objects.new("Mesh", mesh)
699 meshObject.layers[0]=True
701 ############################################################
703 ############################################################
704 #progress_print('create materials')
710 for i in range(material_offset, material_offset+16):
712 material_index=material_map[i]
713 m=l.materials[material_index]
714 mesh_material_map[material_index]=index
718 material=createMaterial()
719 material.diffuse_color=([m.diffuse.r, m.diffuse.g, m.diffuse.b])
720 material.alpha=m.diffuse.a
721 material.specular_hardness=int(m.shinness)
722 material.specular_color=([m.specular.r, m.specular.g, m.specular.b])
723 material.mirror_color=([m.ambient.r, m.ambient.g, m.ambient.b])
724 texture_name=m.getTexture()
726 if texture_name in textureMap:
727 texture=textureMap[texture_name]
729 texture=create_texture(tex_dir, texture_name)
730 textureMap[texture_name]=texture
731 imageMap[material_index]=texture.image
732 #material.add_texture(texture, "UV", {"COLOR", "ALPHA"})
733 material.add_texture(texture, "UV", "COLOR")
735 materials.append(material)
736 mesh.add_material(material)
737 # lookup table for assign
740 ############################################################
742 ############################################################
743 #progress_print('create vertices')
747 for v in l.each_vertex():
748 unpackedVertices.extend(
749 convert_coord(v.pos))
750 vertex_groups[v.bone0]=True
751 vertex_groups[v.bone1]=True
753 ############################################################
755 ############################################################
756 #progress_print('create faces')
759 mesh_face_materials=[]
761 for i in range(material_offset, material_offset+16):
763 material_index=material_map[i]
766 face_offset=face_map[material_index]
767 m=l.materials[material_index]
768 material_faces=l.indices[face_offset:face_offset+m.vertex_count]
769 for j in range(0, len(material_faces), 3):
771 i1=material_faces[j+1]
772 i2=material_faces[j+2]
774 mesh_face_indices.extend([i2, i0, i1, 0])
776 mesh_face_indices.extend([i0, i1, i2, 0])
777 mesh_face_materials.append(material_index)
778 used_vertices.add(i0)
779 used_vertices.add(i1)
780 used_vertices.add(i2)
782 ############################################################
783 # create vertices & faces
784 ############################################################
786 int(len(unpackedVertices)/3), 0, int(len(mesh_face_indices)/4))
787 mesh.verts.foreach_set("co", unpackedVertices)
788 mesh.faces.foreach_set("verts_raw", mesh_face_indices)
789 assert(len(l.vertices)==len(mesh.verts))
791 ############################################################
793 ############################################################
795 mesh.add_uv_texture()
797 for face, uv_face, material_index in zip(mesh.faces,
798 mesh.uv_textures[0].data,
802 index=mesh_material_map[material_index]
803 except KeyError as message:
804 print(message, mesh_material_map, m)
806 face.material_index=index
807 material=mesh.materials[index]
809 if material.texture_slots[0]:
810 #texture=material.texture_slots[0].texture
811 #face.image=texture.image
812 #texture.imageFlags|=Blender.Texture.ImageFlags.USEALPHA
813 uv=l.getUV(face.verts[0])
814 uv_face.uv1=[uv.x, 1.0-uv.y]
816 uv=l.getUV(face.verts[1])
817 uv_face.uv2=[uv.x, 1.0-uv.y]
819 uv=l.getUV(face.verts[2])
820 uv_face.uv3=[uv.x, 1.0-uv.y]
821 if face.material_index in imageMap:
822 uv_face.image=imageMap[face.material_index]
828 ############################################################
830 ############################################################
831 # create vertex group
832 for i in vertex_groups.keys():
833 meshObject.add_vertex_group(getBoneName(l.bones[i]))
836 for i, v, mvert in zip(range(len(l.vertices)),
837 l.each_vertex(), mesh.verts):
838 mvert.normal=mathutils.Vector(convert_coord(v.normal))
839 #mvert.uvco=convert_uv(v.uv)
840 w1=float(v.weight0)/100.0
843 meshObject.add_vertex_to_group(i,
844 meshObject.vertex_groups[getBoneName(l.bones[v.bone0])], w1, 'ADD')
845 meshObject.add_vertex_to_group(i,
846 meshObject.vertex_groups[getBoneName(l.bones[v.bone1])], w2, 'ADD')
849 #progress_print('%s created' % mesh.name)
850 return meshObject, used_vertices
853 def build_bone(armature, b, parent=None):
858 bone = armature.edit_bones.new(name if name else b.getName())
860 bone.head = mathutils.Vector(convert_coord(b.pos))
862 bone.connected=True if parent.tail==bone.head else False
863 bone.tail = mathutils.Vector(convert_coord(b.tail))
864 if bone.head==bone.tail:
865 bone.tail=bone.head-mathutils.Vector((0, 1, 0))
866 elif b.__class__ is pmd.BONE_IK:
867 bone.head = mathutils.Vector(convert_coord(b.pos))
868 bone.tail = mathutils.Vector(convert_coord(b.tail))
871 tail=mathutils.Vector(convert_coord(b.pos))
873 bone.head = tail-mathutils.Vector((0, 1, 0))
875 for child in b.children:
876 build_bone(armature, child, bone)
879 def importArmature(scene, l):
881 armature = bpy.data.armatures.new('Armature')
883 armature_object=bpy.data.objects.new('Armature', armature)
884 scene.objects.link(armature_object)
885 armature_object.x_ray=True
886 armature.draw_names=True
889 armature.drawtype='OCTAHEDRAL'
890 armature.deform_envelope=False
891 armature.deform_vertexgroups=True
892 armature.x_axis_mirror=True
895 #act = Blender.Armature.NLA.NewAction()
896 #act.setActive(armature_object)
898 # select only armature object and set edit mode
899 scene.objects.active=armature_object
900 bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
901 bpy.ops.object.mode_set(mode='EDIT', toggle=False)
906 build_bone(armature, b)
908 bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
909 bpy.ops.object.select_all(action='DESELECT')
911 ############################################################
913 ############################################################
914 pose = armature_object.pose
916 effector=l.bones[ik.target]
917 parent=l.bones[effector.parent_index]
918 name=getBoneName(parent)
919 p_bone = pose.bones[name]
921 print('not found', name)
923 if len(ik.children) >= 16:
924 print('over MAX_CHAINLEN', ik, len(ik.children))
927 ik_const = p_bone.constraints.new('IK')
928 ik_const.chain_length=len(ik.children)
929 ik_const.target=armature_object
930 ik_const.subtarget=getBoneName(l.bones[ik.index])
932 rot_const = p_bone.constraints.new('LIMIT_ROTATION')
933 rot_const.influence = ik.weight
934 rot_const.owner_space = 'LOCAL'
935 rot_const.use_limit_x=True
936 rot_const.use_limit_z=True
937 rot_const.minimum_x=to_radian(ik.iterations)
938 rot_const.maximum_x=to_radian(180)
939 rot_const.minimum_z=to_radian(180 - ik.iterations)
940 rot_const.maximum_z=to_radian(0)
942 return armature_object
945 def importShape(meshObject, l):
946 if len(l.morph_list)==0:
951 for s in l.morph_list:
959 baseblock=meshObject.add_shape_key("Basis")
965 for s in l.morph_list:
966 if s.getName()==base.name:
971 #for v, base_pos in zip(mesh.verts, baseblock.data):
976 name=englishmap.getEnglishSkinName(s.getName())
979 new_shape_key=meshObject.add_shape_key(name)
980 #new_shape_key.value=1.0
983 for i, offset in zip(s.indices, s.pos_list):
985 vertex_index=base.indices[i]
986 new_shape_key.data[vertex_index].co=[p+o for p, o in zip(
987 mesh.verts[vertex_index].co, convert_coord(offset))]
988 except IndexError as msg:
989 print(IndexError, msg)
990 print(i, len(base.indices))
991 print(vertex_index, len(mesh.verts))
992 print(base.indices[i])
995 #print 'this mesh not has shape vertices'
999 #icu=ipo.addCurve(name)
1000 #icu.interpolation = Blender.IpoCurve.InterpTypes.LINEAR
1001 #icu.append( (0.0, 0.0) )
1004 def __execute(filename, scene):
1006 load pmd file to context.
1009 progress_set('load %s' % filename, 0.0)
1012 if not io.read(filename):
1013 print("fail to load %s" % filename)
1015 progress_set('loaded %s' % filename, 0.1)
1017 # create root object
1018 root=bl.createEmptyObject(scene,
1019 io.english_name if len(io.english_name)>0 else io.getName().encode(bl.INTERNAL_ENCODING))
1022 mesh_objects=importMesh(scene, io, os.path.dirname(filename))
1023 for o in mesh_objects:
1024 bl.objectMakeParent(root, o)
1027 armature_object=importArmature(scene, io)
1029 bl.objectMakeParent(root, armature_object)
1030 armature = bl.objectGetData(armature_object)
1032 # add armature modifier
1033 for o in mesh_objects:
1034 bl.objectAddArmatureModifier(o, armature_object)
1037 for n, b in bl.objectGetPose(armature_object).bones.items():
1038 bl.poseBoneLimit(n, b)
1041 bl.objectSelect(root)
1042 for o in mesh_objects:
1044 bl.objectSelect(armature_object)
1049 def execute_24(filename):
1053 filename=filename.decode(bl.INTERNAL_ENCODING)
1054 print(bl.INTERNAL_ENCODING, bl.FS_ENCODING)
1057 mode_edit = Blender.Window.EditMode()
1059 Blender.Window.EditMode(0)
1061 progress_start('pmd_import')
1062 scene = bpy.data.scenes.active
1063 __execute(filename, scene)
1069 Blender.Window.EditMode(1)
1070 Blender.Window.RedrawAll()
1072 Blender.Window.FileSelector(
1075 Blender.sys.makename(ext='.pmd'))
1079 def execute_25(*args):
1080 progress_start('pmd_import')
1085 class IMPORT_OT_pmd(bpy.types.Operator):
1086 bl_idname = "import_scene.pmd"
1087 bl_label = 'Import PMD'
1089 # List of operator properties, the attributes will be assigned
1090 # to the class instance from the operator settings before calling.
1092 path = StringProperty(
1094 description="File path used for importing the PMD file",
1095 maxlen= 1024, default= "")
1096 filename = StringProperty(
1098 description="Name of the file.")
1099 directory = StringProperty(
1101 description="Directory of the file.")
1103 def execute(self, context):
1104 execute_25(self.properties.path, context.scene)
1107 def invoke(self, context, event):
1108 wm = context.manager
1109 wm.add_fileselect(self)
1110 return 'RUNNING_MODAL'
1113 def menu_func(self, context):
1114 self.layout.operator(IMPORT_OT_pmd.bl_idname,
1115 text="MikuMikuDance model (.pmd)")
1118 bpy.types.register(IMPORT_OT_pmd)
1119 bpy.types.INFO_MT_file_import.append(menu_func)
1122 bpy.types.unregister(IMPORT_OT_pmd)
1123 bpy.types.INFO_MT_file_import.remove(menu_func)
1125 if __name__=="__main__":