return name if name else l.bones[index].getName().encode(bl.INTERNAL_ENCODING)
- def import16MaerialAndMesh(meshObject, l,
- material_order, face_map, tex_dir):
- mesh=bl.objectGetData(meshObject)
- ############################################################
- # material
- ############################################################
- progress_print('create materials')
- mesh_material_map={}
- textureMap={}
- 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()
- #tex_file=re.compile('\*.*.spa$').sub('', m.getTexture())
- #tex_path = os.path.join(tex_dir, tex_file).encode(
- # bl.INTERNAL_ENCODING)
- 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=[]
- for v in l.each_vertex():
- vertices.append(convert_coord(v.pos))
- mesh.verts.extend(vertices)
-
- ############################################################
- # 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():
- mesh.addVertGroup(get_bone_name(l, i))
-
- # vertex params
- mesh.vertexUV = 1
- 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)
-
- 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={}
return name if name else bone.getName()
+ def get_bone_name(l, index):
+ name=englishmap.getEnglishBoneName(l.bones[index].getName())
+ return name if name else l.bones[index].getName()
+
+
def create_texture(directory, texture_name):
texture=bpy.data.textures.new(texture_name)
texture.type='IMAGE'
return texture
- def import16MaerialAndMesh(meshObject, l,
- material_order, face_map, tex_dir):
- 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:
- texture, image=bl.createTexture(
- os.path.join(tex_dir, texture_name))
- textureMap[texture_name]=texture
- imageMap[material_index]=image
- bl.materialAddTexture(material, texture)
- bl.meshAddMaterial(mesh, material)
- index+=1
-
- ############################################################
- # vertex
- ############################################################
- #progress_print('create vertices')
- # create vertices
- unpackedVertices=[]
- for v in l.each_vertex():
- unpackedVertices.extend(
- convert_coord(v.pos))
-
- ############################################################
- # 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():
- 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')
- ############################################################
- # 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()
-
- for face, uv_face, material_index in zip(mesh.faces,
- mesh.uv_textures[0].data,
- mesh_face_materials,
- ):
- try:
- index=mesh_material_map[material_index]
- except KeyError as message:
- print(message, mesh_material_map, m)
- assert(False)
- face.material_index=index
- 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]
-
- uv=l.getUV(face.verts[1])
- uv_face.uv2=[uv.x, 1.0-uv.y]
-
- uv=l.getUV(face.verts[2])
- uv_face.uv3=[uv.x, 1.0-uv.y]
- if face.material_index in imageMap:
- uv_face.image=imageMap[face.material_index]
- uv_face.tex=True
-
- # set smooth
- face.smooth = 1
-
- 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
#icu.interpolation = Blender.IpoCurve.InterpTypes.LINEAR
#icu.append( (0.0, 0.0) )
-
+
+def __import16MaerialAndMesh(meshObject, l,
+ material_order, face_map, tex_dir):
+
+ 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()
+ #tex_file=re.compile('\*.*.spa$').sub('', m.getTexture())
+ #tex_path = os.path.join(tex_dir, tex_file).encode(
+ # bl.INTERNAL_ENCODING)
+ 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))
+
+ ############################################################
+ # 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 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)
+
+ ############################################################
+ # 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)
+
+ ############################################################
+ # 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,
+ ):
+ try:
+ index=mesh_material_map[material_index]
+ except KeyError as message:
+ print(message, mesh_material_map, m)
+ assert(False)
+ face.material_index=index
+ material=mesh.materials[index]
+ used_map[index]=True
+ if material.texture_slots[0]:
+ uv=l.getUV(face.verts[0])
+ uv_face.uv1=[uv.x, 1.0-uv.y]
+
+ uv=l.getUV(face.verts[1])
+ uv_face.uv2=[uv.x, 1.0-uv.y]
+
+ uv=l.getUV(face.verts[2])
+ uv_face.uv3=[uv.x, 1.0-uv.y]
+ if face.material_index in imageMap:
+ uv_face.image=imageMap[face.material_index]
+ uv_face.tex=True
+
+ # set smooth
+ face.smooth = 1
+ mesh.update()
+
+ ############################################################
+ # 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)
+
+ bl.meshVertsDelete(mesh, remove_vertices)
+
+ progress_print('%s created' % mesh.name)
+ return vertex_map
+
+
def __importMesh(scene, io, tex_dir):
"""
@param l[in] mmd.PMDLoader
#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()
# crete shape key