From c857394d134621b15569d4dbef60cfd62541bcac Mon Sep 17 00:00:00 2001 From: ousttrue Date: Sat, 15 Oct 2011 22:09:29 +0900 Subject: [PATCH] implementing export_pmx... --- blender26-meshio/export_pmx.py | 219 ++++++++++++------------------- blender26-meshio/exporter/oneskinmesh.py | 19 +-- blender26-meshio/import_pmx.py | 6 +- 3 files changed, 88 insertions(+), 156 deletions(-) diff --git a/blender26-meshio/export_pmx.py b/blender26-meshio/export_pmx.py index 6eb9854..62cb1d7 100644 --- a/blender26-meshio/export_pmx.py +++ b/blender26-meshio/export_pmx.py @@ -43,6 +43,21 @@ def create_pmx(ex): ) for pos, attribute, b0, b1, weight in ex.oneSkinMesh.vertexArray.zip()] + ''' + # IK + for ik in self.skeleton.ik_list: + solver=pmd.IK() + solver.index=self.skeleton.getIndex(ik.target) + solver.target=self.skeleton.getIndex(ik.effector) + solver.length=ik.length + b=self.skeleton.bones[ik.effector.parent_index] + for i in range(solver.length): + solver.children.append(self.skeleton.getIndex(b)) + b=self.skeleton.bones[b.parent_index] + solver.iterations=ik.iterations + solver.weight=ik.weight + model.ik_list.append(solver) + ''' def create_bone(b): return pmx.Bone( name=b.name, @@ -69,171 +84,105 @@ def create_pmx(ex): model.bones=[create_bone(b) for b in ex.skeleton.bones] - return model - - # IK - for ik in self.skeleton.ik_list: - solver=pmd.IK() - solver.index=self.skeleton.getIndex(ik.target) - solver.target=self.skeleton.getIndex(ik.effector) - solver.length=ik.length - b=self.skeleton.bones[ik.effector.parent_index] - for i in range(solver.length): - solver.children.append(self.skeleton.getIndex(b)) - b=self.skeleton.bones[b.parent_index] - solver.iterations=ik.iterations - solver.weight=ik.weight - model.ik_list.append(solver) + textures=set() + def get_texture_name(texture): + pos=texture.replace("\\", "/").rfind("/") + if pos==-1: + return texture + else: + return texture[pos+1:] + for m in ex.oneSkinMesh.vertexArray.indexArrays.keys(): + for path in bl.material.eachEnalbeTexturePath(bl.material.get(m)): + textures.add(get_texture_name(path)) + model.textures=list(textures) # 面とマテリアル - vertexCount=self.oneSkinMesh.getVertexCount() - for material_name, indices in self.oneSkinMesh.vertexArray.each(): + vertexCount=ex.oneSkinMesh.getVertexCount() + for material_name, indices in ex.oneSkinMesh.vertexArray.each(): #print('material:', material_name) try: m=bl.material.get(material_name) except KeyError as e: m=DefaultMatrial() - def get_texture_name(texture): - pos=texture.replace("\\", "/").rfind("/") - if pos==-1: - return texture - else: - return texture[pos+1:] - textures=[get_texture_name(path) - for path in bl.material.eachEnalbeTexturePath(m)] - print(textures) # マテリアル - model.materials.append(pmd.Material( - # diffuse_color - common.RGB(m.diffuse_color[0], m.diffuse_color[1], m.diffuse_color[2]), - m.alpha, - # specular_factor - 0 if m.specular_toon_size<1e-5 else m.specular_hardness*10, - # specular_color - common.RGB(m.specular_color[0], m.specular_color[1], m.specular_color[2]), - # ambient_color - common.RGB(m.mirror_color[0], m.mirror_color[1], m.mirror_color[2]), - # flag - 1 if m.subsurface_scattering.use else 0, - # toon - 0, - # vertex_count - len(indices), - # texture - ('*'.join(textures) if len(textures)>0 else "").encode('cp932') + model.materials.append(pmx.Material( + name=m.name, + english_name='', + diffuse_color=common.RGB(m.diffuse_color[0], m.diffuse_color[1], m.diffuse_color[2]), + alpha=m.alpha, + specular_factor=0 if m.specular_toon_size<1e-5 else m.specular_hardness*10, + specular_color=common.RGB(m.specular_color[0], m.specular_color[1], m.specular_color[2]), + ambient_color=common.RGB(m.mirror_color[0], m.mirror_color[1], m.mirror_color[2]), + flag=1 if m.subsurface_scattering.use else 0, + edge_color=common.RGBA(0, 0, 0, 1), + edge_size=1.0, + texture_index=0, + sphere_texture_index=0, + sphere_mode=0, + toon_sharing_flag=0, + toon_texture_index=0, + comment='', + vertex_count=len(indices) )) # 面 for i in indices: assert(i0: # apply transform - """ - try: - # svn 36722 - copyObj.scale=obj.scale - bpy.ops.object.transform_apply(scale=True) - copyObj.rotation_euler=obj.rotation_euler - bpy.ops.object.transform_apply(rotation=True) - copyObj.location=obj.location - bpy.ops.object.transform_apply(location=True) - except AttributeError as e: - # 2.57b - copyObj.scale=obj.scale - bpy.ops.object.scale_apply() - copyObj.rotation_euler=obj.rotation_euler - bpy.ops.object.rotation_apply() - copyObj.location=obj.location - bpy.ops.object.location_apply() - """ copyMesh.transform(obj.matrix_world) # apply modifier diff --git a/blender26-meshio/import_pmx.py b/blender26-meshio/import_pmx.py index 6f2ff29..2fc2766 100644 --- a/blender26-meshio/import_pmx.py +++ b/blender26-meshio/import_pmx.py @@ -20,7 +20,6 @@ def convert_coord(pos): def VtoV(v): return bl.createVector(v.x, v.y, v.z) -# マテリアル毎にメッシュを作成する def get_object_name(fmt, index, name): """ object名を作る。最大21バイト @@ -297,16 +296,17 @@ def _execute(filepath): for pos in (v.position for v in model.vertices)] for i, m in enumerate(model.materials): + name=get_object_name("{0:02}:", i, m.name) #################### # material #################### - material=__create_a_material(m, m.name, textures_and_images) + material=__create_a_material(m, name, textures_and_images) #################### # mesh object #################### # object名はutf-8で21byteまで - mesh, mesh_object=bl.mesh.create(get_object_name("{0:02}:", i, m.name)) + mesh, mesh_object=bl.mesh.create(name) bl.mesh.addMaterial(mesh, material) # activate object bl.object.deselectAll() -- 2.11.0