class Loader(pymeshio.common.BinaryLoader):\r
"""pmx loader\r
"""\r
- def __init__(self, io,\r
+ def __init__(self, ios,\r
text_encoding,\r
extended_uv,\r
vertex_index_size,\r
morph_index_size,\r
rigidbody_index_size\r
):\r
- super(Loader, self).__init__(io)\r
+ super(Loader, self).__init__(ios)\r
self.read_text=self.get_read_text(text_encoding)\r
if extended_uv>0:\r
- raise ParseException("extended uv is not supported", extended_uv)\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_morph_index=lambda : self.read_uint(morph_index_size)\r
self.read_rigidbody_index=lambda : self.read_uint(rigidbody_index_size)\r
\r
- def __str__(self) -> str:\r
+ def __str__(self):\r
return '<pymeshio.pmx.Loader>'\r
\r
- def get_read_text(self, text_encoding) -> "text process function":\r
+ def get_read_text(self, text_encoding):\r
if text_encoding==0:\r
def read_text():\r
size=self.read_uint(4)\r
deform_type=self.read_uint(1)\r
if deform_type==0:\r
return pymeshio.pmx.Bdef1(self.read_bone_index())\r
- if deform_type==1:\r
+ elif deform_type==1:\r
return pymeshio.pmx.Bdef2(\r
self.read_bone_index(),\r
self.read_bone_index(),\r
self.read_float()\r
)\r
- """\r
- if deform_type==2:\r
- return pymeshio.pmx.Bdef4(\r
- self.read_bone_index(),\r
- self.read_bone_index(),\r
- self.read_bone_index(),\r
- self.read_bone_index(),\r
- self.read_float(), self.read_float(),\r
- self.read_float(), self.read_float()\r
- )\r
- """\r
- raise ParseException("unknown deform type: {0}".format(deform_type))\r
+ elif deform_type==2:\r
+ # todo\r
+ raise pymeshio.common.ParseException(\r
+ "not implemented Bdef4")\r
+ else:\r
+ raise pymeshio.common.ParseException(\r
+ "unknown deform type: {0}".format(deform_type))\r
\r
def read_material(self):\r
material=pymeshio.pmx.Material(\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
+ raise pymeshio.common.ParseException(\r
+ "unknown toon_sharing_flag {0}".format(\r
+ material.toon_sharing_flag))\r
material.comment=self.read_text()\r
- material.index_count=self.read_uint(4)\r
+ material.vertex_count=self.read_uint(4)\r
return material\r
\r
def read_bone(self):\r
elif bone.getConnectionFlag()==1:\r
bone.tail_index=self.read_bone_index()\r
else:\r
- raise ParseException("unknown bone conenction flag: {0}".format(\r
+ raise pymeshio.common.ParseException(\r
+ "unknown bone conenction flag: {0}".format(\r
bone.getConnectionFlag()))\r
\r
if bone.getRotationFlag()==1 or bone.getTranslationFlag()==1:\r
loop=self.read_uint(4),\r
limit_radian=self.read_float())\r
link_size=self.read_uint(4)\r
- ik.link=[self.read_ik_link() for i in range(link_size)]\r
+ ik.link=[self.read_ik_link() \r
+ for _ in range(link_size)]\r
\r
def read_ik_link(self):\r
link=pymeshio.pmx.IkLink(\r
link.limit_min=self.read_vector3()\r
link.limit_max=self.read_vector3()\r
else:\r
- raise ParseException("invalid ik link limit_angle: {0}".format(\r
+ raise pymeshio.common.ParseException(\r
+ "invalid ik link limit_angle: {0}".format(\r
link.limit_angle))\r
return link\r
\r
+ 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
+ if morph_type==0:\r
+ # todo\r
+ raise pymeshio.common.ParseException(\r
+ "not implemented GroupMorph")\r
+ elif morph_type==1:\r
+ morph=pymeshio.pmx.Morph(name, english_name, \r
+ panel, morph_type)\r
+ morph.offsets=[self.read_vertex_morph_offset() \r
+ for _ in range(offset_size)]\r
+ return morph\r
+ elif morph_type==2:\r
+ # todo\r
+ raise pymeshio.common.ParseException(\r
+ "not implemented BoneMorph")\r
+ elif morph_type==3:\r
+ # todo\r
+ raise pymeshio.common.ParseException(\r
+ "not implemented UvMorph")\r
+ elif morph_type==4:\r
+ # todo\r
+ raise pymeshio.common.ParseException(\r
+ "not implemented extended UvMorph1")\r
+ elif morph_type==5:\r
+ # todo\r
+ raise pymeshio.common.ParseException(\r
+ "not implemented extended UvMorph2")\r
+ elif morph_type==6:\r
+ # todo\r
+ raise pymeshio.common.ParseException(\r
+ "not implemented extended UvMorph3")\r
+ elif morph_type==7:\r
+ # todo\r
+ raise pymeshio.common.ParseException(\r
+ "not implemented extended UvMorph4")\r
+ elif morph_type==8:\r
+ # todo\r
+ raise pymeshio.common.ParseException(\r
+ "not implemented extended MaterialMorph")\r
+ else:\r
+ raise pymeshio.common.ParseException(\r
+ "unknown morph type: {0}".format(morph_type))\r
+\r
+ def read_vertex_morph_offset(self):\r
+ return pymeshio.pmx.VerexMorphOffset(\r
+ self.read_vertex_index(), self.read_vector3())\r
+\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
+ for _ in range(display_count):\r
+ display_type=self.read_uint(1)\r
+ if display_type==0:\r
+ display_slot.refrences.append(\r
+ (display_type, self.read_bone_index()))\r
+ elif display_type==1:\r
+ display_slot.refrences.append(\r
+ (display_type, self.read_morph_index()))\r
+ else:\r
+ raise pymeshio.common.ParseException(\r
+ "unknown display_type: {0}".format(display_type))\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
+ shape_size=self.read_vector3(),\r
+ shape_position=self.read_vector3(),\r
+ shape_rotation=self.read_vector3(),\r
+ mass=self.read_float(),\r
+ linear_damping=self.read_float(),\r
+ angular_damping=self.read_float(),\r
+ restitution=self.read_float(),\r
+ friction=self.read_float(),\r
+ mode=self.read_uint(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
+ rigidbody_index_a=self.read_rigidbody_index(),\r
+ rigidbody_index_b=self.read_rigidbody_index(),\r
+ position=self.read_vector3(),\r
+ rotation=self.read_vector3(),\r
+ translation_limit_min=self.read_vector3(),\r
+ translation_limit_max=self.read_vector3(),\r
+ rotation_limit_min=self.read_vector3(),\r
+ rotation_limit_max=self.read_vector3(),\r
+ spring_constant_translation=self.read_vector3(),\r
+ spring_constant_rotation=self.read_vector3())\r
+\r
\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
+def load_from_file(path):\r
+ return load(io.BytesIO(pymeshio.common.readall(path)))\r
+\r
+\r
+def load(ios):\r
+ assert(isinstance(ios, io.IOBase))\r
+ loader=pymeshio.common.BinaryLoader(ios)\r
\r
# header\r
signature=loader.unpack("4s", 4)\r
if signature!=b"PMX ":\r
- raise ParseException("invalid signature", loader.signature)\r
+ raise pymeshio.common.ParseException(\r
+ "invalid signature", signature)\r
\r
version=loader.read_float()\r
if version!=2.0:\r
# flags\r
flag_bytes=loader.read_uint(1)\r
if flag_bytes!=8:\r
- raise ParseException("invalid flag length", loader.flag_bytes)\r
+ raise pymeshio.common.ParseException(\r
+ "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
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
+ # model data\r
+ model.vertices=[loader.read_vertex() \r
+ for _ in range(loader.read_uint(4))]\r
+ model.indices=[loader.read_vertex_index() \r
+ for _ in range(loader.read_uint(4))]\r
+ model.textures=[loader.read_text() \r
+ for _ in range(loader.read_uint(4))]\r
+ model.materials=[loader.read_material() \r
+ for _ in range(loader.read_uint(4))]\r
+ model.bones=[loader.read_bone() \r
+ for _ in range(loader.read_uint(4))]\r
+ model.morphs=[loader.read_morgh() \r
+ for _ in range(loader.read_uint(4))]\r
+ model.display_slots=[loader.read_display_slot() \r
+ for _ in range(loader.read_uint(4))]\r
+ model.rigidbodies=[loader.read_rigidbody()\r
+ for _ in range(loader.read_uint(4))]\r
+ model.joints=[loader.read_joint()\r
+ for _ in range(loader.read_uint(4))]\r
\r
return model\r
\r