OSDN Git Service

fix pmd_export
authorU-theremin\focke <ousttrue@gmail.com>
Fri, 29 Apr 2011 11:00:10 +0000 (20:00 +0900)
committerU-theremin\focke <ousttrue@gmail.com>
Fri, 29 Apr 2011 11:00:10 +0000 (20:00 +0900)
meshio/__init__.py
meshio/bl25.py
meshio/export_pmd.py
meshio/import_mqo.py

index 86630d9..98767b7 100755 (executable)
@@ -68,8 +68,10 @@ class ExportPMD(bpy.types.Operator, ExportHelper):
 
     def execute(self, context):
         from . import export_pmd
+        bl.initialize('pmd_export', context.scene)
         export_pmd._execute(**self.as_keywords(
-            ignore=("check_existing", "filter_glob")))
+            ignore=("check_existing", "filter_glob", "use_selection")))
+        bl.finalize()
         return {'FINISHED'}
 
 def menu_pmd_export(self, context):
@@ -141,7 +143,7 @@ class ExportMQO(bpy.types.Operator, ExportHelper):
     def execute(self, context):
         from . import export_mqo
         export_pmd._execute(**self.as_keywords(
-            ignore=("check_existing", "filter_glob")))
+            ignore=("check_existing", "filter_glob", "use_selection")))
         return {'FINISHED'}
 
 def menu_mqo_export(self, context):
index 4035ca2..1875d4f 100755 (executable)
@@ -191,7 +191,7 @@ class object:
 
     @staticmethod
     def getShapeKeys(o):
-        return o.data.shape_keys.keys
+        return o.data.shape_keys.key_blocks
 
     @staticmethod
     def addShapeKey(o, name):
@@ -423,7 +423,7 @@ class mesh:
 
     @staticmethod
     def hasUV(mesh):
-        return mesh.active_uv_texture
+        return len(mesh.uv_textures)>0
 
     @staticmethod
     def useVertexUV(mesh):
@@ -435,12 +435,22 @@ class mesh:
 
     @staticmethod
     def hasFaceUV(mesh, i, face):
-        return mesh.active_uv_texture and mesh.active_uv_texture.data[i]
+        active_uv_texture=None
+        for t in mesh.uv_textures:
+            if t.active:
+                active_uv_texture=t
+                break
+        return active_uv_texture and active_uv_texture.data[i]
 
     @staticmethod
     def getFaceUV(mesh, i, faces, count=3):
-        if mesh.active_uv_texture and mesh.active_uv_texture.data[i]:
-            uvFace=mesh.active_uv_texture.data[i]
+        active_uv_texture=None
+        for t in mesh.uv_textures:
+            if t.active:
+                active_uv_texture=t
+                break
+        if active_uv_texture and active_uv_texture.data[i]:
+            uvFace=active_uv_texture.data[i]
             if count==3:
                 return (uvFace.uv1, uvFace.uv2, uvFace.uv3)
             elif count==4:
@@ -605,8 +615,8 @@ class bone:
         bone.use_connect=True
 
     @staticmethod
-    def isConnected(b):
-        return b.connected
+    def isConnected(bone):
+        return bone.use_connect
 
     @staticmethod
     def setLayerMask(bone, layers):
@@ -630,7 +640,7 @@ class bone:
 class constraint:
     @staticmethod
     def ikChainLen(c):
-        return c.chain_length
+        return c.chain_count
 
     @staticmethod
     def ikTarget(c):
index 14bcb4a..a39df3b 100755 (executable)
@@ -85,76 +85,41 @@ try:
     print('use meshio C module')
 except ImportError:
     # full python
-    from pymeshio import englishmap
-    from pymeshio import mmd as pmd
+    from .pymeshio import englishmap
+    from .pymeshio import mmd as pmd
     pmd.IO=pmd.PMDLoader
 
-def isBlender24():
-    return sys.version_info[0]<3
-
-if isBlender24():
-    # for 2.4
-    import Blender
-    from Blender import Mathutils
-    import bpy
-
-    # wrapper
-    import bl24 as bl
-
-    def setMaterialParams(material, m):
-        # diffuse
-        material.diffuse.r=m.R
-        material.diffuse.g=m.G
-        material.diffuse.b=m.B
-        material.diffuse.a=m.alpha
-        # specular
-        material.shinness=0 if m.spec<1e-5 else m.spec*10
-        material.specular.r=m.specR
-        material.specular.g=m.specG
-        material.specular.b=m.specB
-        # ambient
-        material.ambient.r=m.mirR
-        material.ambient.g=m.mirG
-        material.ambient.b=m.mirB
-        # flag
-        material.flag=1 if m.enableSSS else 0
-
-    def toCP932(s):
-        return s
-
-
-else:
-    # for 2.5
-    import bpy
-    import mathutils
-
-    # wrapper
-    import bl25 as bl
-
-    xrange=range
-
-    def setMaterialParams(material, m):
-        # diffuse
-        material.diffuse.r=m.diffuse_color[0]
-        material.diffuse.g=m.diffuse_color[1]
-        material.diffuse.b=m.diffuse_color[2]
-        material.diffuse.a=m.alpha
-        # specular
-        material.shinness=0 if m.specular_toon_size<1e-5 else m.specular_hardness*10
-        material.specular.r=m.specular_color[0]
-        material.specular.g=m.specular_color[1]
-        material.specular.b=m.specular_color[2]
-        # ambient
-        material.ambient.r=m.mirror_color[0]
-        material.ambient.g=m.mirror_color[1]
-        material.ambient.b=m.mirror_color[2]
-        # flag
-        material.flag=1 if m.subsurface_scattering.enabled else 0
-        # toon
-        material.toon_index=7
-
-    def toCP932(s):
-        return s.encode('cp932')
+# for 2.5
+import bpy
+import mathutils
+
+# wrapper
+from . import bl25 as bl
+
+xrange=range
+
+def setMaterialParams(material, m):
+    # diffuse
+    material.diffuse.r=m.diffuse_color[0]
+    material.diffuse.g=m.diffuse_color[1]
+    material.diffuse.b=m.diffuse_color[2]
+    material.diffuse.a=m.alpha
+    # specular
+    material.shinness=0 if m.specular_toon_size<1e-5 else m.specular_hardness*10
+    material.specular.r=m.specular_color[0]
+    material.specular.g=m.specular_color[1]
+    material.specular.b=m.specular_color[2]
+    # ambient
+    material.ambient.r=m.mirror_color[0]
+    material.ambient.g=m.mirror_color[1]
+    material.ambient.b=m.mirror_color[2]
+    # flag
+    material.flag=1 if m.subsurface_scattering.use else 0
+    # toon
+    material.toon_index=7
+
+def toCP932(s):
+    return s.encode('cp932')
 
 
 class Node(object):
@@ -189,7 +154,7 @@ class VertexAttribute(object):
                 self.nx, self.ny, self.nz, self.u, self.v)
 
     def __hash__(self):
-        return self.nx + self.ny + self.nz + self.u + self.v
+        return int(100*(self.nx + self.ny + self.nz + self.u + self.v))
 
     def __eq__(self, rhs):
         return self.nx==rhs.nx and self.ny==rhs.ny and self.nz==rhs.nz and self.u==rhs.u and self.v==rhs.v
@@ -323,10 +288,7 @@ class Morph(object):
         self.offsets.append((index, offset))
 
     def sort(self):
-        if isBlender24():
-            self.offsets.sort(lambda l, r: l[0]-r[0])
-        else:
-            self.offsets.sort(key=lambda e: e[0])
+        self.offsets.sort(key=lambda e: e[0])
 
     def __str__(self):
         return "<Morph %s>" % self.name
@@ -390,20 +352,15 @@ class OneSkinMesh(object):
                     weightMap[i]=(name, w)
 
         # ToDo bone weightと関係ないvertex groupを除外する
-        if isBlender24():
-            for name in bl.object.getVertexGroupNames(obj):
-                for i, w in mesh.getVertsFromGroup(name, 1):
-                    setWeight(i, name, w)
-        else:
-            for i, v in enumerate(mesh.verts):
-                if len(v.groups)>0:
-                    for g in v.groups:
-                        setWeight(i, obj.vertex_groups[g.group].name, g.weight)
-                else:
-                    setWeight(i, obj.vertex_groups[0].name, 1)
+        for i, v in enumerate(mesh.vertices):
+            if len(v.groups)>0:
+                for g in v.groups:
+                    setWeight(i, obj.vertex_groups[g.group].name, g.weight)
+            else:
+                setWeight(i, obj.vertex_groups[0].name, 1)
 
         # 合計値が1になるようにする
-        for i in xrange(len(mesh.verts)):
+        for i in xrange(len(mesh.vertices)):
             if i in secondWeightMap:
                 secondWeightMap[i]=(secondWeightMap[i][0], 1.0-weightMap[i][1])
             elif i in weightMap:
@@ -421,7 +378,7 @@ class OneSkinMesh(object):
         for i, face in enumerate(mesh.faces):
             faceVertexCount=bl.face.getVertexCount(face)
             material=mesh.materials[bl.face.getMaterialIndex(face)]
-            v=[mesh.verts[index] for index in bl.face.getVertices(face)]
+            v=[mesh.vertices[index] for index in bl.face.getVertices(face)]
             uv=bl.mesh.getFaceUV(
                     mesh, i, face, bl.face.getVertexCount(face))
             # flip triangle
@@ -503,13 +460,10 @@ class OneSkinMesh(object):
                         )
 
     def __mesh(self, obj):
-        if isBlender24():
-            pass
-        else:
-            if RIGID_SHAPE_TYPE in obj:
-                return
-            if CONSTRAINT_A in obj:
-                return
+        if RIGID_SHAPE_TYPE in obj:
+            return
+        if CONSTRAINT_A in obj:
+            return
 
         #if not bl.modifier.hasType(obj, 'ARMATURE'):
         #    return
@@ -518,7 +472,7 @@ class OneSkinMesh(object):
 
         # メッシュのコピーを生成してオブジェクトの行列を適用する
         copyMesh, copyObj=bl.object.duplicate(obj)
-        if len(copyMesh.verts)>0:
+        if len(copyMesh.vertices)>0:
             # apply transform
             copyObj.scale=obj.scale
             bpy.ops.object.scale_apply()
@@ -593,7 +547,7 @@ class OneSkinMesh(object):
             morph=self.__getOrCreateMorph(b.name, 4)
             used=set()
             for index, src, dst in zip(
-                    xrange(len(blenderMesh.verts)),
+                    xrange(len(blenderMesh.vertices)),
                     bl.shapekey.get(basis),
                     bl.shapekey.get(b)):
                 offset=[dst[0]-src[0], dst[1]-src[1], dst[2]-src[2]]
@@ -616,21 +570,14 @@ class OneSkinMesh(object):
                     return i
             print(morph)
             return len(englishmap.skinMap)
-        if isBlender24():
-            self.morphList.sort(lambda l, r: getIndex(l)-getIndex(r))
-        else:
-            self.morphList.sort(key=getIndex)
+        self.morphList.sort(key=getIndex)
 
     def __rigidbody(self, obj):
-        if isBlender24():
-            return
         if not RIGID_SHAPE_TYPE in obj:
             return
         self.rigidbodies.append(obj)
 
     def __constraint(self, obj):
-        if isBlender24():
-            return
         if not CONSTRAINT_A in obj:
             return
         self.constraints.append(obj)
@@ -763,10 +710,7 @@ class BoneBuilder(object):
                 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)
+        self.ik_list.sort(key=getIndex)
 
     def __assignBoneGroup(self, poseBone, boneGroup):
         if boneGroup:
@@ -795,10 +739,7 @@ class BoneBuilder(object):
             print(bone)
             return len(boneMap)
 
-        if isBlender24():
-            self.bones.sort(lambda l, r: getIndex(l)-getIndex(r))
-        else:
-            self.bones.sort(key=getIndex)
+        self.bones.sort(key=getIndex)
 
         sortMap={}
         for i, b in enumerate(self.bones):
@@ -1197,8 +1138,7 @@ class PmdExporter(object):
         return io.write(path)
 
 
-def _execute(filename):
-    bl.initialize('pmd_export', scene)
+def _execute(filepath=''):
     active=bl.object.getActive()
     if not active:
         print("abort. no active object.")
@@ -1206,8 +1146,7 @@ def _execute(filename):
     exporter=PmdExporter()
     exporter.setup()
     print(exporter)
-    exporter.write(filename)
+    exporter.write(filepath)
     bl.object.activate(active)
-    bl.finalize()
 
 
index 96a17f8..b94f053 100755 (executable)
@@ -621,7 +621,7 @@ def create_bone_weight(scene, mqo, armature_object, objects):
         mesh.update()\r
 \r
 \r
-def __execute(filename, scene, scale=0.1):\r
+def _execute(filename, scene, scale=0.1):\r
     # parse file\r
     io=mqo.IO()\r
     if not io.read(filename):\r