OSDN Git Service

implementing import_pmx...
authorousttrue <ousttrue@gmail.com>
Wed, 12 Oct 2011 15:22:21 +0000 (00:22 +0900)
committerousttrue <ousttrue@gmail.com>
Wed, 12 Oct 2011 15:22:21 +0000 (00:22 +0900)
ChangeLog
blender26-meshio/__init__.py
blender26-meshio/import_pmx.py
pymeshio/pmx/__init__.py
setup.py

index 553eee2..55f7b3c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+2.2.3 (2011-10-12)\r
+~~~~~~~~~~~~~~~~~~\r
+* fix for pmxmca\r
+\r
+2.2.2 (2011-10-10)\r
+~~~~~~~~~~~~~~~~~~\r
+* add pmd2pmx script\r
+\r
+2.2.1 (2011-10-07)\r
+~~~~~~~~~~~~~~~~~~\r
+* implement pmd to pmx converter\r
+\r
+2.2.0 (2011-10-03)\r
+~~~~~~~~~~~~~~~~~~\r
+* implement pmx writer\r
+\r
 2.1.0 (2011-10-02)\r
 ~~~~~~~~~~~~~~~~~~\r
 * refactoring api\r
index 6e8ce9b..8c294a5 100644 (file)
@@ -7,7 +7,7 @@ bl_info={
         'blender': (2, 6, 0),
         'location': 'File > Import-Export',
         'description': 'Import-Export PMD/PMX/MQO meshes',
-        'warning': '', # used for warning icon and text in addons panel
+        'warning': 'pmx importer/exporter is under development', 
         'wiki_url': 'http://meshio.sourceforge.jp/',
         'support': 'COMMUNITY',
         }
index 453355b..c317315 100644 (file)
@@ -8,7 +8,24 @@ import os
 from . import bl
 
 
+def convert_coord(pos):
+    """
+    Left handed y-up to Right handed z-up
+    """
+    return (pos.x, pos.z, pos.y)
+
 def __create_a_material(m, name, textures_and_images):
+    """
+    materialを作成する
+
+    :Params:
+        m
+            pymeshio.pmx.Material
+        name
+            material name
+        textures_and_images
+            list of (texture, image)
+    """
     material = bl.material.create(name)
     # diffuse
     material.diffuse_shader='FRESNEL'
@@ -31,7 +48,54 @@ def __create_a_material(m, name, textures_and_images):
     texture_index=bl.material.addTexture(material, textures_and_images[m.texture_index][0])
     return material
 
+def __create_armature(bones):
+    """
+    armatureを作成する
+
+    :Params:
+        bones
+            list of pymeshio.pmx.Bone
+    """
+    armature, armature_object=bl.armature.create()
+
+    bl.armature.makeEditable(armature_object)
+    # create bones
+    def create_bone(b):
+        bone=bl.armature.createBone(armature, b.name)
+        # bone position
+        bone.head=bl.createVector(*convert_coord(b.position))
+        if not b.getConnectionFlag():
+            bone.tail=bl.createVector(*convert_coord(b.position))
+        elif not b.getVisibleFlag():
+            bone.tail=bone.head+bl.createVector(0, 1, 0)
+
+        return bone
+    bl_bones=[create_bone(b) for b in bones]
+
+    # build skeleton
+    for b, bone in zip(bones, bl_bones):
+        if b.parent_index!=-1:
+            print("%s -> %s" % (bones[b.parent_index].name, b.name))
+            parent_bone=bl_bones[b.parent_index]
+            bone.parent=parent_bone
+            if b.getConnectionFlag() and b.tail_index!=-1:
+                assert(b.tail_index!=0)
+                tail_bone=bl_bones[b.tail_index]
+                bone.tail=tail_bone.head
+                bl.bone.setConnected(tail_bone)
+        else:
+            print("no parent %s" % b.name)
+
+    # fix
+    bl.armature.update(armature)
+    bl.enterObjectMode()
+
+    return armature_object
+
 def _execute(filepath):
+    """
+    importerr 本体
+    """
     bl.progress_set('load %s' % filepath, 0.0)
     print(filepath)
 
@@ -47,14 +111,19 @@ def _execute(filepath):
     model_name=model.english_name
     if len(model_name)==0:
         model_name=os.path.basename(filepath)
-    root=bl.object.createEmpty(model_name)
-    root[bl.MMD_MB_NAME]=model.name
-    root[bl.MMD_MB_COMMENT]=model.comment
-    root[bl.MMD_COMMENT]=model.english_comment
+    root_object=bl.object.createEmpty(model_name)
+    root_object[bl.MMD_MB_NAME]=model.name
+    root_object[bl.MMD_MB_COMMENT]=model.comment
+    root_object[bl.MMD_COMMENT]=model.english_comment
+
+    # armatureを作る
+    armature_object=__create_armature(model.bones)
+    if armature_object:
+        bl.object.makeParent(root_object, armature_object)
 
     # テクスチャを作る
     texture_dir=os.path.dirname(filepath)
-    textures_and_images=[bl.texture.create(os.path.join(texture_dir, t)) 
+    textures_and_images=[bl.texture.create(os.path.join(texture_dir, t))
             for t in model.textures]
     print(textures_and_images)
 
@@ -65,7 +134,7 @@ def _execute(filepath):
             return fmt.format(*args)
     index_generator=(i for i in model.indices)
     # 頂点配列。(Left handed y-up) to (Right handed z-up)
-    vertices=[(pos.x, pos.z, pos.y) 
+    vertices=[convert_coord(pos)
             for pos in (v.position for v in model.vertices)]
     for i, m in enumerate(model.materials):
         # マテリアル毎にメッシュを作成する
@@ -77,12 +146,19 @@ def _execute(filepath):
         # activate object
         bl.object.deselectAll()
         bl.object.activate(mesh_object)
-        bl.object.makeParent(root, mesh_object)
-        indices=[next(index_generator) 
+        bl.object.makeParent(root_object, mesh_object)
+        # vertices & faces
+        indices=[next(index_generator)
                     for _ in range(m.vertex_count)]
-        bl.mesh.addGeometry(mesh, vertices, 
-                [(indices[i], indices[i+1], indices[i+2]) 
+        bl.mesh.addGeometry(mesh, vertices,
+                [(indices[i], indices[i+1], indices[i+2])
                     for i in range(0, len(indices), 3)])
+        if armature_object:
+            # armature modifirer
+            bl.modifier.addArmature(mesh_object, armature_object)
+
+        # shape
+
 
     return {'FINISHED'}
 
index 24e24cd..f98032c 100644 (file)
@@ -215,25 +215,28 @@ class Bone(Diff):
             self._diff(rhs, 'ik')\r
 \r
     def getConnectionFlag(self):\r
-        return self.flag & 0x0001\r
+        return (self.flag & 0x0001)!=0\r
+\r
+    def getVisibleFlag(self):\r
+        return (self.flag & 0x0008)!=0\r
 \r
     def getIkFlag(self):\r
-        return (self.flag & 0x0020) >> 5\r
+        return (self.flag & 0x0020)!=0\r
 \r
     def getRotationFlag(self):\r
-        return (self.flag & 0x0100) >> 8\r
+        return (self.flag & 0x0100)!=0\r
 \r
     def getTranslationFlag(self):\r
-        return (self.flag & 0x0200) >> 9\r
+        return (self.flag & 0x0200)!=0\r
 \r
     def getFixedAxisFlag(self):\r
-        return (self.flag & 0x0400) >> 10\r
+        return (self.flag & 0x0400)!=0\r
 \r
     def getLocalCoordinateFlag(self):\r
-        return (self.flag &  0x0800) >> 11\r
+        return (self.flag &  0x0800)!=0\r
     \r
     def getExternalParentDeformFlag(self):\r
-        return (self.flag &  0x2000) >> 13\r
+        return (self.flag &  0x2000)!=0\r
 \r
  \r
 class Material(Diff):\r
index bbed157..c4fe771 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -7,7 +7,7 @@ import os
 import shutil
 
 name='pymeshio'
-version='2.2.3'
+version='2.3.0'
 short_description='3d model io library for mqo, pmd, pmx, vmd and vpd'
 long_description='''\
 `pymeshio` is a package for 3d model io.
@@ -26,6 +26,7 @@ Features
 * read       MikuMikuDance vmd format
 * read       MikuMikuDance vpd format
 * convert    MikuMikuDance pmd format to MikuMikuDance pmx format
+* blender-2.6 import/export plugin
 
 Install
 -------
@@ -58,28 +59,16 @@ Usage
 ToDo
 --------
 
-* update blender25 plugin to blender26
-* blender26 importer for pmx
-* blender26 exporter for pmx
+* importer for pmx
+* exporter for pmx
 
 
 New
 -------
-2.2.3 (2011-10-12)
+2.3.0 (2011-10-13)
 ~~~~~~~~~~~~~~~~~~
-* fix for pmxmca
-
-2.2.2 (2011-10-10)
-~~~~~~~~~~~~~~~~~~
-* add pmd2pmx script
-
-2.2.1 (2011-10-07)
-~~~~~~~~~~~~~~~~~~
-* implement pmd to pmx converter
-
-2.2.0 (2011-10-03)
-~~~~~~~~~~~~~~~~~~
-* implement pmx writer
+* fix blender-2.5 plugin for blender-2.6
+* add pmx importer
 
 '''