-def load(path: str) -> Model:\r
- with open(path, "rb") as f:\r
- model=Model()\r
- loader=Loader(f)\r
-\r
- ####################\r
- # header\r
- ####################\r
- signature=loader.unpack("4s", 4)\r
- if signature!=b"PMX ":\r
- raise ParseException("invalid signature", loader.signature)\r
-\r
- version=loader.read_float()\r
- if version!=2.0:\r
- print("unknown version", version)\r
-\r
- model.version=version\r
- # flags\r
- flag_bytes=loader.read_uint(1)\r
- if flag_bytes!=8:\r
- raise ParseException("invalid flag length", loader.flag_bytes)\r
-\r
- # text encoding\r
- loader.text_encoding=loader.read_uint(1)\r
- loader.read_text=loader.get_read_text()\r
- # uv\r
- loader.extended_uv=loader.read_uint(1)\r
- if loader.extended_uv>0:\r
- raise ParseException("extended uv is not supported", loader.extended_uv)\r
-\r
- # index size\r
- loader.vertex_index_size=loader.read_uint(1)\r
- loader.texture_index_size=loader.read_uint(1)\r
- loader.material_index_size=loader.read_uint(1)\r
- loader.bone_index_size=loader.read_uint(1)\r
- loader.morph_index_size=loader.read_uint(1)\r
- loader.rigidbody_index_size=loader.read_uint(1)\r
-\r
- ####################\r
- # model info\r
- ####################\r
- model.name = loader.read_text()\r
- model.english_name = loader.read_text()\r
- model.comment = loader.read_text()\r
- model.english_comment = loader.read_text()\r
-\r
- ####################\r
- # vertices\r
- ####################\r
- vertex_count=loader.read_uint(4)\r
- model.vertices=[loader.read_vertex() \r
- for i in range(vertex_count)]\r
-\r
- ####################\r
- # indices\r
- ####################\r
- index_count=loader.read_uint(4)\r
- model.indices=[loader.read_uint(loader.vertex_index_size) \r
- for i in range(index_count)]\r
-\r
- ####################\r
- # textures\r
- ####################\r
- texture_count=loader.read_uint(4)\r
- model.textures=[loader.read_text() \r
- for i in range(texture_count)]\r
-\r
- ####################\r
- # materials\r
- ####################\r
- material_count=loader.read_uint(4)\r
- model.materials=[loader.read_material() \r
- for i in range(material_count)]\r
-\r
- ####################\r
- # bones\r
- ####################\r
- bone_count=loader.read_uint(4)\r
- model.bones=[loader.read_bone() \r
- for i in range(bone_count)]\r
- return model\r
+def load(path: str) -> pymeshio.pmx.Model:\r
+ # general binary loader\r
+ loader=pymeshio.common.BinaryLoader(\r
+ io.BytesIO(\r
+ pymeshio.common.readall(path)))\r
+\r
+ # header\r
+ signature=loader.unpack("4s", 4)\r
+ if signature!=b"PMX ":\r
+ raise ParseException("invalid signature", loader.signature)\r
+\r
+ version=loader.read_float()\r
+ if version!=2.0:\r
+ print("unknown version", version)\r
+ model=pymeshio.pmx.Model(version)\r
+\r
+ # flags\r
+ flag_bytes=loader.read_uint(1)\r
+ if flag_bytes!=8:\r
+ raise ParseException("invalid flag length", loader.flag_bytes)\r
+ text_encoding=loader.read_uint(1)\r
+ extended_uv=loader.read_uint(1)\r
+ vertex_index_size=loader.read_uint(1)\r
+ texture_index_size=loader.read_uint(1)\r
+ material_index_size=loader.read_uint(1)\r
+ bone_index_size=loader.read_uint(1)\r
+ morph_index_size=loader.read_uint(1)\r
+ rigidbody_index_size=loader.read_uint(1)\r
+ \r
+ # pmx custom loader\r
+ loader=Loader(loader.io,\r
+ text_encoding,\r
+ extended_uv,\r
+ vertex_index_size,\r
+ texture_index_size,\r
+ material_index_size,\r
+ bone_index_size,\r
+ morph_index_size,\r
+ rigidbody_index_size\r
+ )\r
+\r
+ # model info\r
+ model.name = loader.read_text()\r
+ model.english_name = loader.read_text()\r
+ model.comment = loader.read_text()\r
+ model.english_comment = loader.read_text()\r
+\r
+ # vertices\r
+ vertex_count=loader.read_uint(4)\r
+ model.vertices=[loader.read_vertex() for i in range(vertex_count)]\r
+\r
+ # indices\r
+ index_count=loader.read_uint(4)\r
+ model.indices=[loader.read_vertex_index() for i in range(index_count)]\r
+\r
+ # textures\r
+ texture_count=loader.read_uint(4)\r
+ model.textures=[loader.read_text() for i in range(texture_count)]\r
+\r
+ # materials\r
+ material_count=loader.read_uint(4)\r
+ model.materials=[loader.read_material() for i in range(material_count)]\r
+\r
+ # bones\r
+ bone_count=loader.read_uint(4)\r
+ model.bones=[loader.read_bone() for i in range(bone_count)]\r
+\r
+ return model\r