Tooltip: 'Import PMD file for MikuMikuDance.'
"""
__author__= ["ousttrue"]
-__version__= "2.4"
+__version__= "2.5"
__url__=()
__bpydoc__="""
pmd Importer
2.2 20101005: update for Blender2.54.
2.3 20101228: update for Blender2.55.
2.4 20110429: update for Blender2.57b.
+2.5 20110522: implement RigidBody and Constraint.
"""
bl_addon_info = {
'category': 'Import/Export',
RIGID_ANGULAR_DAMPING='rigid_angular_damping'
RIGID_RESTITUTION='rigid_restitution'
RIGID_FRICTION='rigid_friction'
-CONSTRAINT_NAME='constraint_name'
+CONSTRAINT_NAME='const_name'
CONSTRAINT_A='const_a'
CONSTRAINT_B='const_b'
CONSTRAINT_POS_MIN='const_pos_min'
def get_bone_name(l, index):
if index==0xFFFF:
- return l.bones[0].getName()
+ return l.bones[0]._name
if index < len(l.bones):
- name=englishmap.getEnglishBoneName(l.bones[index].getName())
+ name=englishmap.getEnglishBoneName(l.bones[index]._name)
if name:
return name
- return l.bones[index].getName()
+ return l.bones[index]._name
print('invalid bone index', index)
- return l.bones[0].getName()
+ return l.bones[0]._name
def get_group_name(g):
- group_name=englishmap.getEnglishBoneGroupName(g.getName().strip())
+ group_name=englishmap.getEnglishBoneGroupName(g._name.strip())
if not group_name:
- group_name=g.getName().strip()
+ group_name=g._name.strip()
return group_name
mesh, meshObject=bl.mesh.create(TOON_TEXTURE_OBJECT)
material=bl.material.create(TOON_TEXTURE_OBJECT)
bl.mesh.addMaterial(mesh, material)
- for i in range(10):
- t=io.getToonTexture(i)
- path=os.path.join(tex_dir, t.getName())
+ 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)
return meshObject, material
continue
# name
- name=englishmap.getEnglishSkinName(s.getName())
+ name=englishmap.getEnglishSkinName(s._name)
if not name:
- name=s.getName()
+ 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.getName())
+ name=englishmap.getEnglishBoneName(b._name)
if not name:
- name=b.getName()
+ name=b._name
bone=bl.armature.createBone(armature, name)
pose = bl.object.getPose(armature_object)
for ik in l.ik_list:
target=l.bones[ik.target]
- name = englishmap.getEnglishBoneName(target.getName())
+ name = englishmap.getEnglishBoneName(target._name)
if not name:
- name=target.getName()
+ name=target._name
p_bone = pose.bones[name]
if not p_bone:
print('not found', name)
print('over MAX_CHAINLEN', ik, len(ik.children))
continue
effector_name=englishmap.getEnglishBoneName(
- l.bones[ik.index].getName())
+ l.bones[ik.index]._name)
if not effector_name:
- effector_name=l.bones[ik.index].getName()
+ effector_name=l.bones[ik.index]._name
constraint=bl.armature.createIkConstraint(armature_object,
p_bone, effector_name, ik)
for b_index, g_index in l.bone_display_list:
# bone
b=l.bones[b_index]
- bone_name=englishmap.getEnglishBoneName(b.getName())
+ bone_name=englishmap.getEnglishBoneName(b._name)
if not bone_name:
- bone_name=b.getName()
+ bone_name=b._name
# group
g=l.bone_group_list[g_index-1]
group_name=get_group_name(g)
material=createPmdMaterial(m, material_index)
# main texture
- texture_name=m.getTexture()
+ texture_name=m._texture
if texture_name!='':
for i, t in enumerate(texture_name.split('*')):
if t in textureMap:
def __importConstraints(io):
print("create constraint")
container=bl.object.createEmpty('Constraints')
- layer=[
+ layers=[
True, False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False, False,
]
for i, c in enumerate(io.constraints):
bpy.ops.mesh.primitive_uv_sphere_add(
segments=8,
- rings=4,
+ ring_count=4,
size=0.1,
location=(c.pos.x, c.pos.z, c.pos.y),
- layer=layer
+ layers=layers
)
meshObject=bl.object.getActive()
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.max_draw_type='SOLID'
+ meshObject.draw_type='SOLID'
rot=c.rot
meshObject.rotation_euler=(-rot.x, -rot.z, -rot.y)
- meshObject[CONSTRAINT_NAME]=c.getName()
- meshObject[CONSTRAINT_A]=io.rigidbodies[c.rigidA].getName()
- meshObject[CONSTRAINT_B]=io.rigidbodies[c.rigidB].getName()
+ 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)
print("create rigid bodies")
container=bl.object.createEmpty('RigidBodies')
- layer=[
+ layers=[
True, False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False, False,
]
if rigid.shapeType==pmd.SHAPE_SPHERE:
bpy.ops.mesh.primitive_ico_sphere_add(
location=(pos.x, pos.z, pos.y),
- layer=layer
+ layers=layers
)
bpy.ops.transform.resize(
value=(rigid.w, rigid.w, rigid.w))
elif rigid.shapeType==pmd.SHAPE_BOX:
bpy.ops.mesh.primitive_cube_add(
location=(pos.x, pos.z, pos.y),
- layer=layer
+ layers=layers
)
bpy.ops.transform.resize(
value=(rigid.w, rigid.d, rigid.h))
elif rigid.shapeType==pmd.SHAPE_CAPSULE:
- bpy.ops.mesh.primitive_tube_add(
+ bpy.ops.mesh.primitive_cylinder_add(
location=(pos.x, pos.z, pos.y),
- layer=layer
+ layers=layers
)
bpy.ops.transform.resize(
value=(rigid.w, rigid.w, rigid.h))
mesh=bl.object.getData(meshObject)
rigidMeshes.append(meshObject)
bl.mesh.addMaterial(mesh, material)
- meshObject.name='r_%d' % i
- meshObject[RIGID_NAME]=rigid.getName()
+ meshObject.name='r_%03d' % i
+ meshObject[RIGID_NAME]=rigid._name
#meshObject.draw_transparent=True
#meshObject.draw_wire=True
- meshObject.max_draw_type='WIRE'
+ meshObject.draw_type='WIRE'
rot=rigid.rotation
meshObject.rotation_euler=(-rot.x, -rot.z, -rot.y)
meshObject[RIGID_SHAPE_TYPE]=rigid.shapeType
meshObject[RIGID_PROCESS_TYPE]=rigid.processType
- bone_name = englishmap.getEnglishBoneName(bone.getName())
+ bone_name = englishmap.getEnglishBoneName(bone._name)
if not bone_name:
- bone_name=bone.getName()
+ bone_name=bone._name
meshObject[RIGID_BONE_NAME]=bone_name
meshObject[RIGID_GROUP]=rigid.group
bl.progress_set('loaded', 0.1)
# create root object
- model_name=io.getEnglishName()
+ model_name=io._english_name
if len(model_name)==0:
- model_name=io.getName()
+ model_name=io._name
root=bl.object.createEmpty(model_name)
- root[MMD_MB_NAME]=io.getName()
- root[MMD_MB_COMMENT]=io.getComment()
- root[MMD_COMMENT]=io.getEnglishComment()
+ root[MMD_MB_NAME]=io._name
+ root[MMD_MB_COMMENT]=io._comment
+ root[MMD_COMMENT]=io._english_comment
# toon textures
tex_dir=os.path.dirname(filepath)