OSDN Git Service

fix.
[meshio/meshio.git] / swig / blender / pmd_export.py
index c0e52cb..2e8703d 100644 (file)
@@ -373,14 +373,13 @@ class OneSkinMesh(object):
         if bl.objectHasShapeKey(obj):
             # base
             for b in bl.objectShapeKeys(obj):
-                if b.name=='Basis':
-                    print(b.name)
+                if b.name==BASE_SHAPE_NAME:
                     baseMorph=self.__getOrCreateMorph('base', 0)
                     relativeIndex=0
                     basis=b
 
                     for index in bl.meshVertexGroup(obj, MMD_SHAPE_GROUP_NAME):
-                        v=b.data[index]
+                        v=bl.shapeKeyGet(b, index)
                         pos=[v[0], v[1], v[2]]
                         indices=self.vertexArray.getMappedIndices(index)
                         for i in indices:
@@ -390,29 +389,30 @@ class OneSkinMesh(object):
 
                     break
             assert(basis)
+            print(basis.name, len(baseMorph.offsets))
 
             if(len(baseMorph.offsets)>0):
                 baseMorph.sort()
 
                 # shape keys
-                vg=obj.getData(mesh=True).getVertsFromGroup(
-                            MMD_SHAPE_GROUP_NAME)
-                for b in obj.getData(mesh=True).key.blocks:
-                    if b.name=='Basis':
+                vg=bl.meshVertexGroup(obj, MMD_SHAPE_GROUP_NAME)
+                for b in bl.objectShapeKeys(obj):
+                    if b.name==BASE_SHAPE_NAME:
                         continue
 
                     print(b.name)
                     morph=self.__getOrCreateMorph(b.name, 4)
                     for index, src, dst in zip(
                             xrange(len(blenderMesh.verts)),
-                            basis.data,
-                            b.data):
+                            bl.shapeKeys(basis),
+                            bl.shapeKeys(b)):
                         offset=[dst[0]-src[0], dst[1]-src[1], dst[2]-src[2]]
+                        if offset[0]==0 and offset[1]==0 and offset[2]==0:
+                            continue
                         if index in vg:
                             indices=self.vertexArray.getMappedIndices(index)
                             for i in indices:
                                 morph.add(indexRelativeMap[i], offset)
-                    assert(len(morph.offsets)==len(baseMorph.offsets))
 
                 # sort skinmap
                 original=self.morphList[:]
@@ -611,6 +611,7 @@ class PmdExporter(object):
         for node in object_node_map.values():
             if node.o.parent:
                 object_node_map[node.o.parent].children.append(node)
+
         # ルートを得る
         root=object_node_map[scene.objects.active]
 
@@ -718,13 +719,9 @@ class PmdExporter(object):
                 assert(i<vertexCount)
             for i in xrange(0, len(indices), 3):
                 # reverse triangle
-                io.indices.append(indices[i+2])
-                io.indices.append(indices[i+1])
                 io.indices.append(indices[i])
-
-                #io.indices.append(indices[i])
-                #io.indices.append(indices[i+1])
-                #io.indices.append(indices[i+2])
+                io.indices.append(indices[i+1])
+                io.indices.append(indices[i+2])
 
         # bones
         for b in self.builder.bones:
@@ -796,9 +793,8 @@ class PmdExporter(object):
             v=englishmap.getUnicodeSkinName(m.name)
             assert(v)
             cp932=v[1].encode('cp932')
-            morph.name="%s\n" % cp932
-
-            morph.english_name="%s\n" % m.name
+            morph.setName(cp932)
+            morph.setEnglishName(m.name.encode('cp932'))
             m.type=v[2]
             morph.type=v[2]
             for index, offset in m.offsets:
@@ -828,9 +824,8 @@ class PmdExporter(object):
                 boneDisplayName.name=name.decode('utf-8').encode('cp932')
                 boneDisplayName.english_name=english
             else:
-                # ToDo
-                boneDisplayName.name=english
-                boneDisplayName.english_name=english
+                boneDisplayName.setName(name.encode('cp932'))
+                boneDisplayName.setEnglishName(english.encode('cp932'))
         boneDisplayName=createBoneDisplayName("IK\n", "IK\n")
         boneDisplayName=createBoneDisplayName("体(上)\n", "Body[u]\n")
         boneDisplayName=createBoneDisplayName("髪\n", "Hair\n")
@@ -910,6 +905,10 @@ def getBoneDisplayGroup(bone):
 
 
 def __execute(filename, scene):
+    if not scene.objects.active:
+        print("abort. no active object.")
+        return
+
     exporter=PmdExporter()
     exporter.setup(scene)
     exporter.write(filename)