OSDN Git Service

implement converter
[meshio/pymeshio.git] / pymeshio / pmd / reader.py
index e370147..ddce5b9 100644 (file)
@@ -1,10 +1,13 @@
 #coding: utf-8\r
+"""\r
+pmd reader\r
+"""\r
 import io\r
-import pymeshio.common\r
-import pymeshio.pmd\r
+from .. import common\r
+from .. import pmd\r
 \r
 \r
-class Reader(pymeshio.common.BinaryReader):\r
+class Reader(common.BinaryReader):\r
     """pmx reader\r
     """\r
     def __init__(self, ios, version):\r
@@ -23,7 +26,7 @@ class Reader(pymeshio.common.BinaryReader):
             return src[:pos]\r
 \r
     def read_vertex(self):\r
-        return pymeshio.pmd.Vertex(\r
+        return pmd.Vertex(\r
                 self.read_vector3(),\r
                 self.read_vector3(),\r
                 self.read_vector2(),\r
@@ -33,13 +36,13 @@ class Reader(pymeshio.common.BinaryReader):
                 self.read_uint(1))\r
 \r
     def read_material(self):\r
-        return pymeshio.pmd.Material(\r
+        return pmd.Material(\r
                 diffuse_color=self.read_rgb(),\r
                 alpha=self.read_float(),\r
                 specular_factor=self.read_float(),\r
                 specular_color=self.read_rgb(),\r
                 ambient_color=self.read_rgb(),\r
-                toon_index=self.read_uint(1),\r
+                toon_index=self.read_int(1),\r
                 edge_flag=self.read_uint(1),\r
                 vertex_count=self.read_uint(4),\r
                 texture_file=self.read_text(20)\r
@@ -49,7 +52,7 @@ class Reader(pymeshio.common.BinaryReader):
         name=self.read_text(20)\r
         parent_index=self.read_uint(2)\r
         tail_index=self.read_uint(2)\r
-        bone=pymeshio.pmd.createBone(name, self.read_uint(1))\r
+        bone=pmd.createBone(name, self.read_uint(1))\r
         bone.parent_index=parent_index\r
         bone.tail_index=tail_index\r
         bone.ik_index = self.read_uint(2)\r
@@ -57,7 +60,7 @@ class Reader(pymeshio.common.BinaryReader):
         return bone\r
 \r
     def read_ik(self):\r
-        ik=pymeshio.pmd.IK(self.read_uint(2), self.read_uint(2))\r
+        ik=pmd.IK(self.read_uint(2), self.read_uint(2))\r
         ik.length = self.read_uint(1)\r
         ik.iterations = self.read_uint(2)\r
         ik.weight = self.read_float()\r
@@ -65,7 +68,7 @@ class Reader(pymeshio.common.BinaryReader):
         return ik\r
 \r
     def read_morph(self):\r
-        morph=pymeshio.pmd.Morph(self.read_text(20))\r
+        morph=pmd.Morph(self.read_text(20))\r
         morph_size = self.read_uint(4)\r
         morph.type = self.read_uint(1)\r
         for j in range(morph_size):\r
@@ -74,11 +77,11 @@ class Reader(pymeshio.common.BinaryReader):
         return morph\r
 \r
     def read_rigidbody(self):\r
-        return pymeshio.pmd.RigidBody(\r
+        return pmd.RigidBody(\r
                 name=self.read_text(20), \r
-                bone_index=self.read_uint(2),\r
-                collision_group=self.read_uint(1),\r
-                no_collision_group=self.read_uint(2),\r
+                bone_index=self.read_int(2),\r
+                collision_group=self.read_int(1),\r
+                no_collision_group=self.read_int(2),\r
                 shape_type=self.read_uint(1),\r
                 shape_size=self.read_vector3(),\r
                 shape_position=self.read_vector3(),\r
@@ -92,7 +95,7 @@ class Reader(pymeshio.common.BinaryReader):
                 )\r
 \r
     def read_joint(self):\r
-        return pymeshio.pmd.Joint(\r
+        return pmd.Joint(\r
                 name=self.read_text(20),\r
                 rigidbody_index_a=self.read_uint(4),\r
                 rigidbody_index_b=self.read_uint(4),\r
@@ -127,7 +130,7 @@ def __read(reader, model):
             for _ in range(reader.read_uint(2))]\r
     model.morph_indices=[reader.read_uint(2)\r
             for _ in range(reader.read_uint(1))]\r
-    model.bone_group_list=[reader.read_text(50)\r
+    model.bone_group_list=[pmd.BoneGroup(reader.read_text(50))\r
             for _ in range(reader.read_uint(1))]\r
     model.bone_display_list=[(reader.read_uint(2), reader.read_uint(1))\r
             for _i in range(reader.read_uint(4))]\r
@@ -140,7 +143,7 @@ def __read(reader, model):
     # extend1: english name\r
     ############################################################\r
     if reader.read_uint(1)==0:\r
-        print("no extend flag")\r
+        #print("no extend flag")\r
         return True\r
     model.english_name=reader.read_text(20)\r
     model.english_comment=reader.read_text(256)\r
@@ -150,8 +153,9 @@ def __read(reader, model):
         if morph.name==b'base':\r
             continue\r
         morph.english_name=reader.read_text(20)\r
-    model.bone_group_english_list=[reader.read_text(50)\r
-            for _ in model.bone_group_list]\r
+    for g in model.bone_group_list:\r
+        g.english_name=reader.read_text(50)\r
+\r
 \r
     ############################################################\r
     # extend2: toon_textures\r
@@ -168,6 +172,7 @@ def __read(reader, model):
     if reader.is_end():\r
         # EOF\r
         return True\r
+\r
     model.rigidbodies=[reader.read_rigidbody()\r
             for _ in range(reader.read_uint(4))]\r
     model.joints=[reader.read_joint()\r
@@ -177,21 +182,49 @@ def __read(reader, model):
 \r
 \r
 def read_from_file(path):\r
-    return read(io.BytesIO(pymeshio.common.readall(path)))\r
+    """\r
+    read from file path, then return the pymeshio.pmd.Model.\r
+\r
+    :Parameters:\r
+      path\r
+        file path\r
+\r
+    >>> import pymeshio.pmd.reader\r
+    >>> m=pymeshio.pmd.reader.read_from_file('resources/初音ミクVer2.pmd')\r
+    >>> print(m)\r
+    <pmd-2.0 "Miku Hatsune" 12354vertices>\r
+\r
+    """\r
+    pmd=read(io.BytesIO(common.readall(path)))\r
+    pmd.path=path\r
+    return pmd\r
 \r
 \r
 def read(ios):\r
+    """\r
+    read from ios, then return the pymeshio.pmd.Model.\r
+\r
+    :Parameters:\r
+      ios\r
+        input stream (in io.IOBase)\r
+\r
+    >>> import pymeshio.pmd.reader\r
+    >>> m=pymeshio.pmd.reader.read(io.open('resources/初音ミクVer2.pmd', 'rb'))\r
+    >>> print(m)\r
+    <pmd-2.0 "Miku Hatsune" 12354vertices>\r
+\r
+    """\r
     assert(isinstance(ios, io.IOBase))\r
-    reader=pymeshio.common.BinaryReader(ios)\r
+    reader=common.BinaryReader(ios)\r
 \r
     # header\r
     signature=reader.unpack("3s", 3)\r
     if signature!=b"Pmd":\r
-        raise pymeshio.common.ParseException(\r
+        raise common.ParseException(\r
                 "invalid signature: {0}".format(signature))\r
     version=reader.read_float()\r
 \r
-    model=pymeshio.pmd.Model(version)\r
+    model=pmd.Model(version)\r
     reader=Reader(reader.ios, version)\r
     if(__read(reader, model)):\r
         # check eof\r
@@ -201,6 +234,7 @@ def read(ios):
 \r
         # build bone tree\r
         for i, child in enumerate(model.bones):\r
+            child.index=i\r
             if child.parent_index==0xFFFF:\r
                 # no parent\r
                 model.no_parent_bones.append(child)\r