# wrapper
import bl25 as bl
+ xrange=range
###############################################################################
# progress bar
return material
- def importMesh(scene, l, tex_dir):
- """
- @param l[in] mmd.PMDLoader
- @param filename[in]
- """
-
- ############################################################
- # shpaeキーで使われるマテリアル優先的に前に並べる
- ############################################################
- # shapeキーで使われる頂点インデックスを集める
- shape_key_used_vertices=set()
- if len(l.morph_list)>0:
- # base
- base=None
- for s in l.morph_list:
- if s.type!=0:
- continue
- base=s
- break
- assert(base)
-
- for index in base.indices:
- shape_key_used_vertices.add(index)
-
- # マテリアルに含まれる頂点がshape_keyに含まれるか否か?
- def isMaterialUsedInShape(offset, m):
- for i in xrange(offset, offset+m.vertex_count):
- if l.indices[i] in shape_key_used_vertices:
- return True
-
- # shapeキーで使われるマテリアルを記録する
- shape_key_materials=set()
- # 各マテリアルの開始頂点インデックスを記録する
- face_map={}
- face_count=0
- for i, m in enumerate(l.materials):
- face_map[i]=face_count
- if isMaterialUsedInShape(face_count, m):
- shape_key_materials.add(i)
- face_count+=m.vertex_count
-
- # list化
- material_order=list(shape_key_materials)
-
- # shapeキーに使われていないマテリアルを後ろに追加
- for i in range(len(l.materials)):
- if not i in material_order:
- material_order.append(i)
-
- # マテリアル16個ごとに分割したメッシュを作成する
- material_offset=0
- mesh_objects=[]
- while material_offset<len(l.materials):
- # create mesh
- mesh = Blender.Mesh.New()
- mesh.vertexUV = 1
- # create object
- obj = scene.objects.new(mesh)
- obj.layers = [1]
- mesh_objects.append(obj)
-
- # shapeキーで使われる順に並べなおしたマテリアル16個分の
- # メッシュを作成する
- vertex_map=import16MaerialAndMesh(
- mesh, l,
- material_order[material_offset:material_offset+16],
- face_map, tex_dir)
-
- # crete shape key
- importShape(obj, l, vertex_map)
-
- mesh.update()
- material_offset+=16
-
- return mesh_objects
-
-
- def import16MaerialAndMesh(mesh, l, material_order, face_map, tex_dir):
+ def import16MaerialAndMesh(meshObject, l,
+ material_order, face_map, tex_dir):
+ mesh=bl.objectGetData(meshObject)
############################################################
# material
############################################################
return material
- def importMesh(scene, l, tex_dir):
- """
- @param l[in] mmd.PMDLoader
- @param filename[in]
- """
-
- ############################################################
- # shpaeキーで使われるマテリアル優先的に前に並べる
- ############################################################
- # shapeキーで使われる頂点インデックスを集める
- shape_key_used_vertices=set()
- if len(l.morph_list)>0:
- # base
- base=None
- for s in l.morph_list:
- if s.type!=0:
- continue
- base=s
- break
- assert(base)
-
- for index in base.indices:
- shape_key_used_vertices.add(index)
-
- # マテリアルに含まれる頂点がshape_keyに含まれるか否か?
- def isMaterialUsedInShape(offset, m):
- for i in range(offset, offset+m.vertex_count):
- if l.indices[i] in shape_key_used_vertices:
- return True
-
- # shapeキーで使われるマテリアルを記録する
- shape_key_materials=set()
- # 各マテリアルの開始頂点インデックスを記録する
- face_map={}
- face_count=0
- for i, m in enumerate(l.materials):
- face_map[i]=face_count
- if isMaterialUsedInShape(face_count, m):
- shape_key_materials.add(i)
- face_count+=m.vertex_count
-
- # shapeキーで使われるマテリアルを前に並べるインデックスマップを作る
- material_map={}
- used_index=0
- not_used_index=len(shape_key_materials)
- for i, m in enumerate(l.materials):
- if i in shape_key_materials:
- material_map[i]=used_index
- used_index+=1
- else:
- material_map[i]=not_used_index
- not_used_index+=1
-
- # マテリアル16個ごとに分割したメッシュを作成する
- material_index=0
- mesh_objects=[]
- while material_index<len(l.materials):
- # shapeキーで使われる順に並べなおしたマテリアル16個分の
- # メッシュを作成する
- meshObject, used_vertices=import16MaerialAndMesh(l,
- material_index, material_map, face_map, tex_dir)
- scene.objects.link(meshObject)
- scene.update()
- mesh_objects.append(meshObject)
-
- # enter Edit Mode
- bpy.ops.object.select_all(action='DESELECT')
- meshObject.selected=True
- scene.objects.active=meshObject
- bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
-
- # crete shape key
- importShape(meshObject, l)
-
- ############################################################
- # clean up not used vertices
- ############################################################
- #progress_print('clean up vertices not used')
- vertex_map={}
- mesh=meshObject.data
- for i, v in enumerate(mesh.verts):
- if i in used_vertices:
- vertex_map[i]=len(vertex_map)
- v.selected=False
- else:
- v.selected=True
- assert(mesh.verts[i].selected)
- bpy.ops.object.mode_set(mode='EDIT', toggle=False)
- print("%d vertices selected" % mesh.total_vert_sel)
- print("used %d/%d" % (len(vertex_map), len(mesh.verts)))
- bpy.ops.mesh.delete(type='VERT')
-
- ############################################################
- # flip face
- ############################################################
- bpy.ops.mesh.select_all(action='SELECT')
- bpy.ops.mesh.flip_normals()
- bpy.ops.mesh.select_all(action='DESELECT')
-
- # exit Edit Mode
- bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
-
- mesh.update()
- material_index+=16
-
- return mesh_objects
-
-
- def import16MaerialAndMesh(l,
- material_offset, material_map, face_map, tex_dir):
- # create mesh
- mesh=bpy.data.meshes.new("Mesh")
-
- # create object
- meshObject= bpy.data.objects.new("Mesh", mesh)
- meshObject.layers[0]=True
-
+ def import16MaerialAndMesh(meshObject, l,
+ material_order, face_map, tex_dir):
+ mesh=bl.objectGetData(meshObject)
############################################################
# material
############################################################
textureMap={}
imageMap={}
index=0
- for i in range(material_offset, material_offset+16):
+ for material_index in material_order:
try:
- material_index=material_map[i]
m=l.materials[material_index]
mesh_material_map[material_index]=index
except KeyError:
mesh_face_indices=[]
mesh_face_materials=[]
used_vertices=set()
- for i in range(material_offset, material_offset+16):
- try:
- material_index=material_map[i]
- except KeyError:
- break
+
+ 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]
return armature_object
- def importShape(meshObject, l):
+ def importShape(meshObject, l, vertex_map):
if len(l.morph_list)==0:
return
#icu.append( (0.0, 0.0) )
+def __importMesh(scene, io, tex_dir):
+ """
+ @param l[in] mmd.PMDLoader
+ @param filename[in]
+ """
+ ############################################################
+ # shpaeキーで使われるマテリアル優先的に前に並べる
+ ############################################################
+ # shapeキーで使われる頂点インデックスを集める
+ shape_key_used_vertices=set()
+ if len(io.morph_list)>0:
+ # base
+ base=None
+ for s in io.morph_list:
+ if s.type!=0:
+ continue
+ base=s
+ break
+ assert(base)
+
+ for index in base.indices:
+ shape_key_used_vertices.add(index)
+
+ # マテリアルに含まれる頂点がshape_keyに含まれるか否か?
+ def isMaterialUsedInShape(offset, m):
+ for i in xrange(offset, offset+m.vertex_count):
+ if io.indices[i] in shape_key_used_vertices:
+ return True
+
+ # shapeキーで使われるマテリアルを記録する
+ shape_key_materials=set()
+ # 各マテリアルの開始頂点インデックスを記録する
+ face_map={}
+ face_count=0
+ for i, m in enumerate(io.materials):
+ face_map[i]=face_count
+ if isMaterialUsedInShape(face_count, m):
+ shape_key_materials.add(i)
+ face_count+=m.vertex_count
+
+ # list化
+ material_order=list(shape_key_materials)
+
+ # shapeキーに使われていないマテリアルを後ろに追加
+ for i in range(len(io.materials)):
+ if not i in material_order:
+ material_order.append(i)
+
+ # マテリアル16個ごとに分割したメッシュを作成する
+ material_offset=0
+ 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)
+
+ # shapeキーで使われる順に並べなおしたマテリアル16個分の
+ # メッシュを作成する
+ 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
+ importShape(meshObject, io, vertex_map)
+
+ # exit Edit Mode
+ bl.exitEditMode()
+
+ mesh.update()
+ material_offset+=16
+
+ return mesh_objects
+
def __execute(filename, scene):
"""
load pmd file to context.
io.english_name if len(io.english_name)>0 else io.getName().encode(bl.INTERNAL_ENCODING))
# import mesh
- mesh_objects=importMesh(scene, io, os.path.dirname(filename))
+ mesh_objects=__importMesh(scene, io, os.path.dirname(filename))
for o in mesh_objects:
bl.objectMakeParent(root, o)