OSDN Git Service

fix bone weight.
authorousttrue <ousttrue@gmail.com>
Sat, 19 Jun 2010 03:43:39 +0000 (12:43 +0900)
committerousttrue <ousttrue@gmail.com>
Sat, 19 Jun 2010 03:43:39 +0000 (12:43 +0900)
swig/blender/pmd_export.py

index d010503..567edcf 100644 (file)
@@ -522,7 +522,7 @@ class Bone(object):
         return "<Bone %s %d>" % (self.name, self.type)
 
 class BoneBuilder(object):
-    __slots__=['bones', 'boneMap', 'ik_list']
+    __slots__=['bones', 'boneMap', 'ik_list']
     def __init__(self):
         self.bones=[]
         self.boneMap={}
@@ -590,6 +590,20 @@ class BoneBuilder(object):
                                 bl.ikRotationWeight(c)
                                 ))
 
+        # boneのsort
+        self._sortBy()
+        self._fix()
+        # IKのsort
+        def getIndex(ik):
+            for i, v in enumerate(englishmap.boneMap):
+                if v[0]==ik.target.name:
+                    return i
+            return len(englishmap.boneMap)
+        if isBlender24():
+            self.ik_list.sort(lambda l, r: getIndex(l)-getIndex(r))
+        else:
+            self.ik_list.sort(key=getIndex)
+
     def __checkConnection(self, b, p):
         if bl.boneIsConnected(b):
             parent=self.__boneByName(p.name)
@@ -598,10 +612,11 @@ class BoneBuilder(object):
         for c in b.children:
             self.__checkConnection(c, b)
 
-    def sortBy(self, boneMap):
+    def _sortBy(self):
         """
         boneMap順に並べ替える
         """
+        boneMap=englishmap.boneMap
         original=self.bones[:]
         def getIndex(bone):
             for i, k_v in enumerate(boneMap):
@@ -627,7 +642,7 @@ class BoneBuilder(object):
             if b.ik_index>0:
                 b.ik_index=sortMap[b.ik_index]
 
-    def fix(self):
+    def _fix(self):
         """
         調整
         """
@@ -654,10 +669,13 @@ class BoneBuilder(object):
         assert(false)
 
     def indexByName(self, name):
-        return self.getIndex(self.__boneByName(name))
+        if name=='':
+            return 0
+        else:
+            return self.getIndex(self.__boneByName(name))
 
     def __boneByName(self, name):
-        return self.bones[self.boneMap[name]]
+        return self.boneMap[name]
                     
     def __getBone(self, parent, b):
         if len(b.children)==0:
@@ -678,7 +696,7 @@ class BoneBuilder(object):
     def __addBone(self, bone):
         bone.index=len(self.bones)
         self.bones.append(bone)
-        self.boneMap[bone.name]=bone.index
+        self.boneMap[bone.name]=bone
 
 
 class PmdExporter(object):
@@ -709,17 +727,6 @@ class PmdExporter(object):
         # skeleton
         self.builder=BoneBuilder()
         self.builder.build(self.armatureObj)
-        self.builder.sortBy(englishmap.boneMap)
-        def getIndex(ik):
-            for i, v in enumerate(englishmap.boneMap):
-                if v[0]==ik.target.name:
-                    return i
-            return len(englishmap.boneMap)
-        if isBlender24():
-            self.builder.ik_list.sort(lambda l, r: getIndex(l)-getIndex(r))
-        else:
-            self.builder.ik_list.sort(key=getIndex)
-        self.builder.fix()
 
     def __createOneSkinMesh(self, node):
         ############################################################
@@ -758,8 +765,8 @@ class PmdExporter(object):
             v.normal.z=normal[1]
             v.uv.x=uv[0]
             v.uv.y=uv[1]
-            v.bone0=self.builder.boneMap[b0] if b0 in self.builder.boneMap else 0
-            v.bone1=self.builder.boneMap[b1] if b1 in self.builder.boneMap else 0
+            v.bone0=self.builder.indexByName(b0)
+            v.bone1=self.builder.indexByName(b1)
             v.weight0=int(100*weight)
             v.edge_flag=0 # edge flag, 0: enable edge, 1: not edge