"""
MMD_SHAPE_GROUP_NAME='_MMD_SHAPE'
+BASE_SHAPE_NAME='Basis'
###############################################################################
progressBar.set(message, progress)
-if isBlender24():
- # functions
- def convert_coord(pos):
- """
- Left handed y-up to Right handed z-up
- """
- return (pos.x, pos.z, pos.y)
-
-
- def convert_uv(uv):
- return (uv.x, 1.0 - uv.y)
+###############################################################################
+def convert_coord(pos):
+ """
+ Left handed y-up to Right handed z-up
+ """
+ return (pos.x, pos.z, pos.y)
- def get_bone_name(l, index):
- name=englishmap.getEnglishBoneName(l.bones[index].getName())
- return name if name else l.bones[index].getName().encode(bl.INTERNAL_ENCODING)
+def convert_uv(uv):
+ return (uv.x, 1.0 - uv.y)
- def createMaterial():
- """
- create default materil
- """
- material=Blender.Material.New()
- material.setDiffuseShader(Blender.Material.Shaders.DIFFUSE_TOON)
- material.setRef(1)
- material.diffuseSize = 3.14/2
- material.setDiffuseSmooth(0)
- material.setSpecShader(Blender.Material.Shaders.SPEC_TOON)
- material.setSpecSize(0)
- material.setSpec(0)
- return material
-
-
- def import16MaerialAndMesh(meshObject, l,
- material_order, face_map, tex_dir):
- mesh=bl.objectGetData(meshObject)
- ############################################################
- # material
- ############################################################
- progress_print('create materials')
- mesh_material_map={}
- materials=[]
- index=0
- for material_index in material_order:
- try:
- m=l.materials[material_index]
- mesh_material_map[material_index]=index
- except KeyError:
- break
-
- material=createMaterial()
- material.setRGBCol([m.diffuse.r, m.diffuse.g, m.diffuse.b])
- material.setAlpha(m.diffuse.a)
- material.setSpec(m.shinness*0.1)
- material.setSpecCol([m.specular.r, m.specular.g, m.specular.b])
- material.setMirCol([m.ambient.r, m.ambient.g, m.ambient.b])
- material.enableSSS=True if m.flag==1 else False
- # set texture
- if m.getTexture()!='':
- tex_file=re.compile('\*.*.spa$').sub('', m.getTexture())
- tex_path = os.path.join(tex_dir, tex_file).encode(
- bl.INTERNAL_ENCODING)
- tex = Blender.Texture.New()
- tex.setType("Image")
- try:
- tex.image = Blender.Image.Load(tex_path)
- material.setTexture(0, tex)
- material.getTextures()[0].texco = Blender.Texture.TexCo.UV
- except IOError:
- print(material.name, "fail to load", tex_path)
- materials.append(material)
- # lookup table for assign
- index+=1
- mesh.materials=materials
-
- ############################################################
- # vertex
- ############################################################
- progress_print('create vertices')
- # create vertices
- vertex_groups={}
- vertices=[]
- for v in l.each_vertex():
- vertices.append(convert_coord(v.pos))
- vertex_groups[v.bone0]=True
- vertex_groups[v.bone1]=True
- mesh.verts.extend(vertices)
-
- # create vertex group
- for i in vertex_groups.keys():
- mesh.addVertGroup(get_bone_name(l, i))
-
- # vertex params
- for i, v, mvert in zip(xrange(len(l.vertices)), l.each_vertex(), mesh.verts):
- mvert.no=Mathutils.Vector(*convert_coord(v.normal))
- mvert.uvco=convert_uv(v.uv)
- w1=float(v.weight0)/100.0
- w2=1.0-w1
- mesh.assignVertsToGroup(get_bone_name(l, v.bone0), [i], w1,
- Blender.Mesh.AssignModes.ADD)
- mesh.assignVertsToGroup(get_bone_name(l, v.bone1), [i], w2,
- Blender.Mesh.AssignModes.ADD)
-
- ############################################################
- # face
- ############################################################
- progress_print('create faces')
- # create faces
- mesh_face_indices=[]
- mesh_face_materials=[]
- used_vertices=set()
-
- def degenerate(i0, i1, i2):
- return i0==i1 or i1==i2 or i2==i0
-
- for material_index in material_order:
- face_offset=face_map[material_index]
- m=l.materials[material_index]
- material_faces=l.indices[face_offset:face_offset+m.vertex_count]
- for j in xrange(0, len(material_faces), 3):
- i0=material_faces[j]
- i1=material_faces[j+1]
- i2=material_faces[j+2]
- triangle=[i0, i1, i2]
- if degenerate(*triangle):
- continue
- mesh_face_indices.append(triangle)
- mesh_face_materials.append(material_index)
- used_vertices.add(i0)
- used_vertices.add(i1)
- used_vertices.add(i2)
+def to_radian(degree):
+ return math.pi * degree / 180
- mesh.faces.extend(mesh_face_indices, ignoreDups=True)
-
- # face params
- used_map={}
- mesh.addUVLayer('NewUV')
- for face, material_index in zip(mesh.faces, mesh_face_materials):
- try:
- index=mesh_material_map[material_index]
- except KeyError as message:
- print(message, mesh_material_map, m)
- assert(False)
- face.mat=index
- material=mesh.materials[index]
- texture=material.getTextures()[0]
- used_map[index]=True
- if texture:
- face.image=texture.tex.image
- texture.tex.imageFlags|=Blender.Texture.ImageFlags.USEALPHA
- face.uv=[face.verts[0].uvco, face.verts[1].uvco, face.verts[2].uvco]
- # set smooth
- face.smooth = 1
- # flip
- mesh.flipNormals()
-
- ############################################################
- # clean up not used vertices
- ############################################################
- progress_print('clean up vertices not used')
- remove_vertices=[]
- vertex_map={}
- for i, v in enumerate(l.each_vertex()):
- if i in used_vertices:
- vertex_map[i]=len(vertex_map)
- else:
- remove_vertices.append(i)
- mesh.verts.delete(remove_vertices)
-
- progress_print('%s created' % mesh.name)
- return vertex_map
-
-
- class Builder(object):
- def __init__(self):
- self.boneMap={}
-
- def build(self, armature, bones):
- for b in bones:
- if not b.parent:
- self.__build(armature, b, None, None)
- armature.update()
-
- def __build(self, armature, b, p, parent):
- name=englishmap.getEnglishBoneName(b.getName())
- if not name:
- name=b.getName().encode(bl.INTERNAL_ENCODING)
- self.boneMap[name]=b
-
- bone=Blender.Armature.Editbone()
- bone.name=name
- armature.bones[name]=bone
-
- if b.tail_index==0:
- # 先端
- assert(b.type==6 or b.type==7)
- bone.head = Mathutils.Vector(*convert_coord(b.pos))
- bone.tail=bone.head+Mathutils.Vector(0, 1, 0)
- assert(parent)
- bone.parent=parent
- if bone.name=="center_t":
- # センターボーンは(0, 1, 0)の方向を向いていないと具合が悪い
- parent.tail=parent.head+Mathutils.Vector(0, 1, 0)
- bone.head=parent.tail
- bone.tail=bone.head+Mathutils.Vector(0, 1, 0)
- else:
- assert(parent.tail==bone.head)
- bone.options=[Blender.Armature.CONNECTED]
- # armature layer 2
- bone.layerMask = (1<<1)
- else:
- bone.head = Mathutils.Vector(*convert_coord(b.pos))
- bone.tail = Mathutils.Vector(*convert_coord(b.tail))
- if parent:
- bone.parent=parent
- if parent.tail==bone.head:
- bone.options=[Blender.Armature.CONNECTED]
-
- if bone.head==bone.tail:
- bone.tail=bone.head+Mathutils.Vector(0, 1, 0)
-
- for c in b.children:
- self.__build(armature, c, b, bone)
-
-
- def importArmature(scene, l):
- # create armature
- armature = Blender.Armature.New()
- # link to object
- armature_object = scene.objects.new(armature)
- # create action
- act = Blender.Armature.NLA.NewAction()
- act.setActive(armature_object)
- # set XRAY
- armature_object.drawMode = (
- armature_object.drawMode | Blender.Object.DrawModes.XRAY)
- # armature settings
- armature.drawType = Blender.Armature.OCTAHEDRON
- armature.drawNames=True
- armature.envelopes = False
- armature.vertexGroups = True
- armature.mirrorEdit = True
-
- # create armature
- armature.makeEditable()
-
- ############################################################
- # build bone
- ############################################################
- builder=Builder()
- builder.build(armature, l.bones)
-
- ############################################################
- # IK
- ############################################################
- pose = armature_object.getPose()
- cSetting = Blender.Constraint.Settings
- for ik in l.ik_list:
- # IKtarget->parent(=IK).name
- target=l.bones[ik.target]
- name = englishmap.getEnglishBoneName(target.getName())
- p_bone = pose.bones[name]
- if not p_bone:
- print('not found', name)
- continue
- if len(ik.children) >= 16:
- print('over MAX_CHAINLEN', ik, len(ik.children))
- continue
- # IK solver
- ik_solver = p_bone.constraints.append(Blender.Constraint.Type.IKSOLVER)
- ik_solver[cSetting.CHAINLEN]=len(ik.children)
- ik_solver[cSetting.TARGET]=armature_object
- ik_solver[cSetting.USETIP]=False
-
- effector_name=englishmap.getEnglishBoneName(
- l.bones[ik.index].getName())
- if not effector_name:
- effector_name=l.bones[ik.index].getName()
-
- ik_solver[cSetting.BONE]=effector_name
- #ik_solver.influence=ik.weight
- # not used. place folder when export.
- ik_solver[cSetting.ROTWEIGHT]=ik.weight
- ik_solver[cSetting.ITERATIONS]=ik.iterations * 10
-
- armature.makeEditable()
- armature.update()
-
- return armature_object
-
- def importShape(obj, l, vertex_map):
- if len(l.morph_list)==0:
- return
- obj.pinShape=True
- mesh=obj.getData(mesh=True)
+def get_bone_name(l, index):
+ name=englishmap.getEnglishBoneName(l.bones[index].getName())
+ return name if name else l.bones[index].getName()
- # find base
- base=None
- for s in l.morph_list:
- if s.type==0:
- base=s
-
- # create vertex group
- mesh.addVertGroup(MMD_SHAPE_GROUP_NAME)
- indices=[]
- hasShape=False
- for i in s.indices:
- if i in vertex_map:
- hasShape=True
- indices.append(vertex_map[i])
- mesh.assignVertsToGroup(MMD_SHAPE_GROUP_NAME, indices, 0,
- Blender.Mesh.AssignModes.ADD)
- if not hasShape:
- return
-
- # create base key
- mesh.insertKey()
- assert(len(mesh.key.blocks)==1)
- baseShapeIndex=0
- baseShapeBlock=mesh.key.blocks[baseShapeIndex]
- baseShapeBlock.name='Basis'
- obj.activeShape=baseShapeIndex
- mesh.update()
- break
+def __importShape(obj, l, vertex_map):
+ if len(l.morph_list)==0:
+ return
- assert(base)
+ # set shape_key pin
+ bl.objectPinShape(obj)
- # each skin
- for s in l.morph_list:
- if s.name==base.name:
- continue
+ # find base
+ base=None
+ for s in l.morph_list:
+ if s.type==0:
+ base=s
+ # create vertex group
+ bl.meshAddVertexGroup(obj, MMD_SHAPE_GROUP_NAME)
+ hasShape=False
+ for i in s.indices:
+ if i in vertex_map:
+ hasShape=True
+ bl.meshAssignVertexGroup(
+ obj, MMD_SHAPE_GROUP_NAME, vertex_map[i], 0)
+ if not hasShape:
+ return
+ assert(base)
+
+ # create base key
+ baseShapeBlock=bl.objectAddShapeKey(obj, BASE_SHAPE_NAME)
+ # mesh
+ mesh=bl.objectGetData(obj)
+ mesh.update()
+
+ # each skin
+ for s in l.morph_list:
+ if s.type==0:
+ continue
+
+ # name
+ name=englishmap.getEnglishSkinName(s.getName())
+ if not name:
+ name=s.getName()
+
+ if isBlender24():
+ # 24
for index, offset in zip(s.indices, s.pos_list):
try:
vertex_index=vertex_map[base.indices[index]]
v[0]+=offset[0]
v[1]+=offset[1]
v[2]+=offset[2]
- except IndexErrora as msg:
+ except IndexError as msg:
print(msg)
print(index, len(base.indices), len(vertex_map))
print(len(mesh.verts))
#print 'this mesh not has shape vertices'
break
- # get skin name
- name=englishmap.getEnglishSkinName(s.getName())
- if not name:
- name=s.getName().encode(bl.INTERNAL_ENCODING)
- print(name)
-
# create shapekey block
- mesh.insertKey()
- shapeIndex=len(mesh.key.blocks)-1
- keyBlock=mesh.key.blocks[shapeIndex]
- keyBlock.name=name
+ new_shape_key=bl.objectAddShapeKey(obj, name)
# copy vertex to shape key
mesh.update()
mv.co[2] = v[2]
mesh.update()
- # select base shape
- obj.activeShape=baseShapeIndex
+ else:
+ # 25
+ new_shape_key=bl.objectAddShapeKey(obj, name)
-else:
- # for 2.5
- def to_radian(degree):
- return math.pi * degree / 180
+ for index, offset in zip(s.indices, s.pos_list):
+ try:
+ vertex_index=vertex_map[base.indices[index]]
+ bl.shapeKeyAssign(new_shape_key, vertex_index,
+ mesh.verts[vertex_index].co+
+ bl.createVector(*convert_coord(offset)))
+ except IndexError as msg:
+ print(msg)
+ print(index, len(base.indices), len(vertex_map))
+ print(len(mesh.verts))
+ print(base.indices[index])
+ print(vertex_index)
+ break
+ except KeyError:
+ #print 'this mesh not has shape vertices'
+ break
+
+ # select base shape
+ bl.objectActivateShapeKey(obj, 0)
+
+
+def __build(armature, b, p, parent):
+ name=englishmap.getEnglishBoneName(b.getName())
+ if not name:
+ name=b.getName()
+
+ bone=bl.createArmatureBone(armature, name)
+
+ if b.tail_index==0:
+ # 先端
+ assert(b.type==6 or b.type==7)
+ bone.head = bl.createVector(*convert_coord(b.pos))
+ bone.tail=bone.head+bl.createVector(0, 1, 0)
+ assert(parent)
+ bone.parent=parent
+ if bone.name=="center_t":
+ # センターボーンは(0, 1, 0)の方向を向いていないと具合が悪い
+ parent.tail=parent.head+bl.createVector(0, 1, 0)
+ bone.head=parent.tail
+ bone.tail=bone.head+bl.createVector(0, 1, 0)
+ else:
+ assert(parent.tail==bone.head)
+ bl.boneSetConnected(bone)
+ # armature layer 2
+ bl.boneLayerMask(bone, [0, 1])
+ else:
+ bone.head = bl.createVector(*convert_coord(b.pos))
+ bone.tail = bl.createVector(*convert_coord(b.tail))
+ if parent:
+ bone.parent=parent
+ if parent.tail==bone.head:
+ bl.boneSetConnected(bone)
+
+ if bone.head==bone.tail:
+ bone.tail=bone.head+bl.createVector(0, 1, 0)
+
+ for c in b.children:
+ __build(armature, c, b, bone)
+
+
+def __importArmature(scene, l):
+ # build bone
+ armature, armature_object=bl.createArmature(scene)
+ bl.armatureMakeEditable(scene, armature_object)
+ for b in l.bones:
+ if not b.parent:
+ __build(armature, b, None, None)
+ bl.armatureUpdate(armature)
+ bl.exitEditMode()
+
+ # IK constraint
+ pose = bl.objectGetPose(armature_object)
+ for ik in l.ik_list:
+ target=l.bones[ik.target]
+ name = englishmap.getEnglishBoneName(target.getName())
+ if not name:
+ name=target.getName()
+ p_bone = pose.bones[name]
+ if not p_bone:
+ print('not found', name)
+ continue
+ if len(ik.children) >= 16:
+ print('over MAX_CHAINLEN', ik, len(ik.children))
+ continue
+ effector_name=englishmap.getEnglishBoneName(
+ l.bones[ik.index].getName())
+ if not effector_name:
+ effector_name=l.bones[ik.index].getName()
+
+ constraint=bl.createIkConstraint(armature_object,
+ p_bone, effector_name, ik)
+
+ bl.armatureMakeEditable(scene, armature_object)
+ bl.armatureUpdate(armature)
+ bl.exitEditMode()
+
+ return armature_object
+
+def __import16MaerialAndMesh(meshObject, l,
+ material_order, face_map, tex_dir):
- def convert_coord(pos):
- """
- Left handed y-up to Right handed z-up
- """
- return (pos.x, pos.z, pos.y)
+ mesh=bl.objectGetData(meshObject)
+ ############################################################
+ # material
+ ############################################################
+ progress_print('create materials')
+ mesh_material_map={}
+ textureMap={}
+ imageMap={}
+ index=0
+
+ for material_index in material_order:
+ try:
+ m=l.materials[material_index]
+ mesh_material_map[material_index]=index
+ except KeyError:
+ break
+
+ material=bl.createPmdMaterial(m)
+
+ texture_name=m.getTexture()
+ if texture_name!='':
+ if texture_name in textureMap:
+ texture=textureMap[texture_name]
+ else:
+ try:
+ texture, image=bl.createTexture(
+ os.path.join(tex_dir, texture_name))
+ textureMap[texture_name]=texture
+ imageMap[material_index]=image
+ except:
+ continue
+ bl.materialAddTexture(material, texture)
+ bl.meshAddMaterial(mesh, material)
+ index+=1
+ ############################################################
+ # vertex
+ ############################################################
+ progress_print('create vertices')
+ # create vertices
+ vertices=[]
+ if isBlender24():
+ for v in l.each_vertex():
+ vertices.append(convert_coord(v.pos))
+ else:
+ for v in l.each_vertex():
+ vertices.extend(convert_coord(v.pos))
- def convert_uv(uv):
- return (uv.x, 1.0 - uv.y)
+ ############################################################
+ # face
+ ############################################################
+ progress_print('create faces')
+ # create faces
+ mesh_face_indices=[]
+ mesh_face_materials=[]
+ used_vertices=set()
+ for material_index in material_order:
+ face_offset=face_map[material_index]
+ m=l.materials[material_index]
+ material_faces=l.indices[face_offset:face_offset+m.vertex_count]
- def getBoneName(bone):
- name = englishmap.getEnglishBoneName(bone.getName())
- return name if name else bone.getName()
+ def degenerate(i0, i1, i2):
+ """
+ 縮退しているか?
+ """
+ return i0==i1 or i1==i2 or i2==i0
+ for j in xrange(0, len(material_faces), 3):
+ i0=material_faces[j]
+ i1=material_faces[j+1]
+ i2=material_faces[j+2]
+ if i2==0:
+ triangle=[i2, i0, i1]
+ else:
+ triangle=[i0, i1, i2]
+ if degenerate(*triangle):
+ continue
+ if isBlender24():
+ mesh_face_indices.append(triangle[0:3])
+ else:
+ mesh_face_indices.extend(
+ [triangle[0], triangle[1], triangle[2], 0])
+ mesh_face_materials.append(material_index)
+ used_vertices.add(i0)
+ used_vertices.add(i1)
+ used_vertices.add(i2)
- def create_texture(directory, texture_name):
- texture=bpy.data.textures.new(texture_name)
- texture.type='IMAGE'
- texture=texture.recast_type()
- texturePath=os.path.join(directory, texture_name)
- print('create_texture', texturePath)
- image=bpy.data.images.load(texturePath)
- texture.image=image
- texture.mipmap = True
- texture.interpolation = True
- texture.use_alpha = True
- return texture
+ ############################################################
+ # create vertices & faces
+ ############################################################
+ bl.meshCreateVerteicesAndFaces(mesh, vertices, mesh_face_indices)
+ ############################################################
+ # vertex bone weight
+ ############################################################
+ # create vertex group
+ vertex_groups={}
+ for v in l.each_vertex():
+ vertex_groups[v.bone0]=True
+ vertex_groups[v.bone1]=True
+ for i in vertex_groups.keys():
+ bl.meshAddVertexGroup(meshObject, get_bone_name(l, i))
+
+ # vertex params
+ bl.meshUseVertexUv(mesh)
+ for i, v, mvert in zip(xrange(len(l.vertices)),
+ l.each_vertex(), mesh.verts):
+ # normal, uv
+ bl.vertexSetNormal(mvert, convert_coord(v.normal))
+ bl.vertexSetUv(mvert, convert_uv(v.uv))
+ # bone weight
+ w1=float(v.weight0)/100.0
+ w2=1.0-w1
+ bl.meshAssignVertexGroup(meshObject, get_bone_name(l, v.bone0),
+ i, w1)
+ bl.meshAssignVertexGroup(meshObject, get_bone_name(l, v.bone1),
+ i, w2)
- def createMaterial():
- """
- create default materil
- """
- material = bpy.data.materials.new("Material")
- material.diffuse_shader='TOON'
- material.specular_shader='TOON'
- # temporary
- material.emit=1.0
- return material
-
-
- def import16MaerialAndMesh(meshObject, l,
- material_order, face_map, tex_dir):
- mesh=bl.objectGetData(meshObject)
- ############################################################
- # material
- ############################################################
- #progress_print('create materials')
- mesh_material_map={}
- materials=[]
- textureMap={}
- imageMap={}
- index=0
- for material_index in material_order:
- try:
- m=l.materials[material_index]
- mesh_material_map[material_index]=index
- except KeyError:
- break
-
- material=createMaterial()
- material.diffuse_color=([m.diffuse.r, m.diffuse.g, m.diffuse.b])
- material.alpha=m.diffuse.a
- material.specular_hardness=int(m.shinness)
- material.specular_color=([m.specular.r, m.specular.g, m.specular.b])
- material.mirror_color=([m.ambient.r, m.ambient.g, m.ambient.b])
- texture_name=m.getTexture()
- if texture_name!='':
- if texture_name in textureMap:
- texture=textureMap[texture_name]
- else:
- texture=create_texture(tex_dir, texture_name)
- textureMap[texture_name]=texture
- imageMap[material_index]=texture.image
- #material.add_texture(texture, "UV", {"COLOR", "ALPHA"})
- material.add_texture(texture, "UV", "COLOR")
-
- materials.append(material)
- mesh.add_material(material)
- # lookup table for assign
- index+=1
-
- ############################################################
- # vertex
- ############################################################
- #progress_print('create vertices')
- # create vertices
- vertex_groups={}
- unpackedVertices=[]
- for v in l.each_vertex():
- unpackedVertices.extend(
- convert_coord(v.pos))
- vertex_groups[v.bone0]=True
- vertex_groups[v.bone1]=True
-
- ############################################################
- # face
- ############################################################
- #progress_print('create faces')
- # create faces
- mesh_face_indices=[]
- mesh_face_materials=[]
- used_vertices=set()
-
- for material_index in material_order:
- face_offset=face_map[material_index]
- m=l.materials[material_index]
- material_faces=l.indices[face_offset:face_offset+m.vertex_count]
- for j in range(0, len(material_faces), 3):
- i0=material_faces[j]
- i1=material_faces[j+1]
- i2=material_faces[j+2]
- if i2==0:
- mesh_face_indices.extend([i2, i0, i1, 0])
- else:
- mesh_face_indices.extend([i0, i1, i2, 0])
- mesh_face_materials.append(material_index)
- used_vertices.add(i0)
- used_vertices.add(i1)
- used_vertices.add(i2)
-
- ############################################################
- # create vertices & faces
- ############################################################
- mesh.add_geometry(
- int(len(unpackedVertices)/3), 0, int(len(mesh_face_indices)/4))
- mesh.verts.foreach_set("co", unpackedVertices)
- mesh.faces.foreach_set("verts_raw", mesh_face_indices)
- assert(len(l.vertices)==len(mesh.verts))
-
- ############################################################
- # face params
- ############################################################
- used_map={}
- mesh.add_uv_texture()
+ ############################################################
+ # face params
+ ############################################################
+ used_map={}
+ bl.meshAddUV(mesh)
+ if isBlender24():
+ for face, material_index in zip(mesh.faces, mesh_face_materials):
+ try:
+ index=mesh_material_map[material_index]
+ except KeyError as message:
+ print(message, mesh_material_map, m)
+ assert(False)
+ face.mat=index
+ material=mesh.materials[index]
+ texture=material.getTextures()[0]
+ used_map[index]=True
+ if texture:
+ face.image=texture.tex.image
+ texture.tex.imageFlags|=Blender.Texture.ImageFlags.USEALPHA
+ face.uv=[
+ face.verts[0].uvco, face.verts[1].uvco, face.verts[2].uvco]
+ # set smooth
+ face.smooth = 1
+ # flip
+ mesh.flipNormals()
+ else:
for face, uv_face, material_index in zip(mesh.faces,
mesh.uv_textures[0].data,
mesh_face_materials,
material=mesh.materials[index]
used_map[index]=True
if material.texture_slots[0]:
- #texture=material.texture_slots[0].texture
- #face.image=texture.image
- #texture.imageFlags|=Blender.Texture.ImageFlags.USEALPHA
uv=l.getUV(face.verts[0])
uv_face.uv1=[uv.x, 1.0-uv.y]
# set smooth
face.smooth = 1
+ mesh.update()
- ############################################################
- # vertex weight
- ############################################################
- # create vertex group
- for i in vertex_groups.keys():
- meshObject.add_vertex_group(getBoneName(l.bones[i]))
-
- # vertex params
- for i, v, mvert in zip(range(len(l.vertices)),
- l.each_vertex(), mesh.verts):
- mvert.normal=mathutils.Vector(convert_coord(v.normal))
- #mvert.uvco=convert_uv(v.uv)
- w1=float(v.weight0)/100.0
- w2=1.0-w1
-
- meshObject.add_vertex_to_group(i,
- meshObject.vertex_groups[getBoneName(l.bones[v.bone0])], w1, 'ADD')
- meshObject.add_vertex_to_group(i,
- meshObject.vertex_groups[getBoneName(l.bones[v.bone1])], w2, 'ADD')
- mesh.update()
-
- #progress_print('%s created' % mesh.name)
- return meshObject, used_vertices
-
-
- def build_bone(armature, b, parent=None):
- if b.tail_index==0:
- return
-
- name=getBoneName(b)
- bone = armature.edit_bones.new(name if name else b.getName())
- if parent:
- bone.head = mathutils.Vector(convert_coord(b.pos))
- bone.parent=parent
- bone.connected=True if parent.tail==bone.head else False
- bone.tail = mathutils.Vector(convert_coord(b.tail))
- if bone.head==bone.tail:
- bone.tail=bone.head-mathutils.Vector((0, 1, 0))
- elif b.__class__ is pmd.BONE_IK:
- bone.head = mathutils.Vector(convert_coord(b.pos))
- bone.tail = mathutils.Vector(convert_coord(b.tail))
+ ############################################################
+ # clean up not used vertices
+ ############################################################
+ progress_print('clean up vertices not used')
+ remove_vertices=[]
+ vertex_map={}
+ for i, v in enumerate(l.each_vertex()):
+ if i in used_vertices:
+ vertex_map[i]=len(vertex_map)
else:
- # center
- tail=mathutils.Vector(convert_coord(b.pos))
- bone.tail = tail
- bone.head = tail-mathutils.Vector((0, 1, 0))
-
- for child in b.children:
- build_bone(armature, child, bone)
-
-
- def importArmature(scene, l):
- # create armature
- armature = bpy.data.armatures.new('Armature')
- # link to object
- armature_object=bpy.data.objects.new('Armature', armature)
- scene.objects.link(armature_object)
- armature_object.x_ray=True
- armature.draw_names=True
-
- # armature settings
- armature.drawtype='OCTAHEDRAL'
- armature.deform_envelope=False
- armature.deform_vertexgroups=True
- armature.x_axis_mirror=True
-
- # create action
- #act = Blender.Armature.NLA.NewAction()
- #act.setActive(armature_object)
-
- # select only armature object and set edit mode
- scene.objects.active=armature_object
- bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
- bpy.ops.object.mode_set(mode='EDIT', toggle=False)
-
- # create armature
- for b in l.bones:
- if not b.parent:
- build_bone(armature, b)
-
- bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
- bpy.ops.object.select_all(action='DESELECT')
-
- ############################################################
- # IK
- ############################################################
- pose = armature_object.pose
- for ik in l.ik_list:
- effector=l.bones[ik.target]
- parent=l.bones[effector.parent_index]
- name=getBoneName(parent)
- p_bone = pose.bones[name]
- if not p_bone:
- print('not found', name)
- continue
- if len(ik.children) >= 16:
- print('over MAX_CHAINLEN', ik, len(ik.children))
- continue
- # IK
- ik_const = p_bone.constraints.new('IK')
- ik_const.chain_length=len(ik.children)
- ik_const.target=armature_object
- ik_const.subtarget=getBoneName(l.bones[ik.index])
- # ROT
- rot_const = p_bone.constraints.new('LIMIT_ROTATION')
- rot_const.influence = ik.weight
- rot_const.owner_space = 'LOCAL'
- rot_const.use_limit_x=True
- rot_const.use_limit_z=True
- rot_const.minimum_x=to_radian(ik.iterations)
- rot_const.maximum_x=to_radian(180)
- rot_const.minimum_z=to_radian(180 - ik.iterations)
- rot_const.maximum_z=to_radian(0)
-
- return armature_object
-
+ remove_vertices.append(i)
- def importShape(meshObject, l, vertex_map):
- if len(l.morph_list)==0:
- return
+ bl.meshVertsDelete(mesh, remove_vertices)
- # base
- base=None
- for s in l.morph_list:
- if s.type!=0:
- continue
- base=s
- break
- assert(base)
-
- # create base key
- baseblock=meshObject.add_shape_key("Basis")
-
- # mesh
- mesh=meshObject.data
-
- # each skin
- for s in l.morph_list:
- if s.getName()==base.name:
- # skip base
- continue
+ progress_print('%s created' % mesh.name)
+ return vertex_map
- # restore
- #for v, base_pos in zip(mesh.verts, baseblock.data):
- # v.co=base_pos.co
- #mesh.update()
-
- # name
- name=englishmap.getEnglishSkinName(s.getName())
- if not name:
- name=s.getName()
- new_shape_key=meshObject.add_shape_key(name)
- #new_shape_key.value=1.0
-
- # morph
- for i, offset in zip(s.indices, s.pos_list):
- try:
- vertex_index=base.indices[i]
- new_shape_key.data[vertex_index].co=[p+o for p, o in zip(
- mesh.verts[vertex_index].co, convert_coord(offset))]
- except IndexError as msg:
- print(IndexError, msg)
- print(i, len(base.indices))
- print(vertex_index, len(mesh.verts))
- print(base.indices[i])
- break
- except KeyError:
- #print 'this mesh not has shape vertices'
- break
-
- # set ipo curve
- #icu=ipo.addCurve(name)
- #icu.interpolation = Blender.IpoCurve.InterpTypes.LINEAR
- #icu.append( (0.0, 0.0) )
-
def __importMesh(scene, io, tex_dir):
"""
@param l[in] mmd.PMDLoader
mesh_objects=[]
while material_offset<len(io.materials):
mesh, meshObject=bl.createMesh(scene, 'mesh')
- #mesh.vertexUV = 1
# create object
#meshObject.layers = [1]
mesh_objects.append(meshObject)
+ # activate object
+ bl.objectDeselectAll()
+ bl.objectActivate(scene, meshObject)
+
# shapeキーで使われる順に並べなおしたマテリアル16個分の
# メッシュを作成する
- vertex_map=import16MaerialAndMesh(
+ vertex_map=__import16MaerialAndMesh(
meshObject, io,
material_order[material_offset:material_offset+16],
face_map, tex_dir)
# enter Edit Mode
- bl.objectDeselectAll()
- bl.objectActivate(scene, meshObject)
- bl.enterEditMode()
+ #bl.enterEditMode()
# crete shape key
- importShape(meshObject, io, vertex_map)
+ __importShape(meshObject, io, vertex_map)
# exit Edit Mode
- bl.exitEditMode()
+ #bl.exitEditMode()
mesh.update()
material_offset+=16
return mesh_objects
+
def __execute(filename, scene):
"""
load pmd file to context.
progress_set('loaded %s' % filename, 0.1)
# create root object
- root=bl.createEmptyObject(scene,
- io.english_name if len(io.english_name)>0 else io.getName().encode(bl.INTERNAL_ENCODING))
+ model_name=io.getEnglishName()
+ if len(model_name)==0:
+ model_name=io.getName()
+ root=bl.createEmptyObject(scene, model_name)
# import mesh
mesh_objects=__importMesh(scene, io, os.path.dirname(filename))
bl.objectMakeParent(root, o)
# import armature
- armature_object=importArmature(scene, io)
+ armature_object=__importArmature(scene, io)
if armature_object:
bl.objectMakeParent(root, armature_object)
armature = bl.objectGetData(armature_object)