OSDN Git Service

add UshortVectoadd
[meshio/pymeshio.git] / blender25-meshio / pymeshio / pmd.py
index d7a4a27..4c64ad8 100644 (file)
@@ -1,19 +1,14 @@
 # coding: utf-8
 import os
+import sys
 import struct
 from .mmd import *
 
 ###############################################################################
 # PMD
 ###############################################################################
-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
+def UshortVector():
+    return []
 
 
 class Vertex(object):
@@ -47,8 +42,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, 
@@ -58,7 +53,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
 
@@ -93,11 +88,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):
@@ -248,11 +243,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'):
@@ -274,11 +269,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'
@@ -298,8 +293,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):
@@ -314,8 +309,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):
@@ -330,6 +325,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',
@@ -341,48 +354,40 @@ 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.english_name='default'
-        self.english_comment='default'
+        self.name=''
+        self.comment=''
+        self.english_name=''
+        self.english_comment=''
         self.vertices=[]
         self.indices=[]
         self.materials=[]
         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
@@ -504,7 +509,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))
@@ -593,7 +598,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))
@@ -601,8 +606,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:
@@ -768,8 +773,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):
@@ -787,7 +791,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])