OSDN Git Service

fix for 2.57b
[meshio/pymeshio.git] / blender25-meshio / pymeshio / pmd.py
index f9afcbd..076fc11 100644 (file)
@@ -7,28 +7,6 @@ from .mmd import *
 ###############################################################################
 # PMD
 ###############################################################################
-if sys.version_info[0]<3:
-    def encode_string(src):
-        t=type(src)
-        if t==unicode:
-            return src.encode('cp932')
-        elif t==str:
-            return src
-        else:
-            raise "INVALID str: %s" % t
-
-
-else:
-    def encode_string(src):
-        t=type(src)
-        if t==str:
-            return src.encode('cp932')
-        elif t==bytes:
-            return src
-        else:
-            raise "INVALID str: %s" % t
-
-
 class Vertex(object):
     __slots__=['pos', 'normal', 'uv', 'bone0', 'bone1', 'weight0', 'edge_flag']
     def __init__(self, x=0, y=0, z=0, nx=0, ny=0, nz=0, u=0, v=0,
@@ -60,8 +38,8 @@ class Material(object):
             'diffuse', 'shinness', 'specular',
             'ambient', 'vertex_count', '_texture', 'toon_index', 'flag',
             ]
-    def getTexture(self): return self._texture
-    def setTexture(self, texture): self._texture=encode_string(texture)
+    def getTexture(self): return from_str(self._texture)
+    def setTexture(self, texture): self._texture=to_str(texture)
     texture=property(getTexture, setTexture)
 
     def __init__(self, dr=0, dg=0, db=0, alpha=1, 
@@ -71,7 +49,7 @@ class Material(object):
         self.shinness=specular
         self.ambient=RGBA(ar, ag, ab)
         self.vertex_count=0
-        self._texture=''
+        self.texture=''
         self.toon_index=0
         self.flag=0
 
@@ -106,11 +84,11 @@ class Bone(object):
             'children', '_english_name', 'ik_index',
             'parent_index', 'tail_index', 'tail',
             ]
-    def getName(self): return self._name
-    def setName(self, name): self._name=encode_string(name)
+    def getName(self): return from_str(self._name)
+    def setName(self, name): self._name=to_str(name)
     name=property(getName, setName)
-    def getEnglishName(self): return self._english_name
-    def setEnglishName(self, english_name): self._english_name=encode_string(english_name)
+    def getEnglishName(self): return from_str(self._english_name)
+    def setEnglishName(self, english_name): self._english_name=to_str(english_name)
     english_name=property(getEnglishName, setEnglishName)
 
     def __init__(self, name='bone', type=0):
@@ -261,11 +239,11 @@ class IK(object):
 class Skin(object):
     __slots__=['_name', 'type', 'indices', 'pos_list', '_english_name',
             'vertex_count']
-    def getName(self): return self._name
-    def setName(self, name): self._name=encode_string(name)
+    def getName(self): return from_str(self._name)
+    def setName(self, name): self._name=to_str(name)
     name=property(getName, setName)
-    def getEnglishName(self): return self._english_name
-    def setEnglishName(self, english_name): self._english_name=encode_string(english_name)
+    def getEnglishName(self): return from_str(self._english_name)
+    def setEnglishName(self, english_name): self._english_name=to_str(english_name)
     english_name=property(getEnglishName, setEnglishName)
 
     def __init__(self, name='skin'):
@@ -287,11 +265,11 @@ class Skin(object):
 
 class BoneGroup(object):
     __slots__=['_name', '_english_name']
-    def getName(self): return self._name
-    def setName(self, name): self._name=encode_string(name)
+    def getName(self): return from_str(self._name)
+    def setName(self, name): self._name=to_str(name)
     name=property(getName, setName)
-    def getEnglishName(self): return self._english_name
-    def setEnglishName(self, english_name): self._english_name=encode_string(english_name)
+    def getEnglishName(self): return from_str(self._english_name)
+    def setEnglishName(self, english_name): self._english_name=to_str(english_name)
     english_name=property(getEnglishName, setEnglishName)
 
     def __init__(self, name='group'): self._name=name; self._english_name='center'
@@ -311,8 +289,8 @@ class RigidBody(object):
             'w', 'h', 'd', 'position', 'rotation', 'weight',
             'linearDamping', 'angularDamping', 'restitution', 'friction', 'processType'
             ]
-    def getName(self): return self._name
-    def setName(self, name): self._name=encode_string(name)
+    def getName(self): return from_str(self._name)
+    def setName(self, name): self._name=to_str(name)
     name=property(getName, setName)
 
     def __init__(self, name):
@@ -327,8 +305,8 @@ class Constraint(object):
             'constraintRotMin', 'constraintRotMax',
             'springPos', 'springRot',
             ]
-    def getName(self): return self._name
-    def setName(self, name): self._name=encode_string(name)
+    def getName(self): return from_str(self._name)
+    def setName(self, name): self._name=to_str(name)
     name=property(getName, setName)
 
     def __init__(self, name):
@@ -343,6 +321,24 @@ class Constraint(object):
         self.springRot=Vector3()
 
 
+class ToonTextures(object):
+    __slots__=['_toon_textures']
+    def __init__(self):
+        self._toon_textures=[]
+        for i in range(10):
+            self._toon_textures.append('toon%02d.bmp' % (i+1))
+
+    def __getitem__(self, key):
+        return from_str(self._toon_textures[key])
+
+    def __setitem__(self, key, value):
+        self._toon_textures[key]=to_str(value)
+
+    def __iter__(self):
+        for toon_texture in self._toon_textures:
+            yield from_str(toon_texture)
+
+
 class IO(object):
     __slots__=['io', 'end', 'pos',
             'version', '_name', '_comment',
@@ -354,23 +350,23 @@ class IO(object):
             'no_parent_bones',
             'rigidbodies', 'constraints',
             ]
-    def getName(self): return self._name
-    def setName(self, name): self._name=encode_string(name)
+    def getName(self): return from_str(self._name)
+    def setName(self, name): self._name=to_str(name)
     name=property(getName, setName)
-    def getEnglishName(self): return self._english_name
-    def setEnglishName(self, english_name): self._english_name=encode_string(english_name)
+    def getEnglishName(self): return from_str(self._english_name)
+    def setEnglishName(self, english_name): self._english_name=to_str(english_name)
     english_name=property(getEnglishName, setEnglishName)
-    def getComment(self): return self._comment
-    def setComment(self, comment): self._comment=encode_string(comment)
+    def getComment(self): return from_str(self._comment)
+    def setComment(self, comment): self._comment=to_str(comment)
     comment=property(getComment, setComment)
-    def getEnglishComment(self): return self._english_comment
-    def setEnglishComment(self, english_comment): self._english_comment=encode_string(english_comment)
+    def getEnglishComment(self): return from_str(self._english_comment)
+    def setEnglishComment(self, english_comment): self._english_comment=to_str(english_comment)
     english_comment=property(getEnglishComment, setEnglishComment)
 
     def __init__(self):
         self.version=1.0
-        self.name="default"
-        self.comment="default"
+        self.name='default'
+        self.comment='default'
         self.english_name='default'
         self.english_comment='default'
         self.vertices=[]
@@ -379,23 +375,15 @@ class IO(object):
         self.bones=[]
         self.ik_list=[]
         self.morph_list=[]
-
         self.face_list=[]
         self.bone_group_list=[]
         self.bone_display_list=[]
-
-        self.toon_textures=[
-                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=[]
-
+        # extend
+        self.toon_textures=ToonTextures()
         self.rigidbodies=[]
         self.constraints=[]
+        # innner use
+        self.no_parent_bones=[]
 
     def each_vertex(self): return self.vertices
     def getUV(self, i): return self.vertices[i].uv
@@ -517,7 +505,7 @@ class IO(object):
         if not io:
             return False
         # Header
-        io.write(b"Pmd")        
+        io.write(b"Pmd")
         io.write(struct.pack("f", self.version))
         io.write(struct.pack("20s", self.name))
         io.write(struct.pack("256s", self.comment))
@@ -606,7 +594,7 @@ class IO(object):
             io.write(struct.pack("=20s", bone.english_name))
         # english skin list
         for skin in self.morph_list:
-            print(skin.name)
+            #print(skin.name)
             if skin.name==b'base':
                 continue
             io.write(struct.pack("=20s", skin.english_name))
@@ -614,8 +602,8 @@ class IO(object):
         for bone_group in self.bone_group_list:
             io.write(struct.pack("50s", bone_group.english_name))
         # toon texture
-        for i in range(10):
-            io.write(struct.pack("=100s", self.toon_textures[i]))
+        for toon_texture in self.toon_textures:
+            io.write(struct.pack("=100s", toon_texture))
         # rigid
         io.write(struct.pack("I", len(self.rigidbodies)))
         for r in self.rigidbodies:
@@ -781,8 +769,7 @@ class IO(object):
         100bytex10
         """
         for i in range(10):
-            self.toon_textures.append(
-                    truncate_zero(struct.unpack("100s", self.io.read(100))[0]))
+            self.toon_textures[i]=truncate_zero(struct.unpack("100s", self.io.read(100))[0])
         return True
 
     def loadEnglishName(self):
@@ -800,7 +787,7 @@ class IO(object):
         self._check_position()
         # english skin list
         for skin in self.morph_list:
-            if skin.name=='base':
+            if skin.name==b'base':
                 continue
             english_name=truncate_zero(
                     struct.unpack("20s", self.io.read(20))[0])