class Loader(pymeshio.common.BinaryLoader):\r
"""pmx loader\r
"""\r
- def __init__(self, io, version):\r
- super(Loader, self).__init__(io)\r
+ def __init__(self, ios, version):\r
+ super(Loader, self).__init__(ios)\r
self.version=version\r
\r
def read_text(self, size):\r
return ik\r
\r
def read_morph(self):\r
- skin=pymeshio.pmd.Skin(self.read_text(20))\r
- skin_size = self.read_uint(4)\r
- skin.type = self.read_uint(1)\r
- for j in range(skin_size):\r
- skin.indices.append(self.read_uint(4))\r
- skin.pos_list.append(self.read_vector3())\r
- return skin\r
+ morph=pymeshio.pmd.Morph(self.read_text(20))\r
+ morph_size = self.read_uint(4)\r
+ morph.type = self.read_uint(1)\r
+ for j in range(morph_size):\r
+ morph.indices.append(self.read_uint(4))\r
+ morph.pos_list.append(self.read_vector3())\r
+ return morph\r
\r
def read_rigidbody(self):\r
return pymeshio.pmd.RigidBody(\r
if morph.name==b'base':\r
continue\r
morph.english_name=loader.read_text(20)\r
- for bone_group in model.bone_group_list:\r
- bone_group=loader.read_text(50)\r
+ model.bone_group_english_list=[loader.read_text(50)\r
+ for _ in model.bone_group_list]\r
\r
############################################################\r
# extend2: toon_textures\r
return True\r
\r
\r
-def load(path):\r
- # general binary loader\r
- #loader=pymeshio.common.BinaryLoader(open(path, 'rb'))\r
- loader=pymeshio.common.BinaryLoader(io.BytesIO(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("3s", 3)\r
version=loader.read_float()\r
\r
model=pymeshio.pmd.Model(version)\r
- loader=Loader(loader.io, version)\r
+ loader=Loader(loader.ios, version)\r
if(__load(loader, model)):\r
# check eof\r
if not loader.is_end():\r
- print("can not reach eof.")\r
+ #print("can not reach eof.")\r
+ pass\r
\r
# build bone tree\r
for i, child in enumerate(model.bones):\r
parent=model.bones[child.parent_index]\r
child.parent=parent\r
parent.children.append(child)\r
- # \8cã\88Ê\92u\r
+ # 後位置\r
if child.hasChild():\r
child.tail=model.bones[child.tail_index].pos\r
\r
return model\r
\r
\r
-def save(self, path):\r
- io=open(path, 'wb')\r
- if not io:\r
- return False\r
- # Header\r
- io.write(b"Pmd")\r
- io.write(struct.pack("f", self.version))\r
- io.write(struct.pack("20s", self.name))\r
- io.write(struct.pack("256s", self.comment))\r
-\r
- # Vertices\r
- io.write(struct.pack("I", len(self.vertices)))\r
- sVertex=struct.Struct("=8f2H2B") # 38byte\r
- assert(sVertex.size==38)\r
- for v in self.vertices:\r
- data=sVertex.pack( \r
- v.pos[0], v.pos[1], v.pos[2],\r
- v.normal[0], v.normal[1], v.normal[2],\r
- v.uv[0], v.uv[1],\r
- v.bone0, v.bone1, v.weight0, v.edge_flag)\r
- io.write(data)\r
-\r
- # Faces\r
- io.write(struct.pack("I", len(self.indices)))\r
- io.write(struct.pack("=%dH" % len(self.indices), *self.indices))\r
-\r
- # material\r
- io.write(struct.pack("I", len(self.materials)))\r
- sMaterial=struct.Struct("=3fff3f3fBBI20s") # 70byte\r
- assert(sMaterial.size==70)\r
- for m in self.materials:\r
- io.write(sMaterial.pack(\r
- m.diffuse[0], m.diffuse[1], m.diffuse[2], m.diffuse[3],\r
- m.shinness, \r
- m.specular[0], m.specular[1], m.specular[2],\r
- m.ambient[0], m.ambient[1], m.ambient[2],\r
- m.toon_index, m.flag,\r
- m.vertex_count,\r
- m.texture\r
- ))\r
-\r
- # bone\r
- io.write(struct.pack("H", len(self.bones)))\r
- sBone=struct.Struct("=20sHHBH3f")\r
- assert(sBone.size==39)\r
- for b in self.bones:\r
- io.write(sBone.pack(\r
- b.name,\r
- b.parent_index, b.tail_index, b.type, b.ik_index,\r
- b.pos[0], b.pos[1], b.pos[2]))\r
-\r
- # IK\r
- io.write(struct.pack("H", len(self.ik_list)))\r
- for ik in self.ik_list:\r
- io.write(struct.pack("=2HBHf", \r
- ik.index, ik.target, ik.length, ik.iterations, ik.weight\r
- ))\r
- for c in ik.children:\r
- io.write(struct.pack("H", c))\r
-\r
- # skin\r
- io.write(struct.pack("H", len(self.morph_list)))\r
- for s in self.morph_list:\r
- io.write(struct.pack("20sIB", \r
- s.name, len(s.indices), s.type))\r
- for i, v in zip(s.indices, s.pos_list):\r
- io.write(struct.pack("I3f", i, v[0], v[1], v[2]))\r
-\r
- # skin disp list\r
- io.write(struct.pack("B", len(self.face_list)))\r
- for i in self.face_list:\r
- io.write(struct.pack("H", i))\r
-\r
- # bone disp list\r
- io.write(struct.pack("B", len(self.bone_group_list)))\r
- for g in self.bone_group_list:\r
- io.write(struct.pack("50s", g.name))\r
-\r
- io.write(struct.pack("I", len(self.bone_display_list)))\r
- for l in self.bone_display_list:\r
- io.write(struct.pack("=HB", *l))\r
-\r
- ############################################################\r
- # extend data\r
- ############################################################\r
- io.write(struct.pack("B", 1))\r
- # english name\r
- io.write(struct.pack("=20s", self.english_name))\r
- io.write(struct.pack("=256s", self.english_comment))\r
- # english bone name\r
- for bone in self.bones:\r
- io.write(struct.pack("=20s", bone.english_name))\r
- # english skin list\r
- for skin in self.morph_list:\r
- #print(skin.name)\r
- if skin.name==b'base':\r
- continue\r
- io.write(struct.pack("=20s", skin.english_name))\r
- # english bone list\r
- for bone_group in self.bone_group_list:\r
- io.write(struct.pack("50s", bone_group.english_name))\r
- # toon texture\r
- for toon_texture in self.toon_textures:\r
- io.write(struct.pack("=100s", toon_texture))\r
- # rigid\r
- io.write(struct.pack("I", len(self.rigidbodies)))\r
- for r in self.rigidbodies:\r
- io.write(struct.pack("=20sHBHB14fB",\r
- r.name, r.boneIndex, r.group, r.target, r.shapeType,\r
- r.w, r.h, r.d, \r
- r.position.x, r.position.y, r.position.z, \r
- r.rotation.x, r.rotation.y, r.rotation.z, \r
- r.weight,\r
- r.linearDamping, r.angularDamping, r.restitution,\r
- r.friction, r.processType))\r
-\r
- # constraint\r
- io.write(struct.pack("I", len(self.constraints)))\r
- for c in self.constraints:\r
- io.write(struct.pack("=20sII24f",\r
- c.name, c.rigidA, c.rigidB,\r
- c.pos.x, c.pos.y, c.pos.z,\r
- c.rot.x, c.rot.y, c.rot.z,\r
- c.constraintPosMin.x, c.constraintPosMin.y, c.constraintPosMin.z,\r
- c.constraintPosMax.x, c.constraintPosMax.y, c.constraintPosMax.z,\r
- c.constraintRotMin.x, c.constraintRotMin.y, c.constraintRotMin.z,\r
- c.constraintRotMax.x, c.constraintRotMax.y, c.constraintRotMax.z,\r
- c.springPos.x, c.springPos.y, c.springPos.z,\r
- c.springRot.x, c.springRot.y, c.springRot.z\r
- ))\r
-\r
- return True\r
\r