X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=blender25-meshio%2Fimport_pmd.py;h=0f845ef0667d7ff21bf02579b8429268c8e2c733;hb=a678c04bd9942eb915a1d07caac747ef5d0f8556;hp=1710ccd4c6e0cf94220bb04071199f01cf82c3ac;hpb=64bf10f774b8329dcd7fc353973fc337f72df561;p=meshio%2Fpymeshio.git diff --git a/blender25-meshio/import_pmd.py b/blender25-meshio/import_pmd.py index 1710ccd..0f845ef 100644 --- a/blender25-meshio/import_pmd.py +++ b/blender25-meshio/import_pmd.py @@ -38,6 +38,7 @@ This script imports a pmd into Blender for editing. 2.3 20101228: update for Blender2.55. 2.4 20110429: update for Blender2.57b. 2.5 20110522: implement RigidBody and Constraint. +2.6 20110918: update for Blender2.59. """ bl_addon_info = { 'category': 'Import/Export', @@ -52,34 +53,6 @@ bl_addon_info = { 'tracker_url': 'http://sourceforge.jp/ticket/newticket.php?group_id=5081', } -MMD_SHAPE_GROUP_NAME='_MMD_SHAPE' -MMD_MB_NAME='mb_name' -MMD_MB_COMMENT='mb_comment' -MMD_COMMENT='comment' -BASE_SHAPE_NAME='Basis' -RIGID_NAME='rigid_name' -RIGID_SHAPE_TYPE='rigid_shape_type' -RIGID_PROCESS_TYPE='rigid_process_type' -RIGID_BONE_NAME='rigid_bone_name' -#RIGID_LOCATION='rigid_loation' -RIGID_GROUP='ribid_group' -RIGID_INTERSECTION_GROUP='rigid_intersection_group' -RIGID_WEIGHT='rigid_weight' -RIGID_LINEAR_DAMPING='rigid_linear_damping' -RIGID_ANGULAR_DAMPING='rigid_angular_damping' -RIGID_RESTITUTION='rigid_restitution' -RIGID_FRICTION='rigid_friction' -CONSTRAINT_NAME='constraint_name' -CONSTRAINT_A='const_a' -CONSTRAINT_B='const_b' -CONSTRAINT_POS_MIN='const_pos_min' -CONSTRAINT_POS_MAX='const_pos_max' -CONSTRAINT_ROT_MIN='const_rot_min' -CONSTRAINT_ROT_MAX='const_rot_max' -CONSTRAINT_SPRING_POS='const_spring_pos' -CONSTRAINT_SPRING_ROT='const_spring_rot' -TOON_TEXTURE_OBJECT='ToonTextures' - ############################################################################### # import @@ -90,7 +63,7 @@ import math try: # C extension - from meshio import pmd, englishmap + from .meshio import pmd, englishmap print('use meshio C module') except ImportError: # full python @@ -168,29 +141,29 @@ def to_radian(degree): def get_bone_name(l, index): if index==0xFFFF: - return l.bones[0].name + return l.bones[0]._name if index < len(l.bones): - name=englishmap.getEnglishBoneName(l.bones[index].name) + name=englishmap.getEnglishBoneName(l.bones[index]._name) if name: return name - return l.bones[index].name + return l.bones[index]._name print('invalid bone index', index) - return l.bones[0].name + return l.bones[0]._name def get_group_name(g): - group_name=englishmap.getEnglishBoneGroupName(g.name.strip()) + group_name=englishmap.getEnglishBoneGroupName(g._name.strip()) if not group_name: - group_name=g.name.strip() + group_name=g._name.strip() return group_name def __importToonTextures(io, tex_dir): - mesh, meshObject=bl.mesh.create(TOON_TEXTURE_OBJECT) - material=bl.material.create(TOON_TEXTURE_OBJECT) + mesh, meshObject=bl.mesh.create(bl.TOON_TEXTURE_OBJECT) + material=bl.material.create(bl.TOON_TEXTURE_OBJECT) bl.mesh.addMaterial(mesh, material) - for toon in (io.toon_textures[i] for i in range(10)): + for toon in (io.toon_textures._toon_textures[i] for i in range(10)): path=os.path.join(tex_dir, toon) texture, image=bl.texture.create(path) bl.material.addTexture(material, texture, False) @@ -211,19 +184,19 @@ def __importShape(obj, l, vertex_map): base=s # create vertex group - bl.object.addVertexGroup(obj, MMD_SHAPE_GROUP_NAME) + bl.object.addVertexGroup(obj, bl.MMD_SHAPE_GROUP_NAME) hasShape=False for i in s.indices: if i in vertex_map: hasShape=True bl.object.assignVertexGroup( - obj, MMD_SHAPE_GROUP_NAME, vertex_map[i], 0) + obj, bl.MMD_SHAPE_GROUP_NAME, vertex_map[i], 0) if not hasShape: return assert(base) # create base key - baseShapeBlock=bl.object.addShapeKey(obj, BASE_SHAPE_NAME) + baseShapeBlock=bl.object.addShapeKey(obj, bl.BASE_SHAPE_NAME) # mesh mesh=bl.object.getData(obj) mesh.update() @@ -234,38 +207,34 @@ def __importShape(obj, l, vertex_map): continue # name - name=englishmap.getEnglishSkinName(s.name) + name=englishmap.getEnglishSkinName(s._name) if not name: - name=s.name + name=s._name # 25 new_shape_key=bl.object.addShapeKey(obj, name) for index, offset in zip(s.indices, s.pos_list): try: - vertex_index=vertex_map[base.indices[index]] - bl.shapekey.assign(new_shape_key, vertex_index, - mesh.vertices[vertex_index].co+ - bl.createVector(*convert_coord(offset))) + base_index=base.indices[index] except IndexError as msg: + print(name) print(msg) - print(index, len(base.indices), len(vertex_map)) - print(len(mesh.vertices)) - print(base.indices[index]) - print(vertex_index) - break - except KeyError: - #print 'this mesh not has shape vertices' - break + print("invalid index %d/%d" % (index, len(base.indices))) + continue + vertex_index=vertex_map[base_index] + bl.shapekey.assign(new_shape_key, vertex_index, + mesh.vertices[vertex_index].co+ + bl.createVector(*convert_coord(offset))) # select base shape bl.object.setActivateShapeKey(obj, 0) def __build(armature, b, p, parent): - name=englishmap.getEnglishBoneName(b.name) + name=englishmap.getEnglishBoneName(b._name) if not name: - name=b.name + name=b._name bone=bl.armature.createBone(armature, name) @@ -320,9 +289,9 @@ def __importArmature(l): pose = bl.object.getPose(armature_object) for ik in l.ik_list: target=l.bones[ik.target] - name = englishmap.getEnglishBoneName(target.name) + name = englishmap.getEnglishBoneName(target._name) if not name: - name=target.name + name=target._name p_bone = pose.bones[name] if not p_bone: print('not found', name) @@ -331,9 +300,9 @@ def __importArmature(l): print('over MAX_CHAINLEN', ik, len(ik.children)) continue effector_name=englishmap.getEnglishBoneName( - l.bones[ik.index].name) + l.bones[ik.index]._name) if not effector_name: - effector_name=l.bones[ik.index].name + effector_name=l.bones[ik.index]._name constraint=bl.armature.createIkConstraint(armature_object, p_bone, effector_name, ik) @@ -351,9 +320,9 @@ def __importArmature(l): for b_index, g_index in l.bone_display_list: # bone b=l.bones[b_index] - bone_name=englishmap.getEnglishBoneName(b.name) + bone_name=englishmap.getEnglishBoneName(b._name) if not bone_name: - bone_name=b.name + bone_name=b._name # group g=l.bone_group_list[g_index-1] group_name=get_group_name(g) @@ -389,7 +358,7 @@ def __import16MaerialAndMesh(meshObject, l, material=createPmdMaterial(m, material_index) # main texture - texture_name=m.texture + texture_name=m._texture if texture_name!='': for i, t in enumerate(texture_name.split('*')): if t in textureMap: @@ -642,22 +611,22 @@ def __importConstraints(io): constraintMeshes.append(meshObject) mesh=bl.object.getData(meshObject) bl.mesh.addMaterial(mesh, material) - meshObject.name='c_%d' % i + meshObject.name='c_%03d' % i #meshObject.draw_transparent=True #meshObject.draw_wire=True meshObject.draw_type='SOLID' rot=c.rot meshObject.rotation_euler=(-rot.x, -rot.z, -rot.y) - meshObject[CONSTRAINT_NAME]=c.name - meshObject[CONSTRAINT_A]=io.rigidbodies[c.rigidA].name - meshObject[CONSTRAINT_B]=io.rigidbodies[c.rigidB].name - meshObject[CONSTRAINT_POS_MIN]=VtoV(c.constraintPosMin) - meshObject[CONSTRAINT_POS_MAX]=VtoV(c.constraintPosMax) - meshObject[CONSTRAINT_ROT_MIN]=VtoV(c.constraintRotMin) - meshObject[CONSTRAINT_ROT_MAX]=VtoV(c.constraintRotMax) - meshObject[CONSTRAINT_SPRING_POS]=VtoV(c.springPos) - meshObject[CONSTRAINT_SPRING_ROT]=VtoV(c.springRot) + meshObject[bl.CONSTRAINT_NAME]=c._name + meshObject[bl.CONSTRAINT_A]=io.rigidbodies[c.rigidA]._name + meshObject[bl.CONSTRAINT_B]=io.rigidbodies[c.rigidB]._name + meshObject[bl.CONSTRAINT_POS_MIN]=VtoV(c.constraintPosMin) + meshObject[bl.CONSTRAINT_POS_MAX]=VtoV(c.constraintPosMax) + meshObject[bl.CONSTRAINT_ROT_MIN]=VtoV(c.constraintRotMin) + meshObject[bl.CONSTRAINT_ROT_MAX]=VtoV(c.constraintRotMax) + meshObject[bl.CONSTRAINT_SPRING_POS]=VtoV(c.springPos) + meshObject[bl.CONSTRAINT_SPRING_ROT]=VtoV(c.springRot) for meshObject in reversed(constraintMeshes): bl.object.makeParent(container, meshObject) @@ -711,8 +680,8 @@ def __importRigidBodies(io): mesh=bl.object.getData(meshObject) rigidMeshes.append(meshObject) bl.mesh.addMaterial(mesh, material) - meshObject.name='r_%d' % i - meshObject[RIGID_NAME]=rigid.name + meshObject.name='r_%03d' % i + meshObject[bl.RIGID_NAME]=rigid._name #meshObject.draw_transparent=True #meshObject.draw_wire=True meshObject.draw_type='WIRE' @@ -720,21 +689,21 @@ def __importRigidBodies(io): meshObject.rotation_euler=(-rot.x, -rot.z, -rot.y) # custom properties - meshObject[RIGID_SHAPE_TYPE]=rigid.shapeType - meshObject[RIGID_PROCESS_TYPE]=rigid.processType + meshObject[bl.RIGID_SHAPE_TYPE]=rigid.shapeType + meshObject[bl.RIGID_PROCESS_TYPE]=rigid.processType - bone_name = englishmap.getEnglishBoneName(bone.name) + bone_name = englishmap.getEnglishBoneName(bone._name) if not bone_name: - bone_name=bone.name - meshObject[RIGID_BONE_NAME]=bone_name + bone_name=bone._name + meshObject[bl.RIGID_BONE_NAME]=bone_name - meshObject[RIGID_GROUP]=rigid.group - meshObject[RIGID_INTERSECTION_GROUP]=rigid.target - meshObject[RIGID_WEIGHT]=rigid.weight - meshObject[RIGID_LINEAR_DAMPING]=rigid.linearDamping - meshObject[RIGID_ANGULAR_DAMPING]=rigid.angularDamping - meshObject[RIGID_RESTITUTION]=rigid.restitution - meshObject[RIGID_FRICTION]=rigid.friction + meshObject[bl.RIGID_GROUP]=rigid.group + meshObject[bl.RIGID_INTERSECTION_GROUP]=rigid.target + meshObject[bl.RIGID_WEIGHT]=rigid.weight + meshObject[bl.RIGID_LINEAR_DAMPING]=rigid.linearDamping + meshObject[bl.RIGID_ANGULAR_DAMPING]=rigid.angularDamping + meshObject[bl.RIGID_RESTITUTION]=rigid.restitution + meshObject[bl.RIGID_FRICTION]=rigid.friction for meshObject in reversed(rigidMeshes): bl.object.makeParent(container, meshObject) @@ -757,13 +726,13 @@ def _execute(filepath=""): bl.progress_set('loaded', 0.1) # create root object - model_name=io.english_name + model_name=io._english_name if len(model_name)==0: - model_name=io.name + model_name=io._name root=bl.object.createEmpty(model_name) - root[MMD_MB_NAME]=io.name - root[MMD_MB_COMMENT]=io.comment - root[MMD_COMMENT]=io.english_comment + root[bl.MMD_MB_NAME]=io._name + root[bl.MMD_MB_COMMENT]=io._comment + root[bl.MMD_COMMENT]=io._english_comment # toon textures tex_dir=os.path.dirname(filepath)