OSDN Git Service

implement converter
[meshio/pymeshio.git] / pymeshio / pmx / reader.py
index cfb228e..1126f79 100644 (file)
@@ -1,4 +1,7 @@
 # coding: utf-8\r
+"""\r
+pmx reader\r
+"""\r
 import io\r
 import pymeshio.common\r
 import pymeshio.pmx\r
@@ -22,12 +25,12 @@ class Reader(pymeshio.common.BinaryReader):
         if extended_uv>0:\r
             raise pymeshio.common.ParseException(\r
                     "extended uv is not supported", extended_uv)\r
-        self.read_vertex_index=lambda : self.read_uint(vertex_index_size)\r
-        self.read_texture_index=lambda : self.read_uint(texture_index_size)\r
-        self.read_material_index=lambda : self.read_uint(material_index_size)\r
-        self.read_bone_index=lambda : self.read_uint(bone_index_size)\r
-        self.read_morph_index=lambda : self.read_uint(morph_index_size)\r
-        self.read_rigidbody_index=lambda : self.read_uint(rigidbody_index_size)\r
+        self.read_vertex_index=lambda : self.read_int(vertex_index_size)\r
+        self.read_texture_index=lambda : self.read_int(texture_index_size)\r
+        self.read_material_index=lambda : self.read_int(material_index_size)\r
+        self.read_bone_index=lambda : self.read_int(bone_index_size)\r
+        self.read_morph_index=lambda : self.read_int(morph_index_size)\r
+        self.read_rigidbody_index=lambda : self.read_int(rigidbody_index_size)\r
 \r
     def __str__(self):\r
         return '<pymeshio.pmx.Reader>'\r
@@ -35,12 +38,12 @@ class Reader(pymeshio.common.BinaryReader):
     def get_read_text(self, text_encoding):\r
         if text_encoding==0:\r
             def read_text():\r
-                size=self.read_uint(4)\r
+                size=self.read_int(4)\r
                 return self.unpack("{0}s".format(size), size).decode("UTF16")\r
             return read_text\r
         elif text_encoding==1:\r
             def read_text():\r
-                size=self.read_uint(4)\r
+                size=self.read_int(4)\r
                 return self.unpack("{0}s".format(size), size).decode("UTF8")\r
             return read_text\r
         else:\r
@@ -56,7 +59,7 @@ class Reader(pymeshio.common.BinaryReader):
                 )\r
 \r
     def read_deform(self):\r
-        deform_type=self.read_uint(1)\r
+        deform_type=self.read_int(1)\r
         if deform_type==0:\r
             return pymeshio.pmx.Bdef1(self.read_bone_index())\r
         elif deform_type==1:\r
@@ -78,28 +81,28 @@ class Reader(pymeshio.common.BinaryReader):
                 name=self.read_text(),\r
                 english_name=self.read_text(),\r
                 diffuse_color=self.read_rgb(),\r
-                diffuse_alpha=self.read_float(),\r
+                alpha=self.read_float(),\r
                 specular_color=self.read_rgb(),\r
                 specular_factor=self.read_float(),\r
                 ambient_color=self.read_rgb(),\r
-                flag=self.read_uint(1),\r
+                flag=self.read_int(1),\r
                 edge_color=self.read_rgba(),\r
                 edge_size=self.read_float(),\r
                 texture_index=self.read_texture_index(),\r
-                sphia_texture_index=self.read_texture_index(),\r
-                sphia_mode=self.read_uint(1),\r
-                toon_sharing_flag=self.read_uint(1),\r
+                sphere_texture_index=self.read_texture_index(),\r
+                sphere_mode=self.read_int(1),\r
+                toon_sharing_flag=self.read_int(1),\r
                 )\r
         if material.toon_sharing_flag==0:\r
             material.toon_texture_index=self.read_texture_index()\r
         elif material.toon_sharing_flag==1:\r
-            material.toon_texture_index=self.read_uint(1)\r
+            material.toon_texture_index=self.read_int(1)\r
         else:\r
             raise pymeshio.common.ParseException(\r
                     "unknown toon_sharing_flag {0}".format(\r
                         material.toon_sharing_flag))\r
         material.comment=self.read_text()\r
-        material.vertex_count=self.read_uint(4)\r
+        material.vertex_count=self.read_int(4)\r
         return material\r
 \r
     def read_bone(self):\r
@@ -108,11 +111,11 @@ class Reader(pymeshio.common.BinaryReader):
                 english_name=self.read_text(),\r
                 position=self.read_vector3(),\r
                 parent_index=self.read_bone_index(),\r
-                layer=self.read_uint(4),\r
-                flag=self.read_uint(2)                \r
+                layer=self.read_int(4),\r
+                flag=self.read_int(2)                \r
                 )\r
         if bone.getConnectionFlag()==0:\r
-            bone.tail_positoin=self.read_vector3()\r
+            bone.tail_position=self.read_vector3()\r
         elif bone.getConnectionFlag()==1:\r
             bone.tail_index=self.read_bone_index()\r
         else:\r
@@ -132,7 +135,7 @@ class Reader(pymeshio.common.BinaryReader):
             bone.local_z_vector=self.read_vector3()\r
 \r
         if bone.getExternalParentDeformFlag()==1:\r
-            bone.external_key=self.read_uint(4)\r
+            bone.external_key=self.read_int(4)\r
 \r
         if bone.getIkFlag()==1:\r
             bone.ik=self.read_ik()\r
@@ -142,16 +145,17 @@ class Reader(pymeshio.common.BinaryReader):
     def read_ik(self):\r
         ik=pymeshio.pmx.Ik(\r
                 target_index=self.read_bone_index(),\r
-                loop=self.read_uint(4),\r
+                loop=self.read_int(4),\r
                 limit_radian=self.read_float())\r
-        link_size=self.read_uint(4)\r
+        link_size=self.read_int(4)\r
         ik.link=[self.read_ik_link() \r
                 for _ in range(link_size)]\r
+        return ik\r
 \r
     def read_ik_link(self):\r
         link=pymeshio.pmx.IkLink(\r
                 self.read_bone_index(),\r
-                self.read_uint(1))\r
+                self.read_int(1))\r
         if link.limit_angle==0:\r
             pass\r
         elif link.limit_angle==1:\r
@@ -166,9 +170,9 @@ class Reader(pymeshio.common.BinaryReader):
     def read_morgh(self):\r
         name=self.read_text()\r
         english_name=self.read_text()\r
-        panel=self.read_uint(1)\r
-        morph_type=self.read_uint(1)\r
-        offset_size=self.read_uint(4)\r
+        panel=self.read_int(1)\r
+        morph_type=self.read_int(1)\r
+        offset_size=self.read_int(4)\r
         if morph_type==0:\r
             # todo\r
             raise pymeshio.common.ParseException(\r
@@ -217,10 +221,10 @@ class Reader(pymeshio.common.BinaryReader):
 \r
     def read_display_slot(self):\r
         display_slot=pymeshio.pmx.DisplaySlot(self.read_text(), self.read_text(), \r
-                self.read_uint(1))\r
-        display_count=self.read_uint(4)\r
+                self.read_int(1))\r
+        display_count=self.read_int(4)\r
         for _ in range(display_count):\r
-            display_type=self.read_uint(1)\r
+            display_type=self.read_int(1)\r
             if display_type==0:\r
                 display_slot.refrences.append(\r
                         (display_type, self.read_bone_index()))\r
@@ -230,15 +234,16 @@ class Reader(pymeshio.common.BinaryReader):
             else:\r
                 raise pymeshio.common.ParseException(\r
                         "unknown display_type: {0}".format(display_type))\r
+        return display_slot\r
 \r
     def read_rigidbody(self):\r
         return pymeshio.pmx.RigidBody(\r
                 name=self.read_text(), \r
                 english_name=self.read_text(),\r
                 bone_index=self.read_bone_index(),\r
-                collision_group=self.read_uint(1),\r
-                no_collision_group=self.read_uint(2),\r
-                shape_type=self.read_uint(1),\r
+                collision_group=self.read_int(1),\r
+                no_collision_group=self.read_int(2),\r
+                shape_type=self.read_int(1),\r
                 shape_size=self.read_vector3(),\r
                 shape_position=self.read_vector3(),\r
                 shape_rotation=self.read_vector3(),\r
@@ -247,14 +252,14 @@ class Reader(pymeshio.common.BinaryReader):
                 angular_damping=self.read_float(),\r
                 restitution=self.read_float(),\r
                 friction=self.read_float(),\r
-                mode=self.read_uint(1)\r
+                mode=self.read_int(1)\r
                 )\r
 \r
     def read_joint(self):\r
         return pymeshio.pmx.Joint(\r
                 name=self.read_text(),\r
                 english_name=self.read_text(),\r
-                joint_type=self.read_uint(1),\r
+                joint_type=self.read_int(1),\r
                 rigidbody_index_a=self.read_rigidbody_index(),\r
                 rigidbody_index_b=self.read_rigidbody_index(),\r
                 position=self.read_vector3(),\r
@@ -268,10 +273,38 @@ class Reader(pymeshio.common.BinaryReader):
 \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.pmx.Model.\r
+\r
+    :Parameters:\r
+      path\r
+        file path\r
+\r
+    >>> import pymeshio.pmx.reader\r
+    >>> m=pymeshio.pmx.reader.read_from_file('resources/初音ミクVer2.pmx')\r
+    >>> print(m)\r
+    <pmx-2.0 "Miku Hatsune" 12354vertices>\r
+\r
+    """\r
+    pmx=read(io.BytesIO(pymeshio.common.readall(path)))\r
+    pmx.path=path\r
+    return pmx\r
 \r
 \r
 def read(ios):\r
+    """\r
+    read from ios, then return the pmx pymeshio.pmx.Model.\r
+\r
+    :Parameters:\r
+      ios\r
+        input stream (in io.IOBase)\r
+\r
+    >>> import pymeshio.pmx.reader\r
+    >>> m=pymeshio.pmx.reader.read(io.open('resources/初音ミクVer2.pmx', 'rb'))\r
+    >>> print(m)\r
+    <pmx-2.0 "Miku Hatsune" 12354vertices>\r
+\r
+    """\r
     assert(isinstance(ios, io.IOBase))\r
     reader=pymeshio.common.BinaryReader(ios)\r
 \r
@@ -287,21 +320,21 @@ def read(ios):
     model=pymeshio.pmx.Model(version)\r
 \r
     # flags\r
-    flag_bytes=reader.read_uint(1)\r
+    flag_bytes=reader.read_int(1)\r
     if flag_bytes!=8:\r
         raise pymeshio.common.ParseException(\r
                 "invalid flag length", reader.flag_bytes)\r
-    text_encoding=reader.read_uint(1)\r
-    extended_uv=reader.read_uint(1)\r
-    vertex_index_size=reader.read_uint(1)\r
-    texture_index_size=reader.read_uint(1)\r
-    material_index_size=reader.read_uint(1)\r
-    bone_index_size=reader.read_uint(1)\r
-    morph_index_size=reader.read_uint(1)\r
-    rigidbody_index_size=reader.read_uint(1)\r
+    text_encoding=reader.read_int(1)\r
+    extended_uv=reader.read_int(1)\r
+    vertex_index_size=reader.read_int(1)\r
+    texture_index_size=reader.read_int(1)\r
+    material_index_size=reader.read_int(1)\r
+    bone_index_size=reader.read_int(1)\r
+    morph_index_size=reader.read_int(1)\r
+    rigidbody_index_size=reader.read_int(1)\r
     \r
     # pmx custom reader\r
-    reader=Reader(reader.io,\r
+    reader=Reader(reader.ios,\r
             text_encoding,\r
             extended_uv,\r
             vertex_index_size,\r
@@ -320,23 +353,23 @@ def read(ios):
 \r
     # model data\r
     model.vertices=[reader.read_vertex() \r
-            for _ in range(reader.read_uint(4))]\r
+            for _ in range(reader.read_int(4))]\r
     model.indices=[reader.read_vertex_index() \r
-            for _ in range(reader.read_uint(4))]\r
+            for _ in range(reader.read_int(4))]\r
     model.textures=[reader.read_text() \r
-            for _ in range(reader.read_uint(4))]\r
+            for _ in range(reader.read_int(4))]\r
     model.materials=[reader.read_material() \r
-            for _ in range(reader.read_uint(4))]\r
+            for _ in range(reader.read_int(4))]\r
     model.bones=[reader.read_bone() \r
-            for _ in range(reader.read_uint(4))]\r
+            for _ in range(reader.read_int(4))]\r
     model.morphs=[reader.read_morgh() \r
-            for _ in range(reader.read_uint(4))]\r
+            for _ in range(reader.read_int(4))]\r
     model.display_slots=[reader.read_display_slot() \r
-            for _ in range(reader.read_uint(4))]\r
+            for _ in range(reader.read_int(4))]\r
     model.rigidbodies=[reader.read_rigidbody()\r
-            for _ in range(reader.read_uint(4))]\r
+            for _ in range(reader.read_int(4))]\r
     model.joints=[reader.read_joint()\r
-            for _ in range(reader.read_uint(4))]\r
+            for _ in range(reader.read_int(4))]\r
 \r
     return model\r
 \r