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