Tooltip: 'Import PMD file for MikuMikuDance.'
"""
__author__= ["ousttrue"]
-__version__= "1.2"
+__version__= "1.8"
__url__=()
__bpydoc__="""
pmd Importer
1.5 20100626: refactoring.
1.6 20100629: sphere map.
1.7 20100703: implement bone group.
+1.8 20100710: implement toon texture.
"""
MMD_SHAPE_GROUP_NAME='_MMD_SHAPE'
CONSTRAINT_ROT_MAX='const_rot_max'
CONSTRAINT_SPRING_POS='const_spring_pos'
CONSTRAINT_SPRING_ROT='const_spring_rot'
+TOON_TEXTURE_OBJECT='ToonTextures'
###############################################################################
def createPmdMaterial(m, index):
material=Blender.Material.New()
- #material.setRef(1)
- #material.diffuseSize = 3.14/2
- #material.setDiffuseSmooth(0)
- #material.setSpecSize(0)
- #material.setSpec(0)
- # shader
- # diffuse
+ # fresnelが無いw
material.setDiffuseShader(Blender.Material.Shaders.DIFFUSE_TOON)
material.setRGBCol([m.diffuse.r, m.diffuse.g, m.diffuse.b])
material.setAlpha(m.diffuse.a)
elif n.startswith("ankle_"):
b.lockYRot=True
- def setSphereMap(material, index, blende_type=None):
- pass
+ def setSphereMap(material, index, blend_type='MULTIPLY'):
+ slot=material.textures[index]
+ slot.mapto=Blender.Texture.MapTo.NOR
+ slot.mapping=Blender.Texture.Mappings.SPHERE
+ if blend_type=='MULTIPLY':
+ slot.blendmode=Blender.Texture.BlendModes.MULTIPLY
+ elif blend_type=='ADD':
+ slot.blendmode=Blender.Texture.BlendModes.ADD
else:
# for 2.5
#b.ik_dof_y=False
pass
- def setSphereMap(material, index, blend_type=None):
+ def setSphereMap(material, index, blend_type='MULTIPLY'):
slot=material.texture_slots[index]
- slot.texture_coordinates='REFLECTION'
+ slot.texture_coordinates='NORMAL'
slot.mapping='SPHERE'
- if blend_type:
- slot.blend_type=blend_type
+ slot.blend_type=blend_type
###############################################################################
def VtoV(v):
return bl.createVector(v.x, v.y, v.z)
+
def convert_coord(pos):
"""
Left handed y-up to Right handed z-up
print('invalid bone index', index)
return l.bones[0].getName()
+
+def get_group_name(g):
+ group_name=englishmap.getEnglishBoneGroupName(g.getName().strip())
+ if not group_name:
+ group_name=g.getName().strip()
+ return group_name
+
+
+def __importToonTextures(io, tex_dir):
+ 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())
+ texture, image=bl.texture.create(path)
+ bl.material.addTexture(material, texture, False)
+ return meshObject, material
+
+
def __importShape(obj, l, vertex_map):
if len(l.morph_list)==0:
return
else:
# create bone group
for i, g in enumerate(l.bone_group_list):
- name=englishmap.getEnglishBoneGroupName(g.getName().strip())
- if not name:
- name=g.getName()
+ name=get_group_name(g)
bl.object.createBoneGroup(armature_object, name, "THEME%02d" % (i+1))
# assign bone to group
bone_name=b.getName()
# group
g=l.bone_group_list[g_index-1]
- group_name=englishmap.getEnglishBoneGroupName(g.getName().strip())
- if not group_name:
- group_name=g.getName()
+ group_name=get_group_name(g)
# assign
pose.bones[bone_name].bone_group=pose.bone_groups[group_name]
def __import16MaerialAndMesh(meshObject, l,
- material_order, face_map, tex_dir):
+ material_order, face_map, tex_dir, toon_material):
mesh=bl.object.getData(meshObject)
############################################################
break
material=createPmdMaterial(m, material_index)
+ toon_index=bl.material.addTexture(
+ material,
+ bl.material.getTexture(
+ toon_material,
+ 0 if m.toon_index==0xFF else m.toon_index
+ ),
+ False)
texture_name=m.getTexture()
if texture_name!='':
texture, image=bl.texture.create(path)
textureMap[texture_name]=texture
imageMap[material_index]=image
- bl.material.addTexture(material, texture)
+ texture_index=bl.material.addTexture(material, texture)
if t.endswith('sph'):
# sphere map
- setSphereMap(material, i)
+ setSphereMap(material, texture_index)
elif t.endswith('spa'):
# sphere map
- setSphereMap(material, i, 'ADD')
+ setSphereMap(material, texture_index, 'ADD')
bl.mesh.addMaterial(mesh, material)
index+=1
return vertex_map
-def __importMaterialAndMesh(io, tex_dir):
+def __importMaterialAndMesh(io, tex_dir, toon_material):
"""
@param l[in] mmd.PMDLoader
@param filename[in]
# shapeキーで使われる順に並べなおしたマテリアル16個分の
# メッシュを作成する
vertex_map=__import16MaerialAndMesh(
- meshObject, io, material16, face_map, tex_dir)
+ meshObject, io, material16, face_map, tex_dir, toon_material)
# crete shape key
__importShape(meshObject, io, vertex_map)
root=bl.object.createEmpty(model_name)
# toon textures
- #__importToonTextures(io)
+ tex_dir=os.path.dirname(filename)
+ toonTextures, toonMaterial=__importToonTextures(io, tex_dir)
+ bl.object.makeParent(root, toonTextures)
# import mesh
- mesh_objects=__importMaterialAndMesh(io, os.path.dirname(filename))
+ mesh_objects=__importMaterialAndMesh(io, tex_dir, toonMaterial)
for o in mesh_objects:
bl.object.makeParent(root, o)