OSDN Git Service

refactoring pmd.writer
[meshio/pymeshio.git] / pymeshio / pmd / loader.py
index c897f22..3f16099 100644 (file)
@@ -7,8 +7,8 @@ import pymeshio.pmd
 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
@@ -65,13 +65,13 @@ class Loader(pymeshio.common.BinaryLoader):
         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
@@ -150,8 +150,8 @@ def __load(loader, model):
         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
@@ -176,10 +176,13 @@ def __load(loader, model):
     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
@@ -189,11 +192,12 @@ def load(path):
     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
@@ -206,143 +210,11 @@ def load(path):
                 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