OSDN Git Service

fix for python3
[meshio/pymeshio.git] / blender25-meshio / pymeshio / pmd.py
index 2c5f072..8efc328 100644 (file)
@@ -1,7 +1,7 @@
 # coding: utf-8
 import os
 import struct
-from mmd import *
+from .mmd import *
 
 ###############################################################################
 # PMD
@@ -231,6 +231,7 @@ class IK(object):
     def __str__(self):
         return "<IK index: %d, target: %d, iterations: %d, weight: %f, children: %s(%d)>" %(self.index, self.target, self.iterations, self.weight, '-'.join([str(i) for i in self.children]), len(self.children))
 
+
 class Skin(object):
     __slots__=['name', 'type', 'indices', 'pos_list', 'english_name',
             'vertex_count']
@@ -255,13 +256,6 @@ class Skin(object):
             self.name, self.type, len(self.indices))
 
 
-class ToonTexture(object):
-    __slots__=['name']
-    def __init__(self, name): self.name=name
-    def getName(self): return self.name.decode('cp932')
-    def setName(self, u): self.name=u
-
-
 class BoneGroup(object):
     __slots__=['name', 'english_name']
     def __init__(self, name='group'): self.name=name; self.english_name='center'
@@ -278,11 +272,26 @@ class RigidBody(object):
             ]
     def __init__(self, name):
         self.name=name
+        self.position=Vector3()
+        self.rotation=Vector3()
 
 
 class Constraint(object):
-    def __init__(self):
-        pass
+    __slots__=[ 'name', 'rigidA', 'rigidB', 'pos', 'rot',
+            'constraintPosMin', 'constraintPosMax',
+            'constraintRotMin', 'constraintRotMax',
+            'springPos', 'springRot',
+            ]
+    def __init__(self, name):
+        self.name=name
+        self.pos=Vector3()
+        self.rot=Vector3()
+        self.constraintPosMin=Vector3()
+        self.constraintPosMax=Vector3()
+        self.constraintRotMin=Vector3()
+        self.constraintRotMax=Vector3()
+        self.springPos=Vector3()
+        self.springRot=Vector3()
 
 
 class IO(object):
@@ -314,11 +323,11 @@ class IO(object):
         self.bone_display_list=[]
 
         self.toon_textures=[
-                ToonTexture(b'toon'), ToonTexture(b'toon'),
-                ToonTexture(b'toon'), ToonTexture(b'toon'),
-                ToonTexture(b'toon'), ToonTexture(b'toon'),
-                ToonTexture(b'toon'), ToonTexture(b'toon'),
-                ToonTexture(b'toon'), ToonTexture(b'toon'),
+                b'toon01.bmp', b'toon02.bmp',
+                b'toon03.bmp', b'toon04.bmp',
+                b'toon05.bmp', b'toon06.bmp',
+                b'toon07.bmp', b'toon08.bmp',
+                b'toon09.bmp', b'toon10.bmp',
                 ]
 
         self.no_parent_bones=[]
@@ -371,17 +380,12 @@ class IO(object):
             len(self.materials), len(self.bones), len(self.ik_list), len(self.morph_list))
 
     def _check_position(self):
-        """
-        if self.pos:
-            print(self.pos, self.io.tell()-self.pos)
-        """
         self.pos=self.io.tell()
-        pass
 
     def read(self, path):
         size=os.path.getsize(path)
-        f=open(path, "rb")
-        return self.load(path, f, size)
+        with open(path, "rb") as f:
+            return self.load(path, f, size)
 
     def load(self, path, io, end):
         self.io=io
@@ -539,9 +543,6 @@ class IO(object):
         for l in self.bone_display_list:
             io.write(struct.pack("=HB", *l))
 
-        # ToDo
-        # Extend Data
-
         return True
 
 
@@ -578,7 +579,6 @@ class IO(object):
 
     def _loadHeader(self):
         signature=struct.unpack("3s", self.io.read(3))[0]
-        #print(signature)
         if signature!=b"Pmd":
             print("invalid signature", signature)
             return False
@@ -671,7 +671,9 @@ class IO(object):
     def _loadBoneIndex(self):
         size = struct.unpack("I", self.io.read(4))[0]
         for i in xrange(size):
-            self.bone_display_list.append(struct.unpack("HB", self.io.read(3)))
+            first=struct.unpack("H", self.io.read(2))[0]
+            second=struct.unpack("B", self.io.read(1))[0]
+            self.bone_display_list.append((first, second))
         return True
 
     def loadToonTexture(self):
@@ -679,8 +681,8 @@ class IO(object):
         100bytex10
         """
         for i in xrange(10):
-            self.toon_textures.append(ToonTexture(
-                    truncate_zero(struct.unpack("100s", self.io.read(100))[0])))
+            self.toon_textures.append(
+                    truncate_zero(struct.unpack("100s", self.io.read(100))[0]))
         return True
 
     def loadEnglishName(self):
@@ -689,14 +691,14 @@ class IO(object):
                 struct.unpack("20s", self.io.read(20))[0])
         self.english_comment=truncate_zero(
                 struct.unpack("256s", self.io.read(256))[0])
-        # english bone list
+        self._check_position()
+        # english bone name
         for bone in self.bones:
             english_name=truncate_zero(
                     struct.unpack("20s", self.io.read(20))[0])
-            if english_name!=bone.name:
-                bone.english_name=english_name
+            bone.english_name=english_name
+        self._check_position()
         # english skin list
-        #for index in self.face_list:
         for skin in self.morph_list:
             if skin.name=='base':
                 continue
@@ -705,10 +707,12 @@ class IO(object):
             #skin=self.morph_list[index]
             if english_name!=skin.name:
                 skin.english_name=english_name
+        self._check_position()
         # english bone list
         for i in xrange(0, len(self.bone_group_list)):
             self.bone_group_list[i].english_name=truncate_zero(
                     struct.unpack("50s", self.io.read(50))[0])
+        self._check_position()
         return True
 
     def loadPhysics(self):
@@ -717,14 +721,61 @@ class IO(object):
         for i in xrange(count):
             name=truncate_zero(struct.unpack("20s", self.io.read(20))[0])
             rigidbody=RigidBody(name)
-            struct.unpack("63s", self.io.read(63))[0]
+            rigidbody.boneIndex=struct.unpack("H", self.io.read(2))[0]
+            rigidbody.group=struct.unpack("B", self.io.read(1))[0]
+            rigidbody.target=struct.unpack("H", self.io.read(2))[0]
+            rigidbody.shapeType=struct.unpack("B", self.io.read(1))[0]
+            rigidbody.w=struct.unpack("f", self.io.read(4))[0]
+            rigidbody.h=struct.unpack("f", self.io.read(4))[0]
+            rigidbody.d=struct.unpack("f", self.io.read(4))[0]
+            rigidbody.position.x=struct.unpack("f", self.io.read(4))[0]
+            rigidbody.position.y=struct.unpack("f", self.io.read(4))[0]
+            rigidbody.position.z=struct.unpack("f", self.io.read(4))[0]
+            rigidbody.rotation.x=struct.unpack("f", self.io.read(4))[0]
+            rigidbody.rotation.y=struct.unpack("f", self.io.read(4))[0]
+            rigidbody.rotation.z=struct.unpack("f", self.io.read(4))[0]
+            rigidbody.weight=struct.unpack("f", self.io.read(4))[0]
+            rigidbody.linearDamping=struct.unpack("f", self.io.read(4))[0]
+            rigidbody.angularDamping=struct.unpack("f", self.io.read(4))[0]
+            rigidbody.restitution=struct.unpack("f", self.io.read(4))[0]
+            rigidbody.friction=struct.unpack("f", self.io.read(4))[0]
+            rigidbody.processType=struct.unpack("B", self.io.read(1))[0]
             self.rigidbodies.append(rigidbody)
+        self._check_position()
 
         # ジョイントリスト
         count = struct.unpack("I", self.io.read(4))[0]
         for i in xrange(count):
-            struct.unpack("124s", self.io.read(124))[0]
-            constraint=Constraint()
-            self.constraints.append(Constraint)
+            name=truncate_zero(struct.unpack("20s", self.io.read(20))[0])
+            constraint=Constraint(name)
+            constraint.rigidA=struct.unpack("I", self.io.read(4))[0]
+            constraint.rigidB=struct.unpack("I", self.io.read(4))[0]
+            constraint.pos.x=struct.unpack("f", self.io.read(4))[0]
+            constraint.pos.y=struct.unpack("f", self.io.read(4))[0]
+            constraint.pos.z=struct.unpack("f", self.io.read(4))[0]
+            constraint.rot.x=struct.unpack("f", self.io.read(4))[0]
+            constraint.rot.y=struct.unpack("f", self.io.read(4))[0]
+            constraint.rot.z=struct.unpack("f", self.io.read(4))[0]
+            constraint.constraintPosMin.x=struct.unpack("f", self.io.read(4))[0]
+            constraint.constraintPosMin.y=struct.unpack("f", self.io.read(4))[0]
+            constraint.constraintPosMin.z=struct.unpack("f", self.io.read(4))[0]
+            constraint.constraintPosMax.x=struct.unpack("f", self.io.read(4))[0]
+            constraint.constraintPosMax.y=struct.unpack("f", self.io.read(4))[0]
+            constraint.constraintPosMax.z=struct.unpack("f", self.io.read(4))[0]
+            constraint.constraintRotMin.x=struct.unpack("f", self.io.read(4))[0]
+            constraint.constraintRotMin.y=struct.unpack("f", self.io.read(4))[0]
+            constraint.constraintRotMin.z=struct.unpack("f", self.io.read(4))[0]
+            constraint.constraintRotMax.x=struct.unpack("f", self.io.read(4))[0]
+            constraint.constraintRotMax.y=struct.unpack("f", self.io.read(4))[0]
+            constraint.constraintRotMax.z=struct.unpack("f", self.io.read(4))[0]
+            constraint.springPos.x=struct.unpack("f", self.io.read(4))[0]
+            constraint.springPos.y=struct.unpack("f", self.io.read(4))[0]
+            constraint.springPos.z=struct.unpack("f", self.io.read(4))[0]
+            constraint.springRot.x=struct.unpack("f", self.io.read(4))[0]
+            constraint.springRot.y=struct.unpack("f", self.io.read(4))[0]
+            constraint.springRot.z=struct.unpack("f", self.io.read(4))[0]
+            self.constraints.append(constraint)
+        self._check_position()
+
         return True