OSDN Git Service

implement pmx material read
authorousttrue <ousttrue@gmail.com>
Fri, 30 Sep 2011 01:26:28 +0000 (10:26 +0900)
committerousttrue <ousttrue@gmail.com>
Fri, 30 Sep 2011 01:26:28 +0000 (10:26 +0900)
pymeshio/common.py
pymeshio/pmx.py
test/pmx_test.py

index 2f2fd6e..7dadc16 100644 (file)
@@ -171,6 +171,27 @@ class Quaternion(object):
         return Quaternion(axis[0]*s, axis[1]*s, axis[2]*s, c)\r
 \r
 \r
+class RGB(object):\r
+    """\r
+    material color\r
+    """\r
+    __slots__=['r', 'g', 'b']\r
+    def __init__(self, r=0, g=0, b=0):\r
+        self.r=r\r
+        self.g=g\r
+        self.b=b\r
+\r
+    def __getitem__(self, key):\r
+        if key==0:\r
+            return self.r\r
+        elif key==1:\r
+            return self.g\r
+        elif key==2:\r
+            return self.b\r
+        else:\r
+            assert(False)\r
+\r
+\r
 class RGBA(object):\r
     """\r
     material color\r
index 52b124b..77db3ac 100644 (file)
@@ -21,6 +21,66 @@ class ParseException(Exception):
     pass\r
 \r
 \r
+class Material(object):\r
+    """material\r
+\r
+    Attributes: see __init__\r
+    """\r
+    __slots__=[\r
+            'name',\r
+            'english_name',\r
+            'diffuse_color',\r
+            'diffuse_alpha',\r
+            'specular_color',\r
+            'specular_factor',\r
+            'ambient_color',\r
+            'flag',\r
+            'edge_color',\r
+            'edge_size',\r
+            'texture_index',\r
+            'sphia_texture_index',\r
+            'sphia_mode',\r
+            'toon_sharing_flag',\r
+            'toon_texture_index',\r
+            'comment',\r
+            'index_count',\r
+            ]\r
+    def __init__(self,\r
+            name: str,\r
+            english_name: str,\r
+            diffuse_color: common.RGB,\r
+            diffuse_alpha: float,\r
+            specular_color: common.RGB,\r
+            specular_factor: float,\r
+            ambient_color: common.RGB,\r
+            flag: int,\r
+            edge_color: common.RGBA,\r
+            edge_size: float,\r
+            texture_index: int,\r
+            sphia_texture_index: int,\r
+            sphia_mode: int,\r
+            toon_sharing_flag: int\r
+            ):\r
+        self.name=name\r
+        self.english_name=english_name\r
+        self.diffuse_color=diffuse_color\r
+        self.diffuse_alpha=diffuse_alpha\r
+        self.specular_color=specular_color\r
+        self.specular_factor=specular_factor\r
+        self.ambient_color=ambient_color\r
+        self.flag=flag\r
+        self.edge_color=edge_color\r
+        self.edge_size=edge_size\r
+        self.texture_index=texture_index\r
+        self.sphia_texture_index=sphia_texture_index\r
+        self.sphia_mode=sphia_mode\r
+        self.toon_sharing_flag=toon_sharing_flag\r
+        #\r
+        self.toon_texture_index=None\r
+        self.comment=''\r
+        self.index_count=0\r
+\r
+\r
 class Deform(object):\r
     pass\r
 \r
@@ -79,6 +139,9 @@ class Model(object):
         comment: \r
         english_comment: \r
         vertices:\r
+        textures:\r
+        materials:\r
+        bones:\r
     """\r
     __slots__=[\r
             'version', # pmx version\r
@@ -86,7 +149,11 @@ class Model(object):
             'english_name', # model name in english\r
             'comment', # model comment\r
             'english_comment', # model comment in english\r
-            'vertices'\r
+            'vertices',\r
+            'indices',\r
+            'textures',\r
+            'materials',\r
+            'bones',\r
             ]\r
     def __init__(self):\r
         self.version=0.0\r
@@ -95,6 +162,10 @@ class Model(object):
         self.comment=''\r
         self.english_comment=''\r
         self.vertices=[]\r
+        self.indices=[]\r
+        self.textures=[]\r
+        self.materials=[]\r
+        self.bones=[]\r
 \r
 \r
 class IO(object):\r
@@ -170,10 +241,37 @@ class IO(object):
         ####################\r
         # vertices\r
         ####################\r
-        #vertex_count=self.__read_int(self.vertex_index_size)\r
-        # pmdeditor 131c bug?\r
-        vertex_count=self.__read_int(4)\r
-        self.__model.vertices=[self.__read_vertex() for i in range(vertex_count)]\r
+        vertex_count=self.__read_uint(4)\r
+        self.__model.vertices=[self.__read_vertex() \r
+                for i in range(vertex_count)]\r
+\r
+        ####################\r
+        # indices\r
+        ####################\r
+        index_count=self.__read_uint(4)\r
+        self.__model.indices=[self.__read_uint(self.vertex_index_size) \r
+                for i in range(index_count)]\r
+\r
+        ####################\r
+        # textures\r
+        ####################\r
+        texture_count=self.__read_uint(4)\r
+        self.__model.textures=[self.__read_text() \r
+                for i in range(texture_count)]\r
+\r
+        ####################\r
+        # materials\r
+        ####################\r
+        material_count=self.__read_uint(4)\r
+        self.__model.materials=[self.__read_material() \r
+                for i in range(material_count)]\r
+\r
+        ####################\r
+        # bones\r
+        ####################\r
+        bone_count=self.__read_uint(4)\r
+        self.__model.bones=[self.__read_bone() \r
+                for i in range(bone_count)]\r
 \r
         return True\r
 \r
@@ -202,7 +300,7 @@ class IO(object):
         else:\r
             print("unknown text encoding", self.text_encoding)\r
 \r
-    def __read_int(self, size):\r
+    def __read_uint(self, size):\r
         if size==1:\r
             return self.__unpack("B", size)\r
         if size==2:\r
@@ -222,41 +320,83 @@ class IO(object):
                 )\r
 \r
     def __read_vector2(self):\r
-        print(self.__pos)\r
         return common.Vector2(\r
                 self.__unpack("f", 4), \r
                 self.__unpack("f", 4)\r
                 )\r
 \r
     def __read_vector3(self):\r
-        print(self.__pos)\r
         return common.Vector3(\r
                 self.__unpack("f", 4), \r
                 self.__unpack("f", 4), \r
                 self.__unpack("f", 4)\r
                 )\r
 \r
+    def __read_rgba(self):\r
+        return common.RGBA(\r
+                self.__unpack("f", 4), \r
+                self.__unpack("f", 4), \r
+                self.__unpack("f", 4),\r
+                self.__unpack("f", 4)\r
+                )\r
+\r
+    def __read_rgb(self):\r
+        return common.RGB(\r
+                self.__unpack("f", 4), \r
+                self.__unpack("f", 4), \r
+                self.__unpack("f", 4)\r
+                )\r
+\r
     def __read_deform(self):\r
-        print(self.__pos)\r
         deform_type=self.__unpack("B", 1)\r
         if deform_type==0:\r
-            return Bdef1(self.__read_int(self.bone_index_size))\r
+            return Bdef1(self.__read_uint(self.bone_index_size))\r
         if deform_type==1:\r
             return Bdef2(\r
-                    self.__read_int(self.bone_index_size),\r
-                    self.__read_int(self.bone_index_size),\r
+                    self.__read_uint(self.bone_index_size),\r
+                    self.__read_uint(self.bone_index_size),\r
                     self.__unpack("f", 4)\r
                     )\r
         """\r
         if deform_type==2:\r
             return Bdef4(\r
-                    self.__read_int(self.bone_index_size),\r
-                    self.__read_int(self.bone_index_size),\r
-                    self.__read_int(self.bone_index_size),\r
-                    self.__read_int(self.bone_index_size),\r
+                    self.__read_uint(self.bone_index_size),\r
+                    self.__read_uint(self.bone_index_size),\r
+                    self.__read_uint(self.bone_index_size),\r
+                    self.__read_uint(self.bone_index_size),\r
                     self.__unpack("f", 4), self.__unpack("f", 4),\r
                     self.__unpack("f", 4), self.__unpack("f", 4)\r
                     )\r
         """\r
         raise ParseException("unknown deform type: {0}".format(deform_type))\r
 \r
+    def __read_material(self):\r
+        material=Material(\r
+                name=self.__read_text(),\r
+                english_name=self.__read_text(),\r
+                diffuse_color=self.__read_rgb(),\r
+                diffuse_alpha=self.__unpack("f", 4),\r
+                specular_color=self.__read_rgb(),\r
+                specular_factor=self.__unpack("f", 4),\r
+                ambient_color=self.__read_rgb(),\r
+                flag=self.__read_uint(1),\r
+                edge_color=self.__read_rgba(),\r
+                edge_size=self.__unpack("f", 4),\r
+                texture_index=self.__read_uint(self.texture_index_size),\r
+                sphia_texture_index=self.__read_uint(self.texture_index_size),\r
+                sphia_mode=self.__read_uint(1),\r
+                toon_sharing_flag=self.__read_uint(1),\r
+                )\r
+        if material.toon_sharing_flag==0:\r
+            material.toon_texture_index=self.__read_uint(self.texture_index_size)\r
+        elif material.toon_sharing_flag==1:\r
+            material.toon_texture_index=self.__read_uint(1)\r
+        else:\r
+            raise ParseException("unknown toon_sharing_flag {0}".format(material.toon_sharing_flag))\r
+        material.comment=self.__read_text()\r
+        material.index_count=self.__read_uint(4)\r
+        return material\r
+\r
+    def __read_bone(self):\r
+        return None\r
+\r
index fdf29a9..2d64ae1 100644 (file)
@@ -28,3 +28,7 @@ def test_read():
             )\r
 \r
     assert len(model.vertices)==12354\r
+    assert len(model.indices)==22961 * 3\r
+    # texture\r
+    assert len(model.materials)==17\r
+    assert len(model.bones)==140\r