OSDN Git Service

fix bone group name.
[meshio/meshio.git] / swig / blender / mqo_export.py
index ddc7e57..9b87a10 100644 (file)
@@ -20,12 +20,9 @@ Run this script from "File->Export" menu.
 0.1 20080128:\r
 0.2 20100518: refactoring.\r
 0.3 20100606: integrate 2.4 and 2.5.\r
+0.4 20100626: refactoring.\r
 """\r
 \r
-\r
-###############################################################################\r
-# import\r
-###############################################################################\r
 import os\r
 import sys\r
 \r
@@ -41,6 +38,10 @@ if isBlender24():
     # wrapper\r
     import bl24 as bl\r
 \r
+    def materialToMqo(m):\r
+        return "\"%s\" shader(3) col(%f %f %f %f)" % (\r
+                m.name, m.rgbCol[0], m.rgbCol[1], m.rgbCol[2], m.alpha)\r
+\r
 else:\r
     # for 2.5\r
     import bpy\r
@@ -49,6 +50,12 @@ else:
     # wrapper\r
     import bl25 as bl\r
 \r
+    def materialToMqo(m):\r
+        return "\"%s\" shader(3) col(%f %f %f %f)" % (\r
+                m.name, \r
+                m.diffuse_color[0], m.diffuse_color[1], m.diffuse_color[2], \r
+                m.alpha)\r
+\r
 def apply_transform(vec, matrix):\r
     x, y, z = vec\r
     xloc, yloc, zloc = matrix[3][0], matrix[3][1], matrix[3][2]\r
@@ -87,7 +94,6 @@ class MqoExporter(object):
         self.objects=[]\r
         self.materials=[]\r
         self.scale=scale\r
-        print('scaling', self.scale)\r
 \r
     def setup(self, scene):\r
         # 木構造を構築する\r
@@ -128,7 +134,7 @@ class MqoExporter(object):
         self.materials.append(material)\r
         return index\r
 \r
-    def write(self, path, scene):\r
+    def write(self, path):\r
         io=bl.Writer(path, 'cp932')\r
         self.__write_header(io)\r
         self.__write_scene(io)\r
@@ -136,7 +142,7 @@ class MqoExporter(object):
         self.__write_materials(io, os.path.dirname(path))\r
         print("Writing ObjectChunk")\r
         for info in self.objects:\r
-            self.__write_object(io, info, scene)\r
+            self.__write_object(io, info)\r
         io.write("Eof\r\n")\r
         io.flush()\r
         io.close()\r
@@ -155,47 +161,55 @@ class MqoExporter(object):
         # each material    \r
         io.write("Material %d {\r\n" % (len(self.materials)))\r
         for m in self.materials:\r
-            tex, aplane=bl.getTexture(m, dirname)\r
-            if len(tex):\r
-                # textureがある場合は下地を白に\r
-                io.write("\"%s\" shader(3) col(1 1 1 1)" % m.name)\r
-            else:\r
-                # 無い場合はそのまま\r
-                io.write(bl.materialToMqo(m))\r
-            io.write(tex)\r
-            io.write(aplane)\r
+            io.write(materialToMqo(m))\r
+            # ToDo separated alpha texture\r
+            for filename in bl.material.eachTexturePath(m):\r
+                if len(dirname)>0 and filename.startswith(dirname):\r
+                    # 相対パスに変換する\r
+                    filename=filename[len(dirname)+1:]\r
+                io.write(" tex(\"%s\")" % filename)\r
+                break\r
             io.write("\r\n") \r
         # end of chunk\r
         io.write("}\r\n") \r
 \r
-    def __write_object(self, io, info, scene):\r
+    def __write_object(self, io, info):\r
         print(info)\r
 \r
         obj=info.object\r
-        if obj.type.upper()!='MESH':\r
+        if obj.type.upper()=='MESH' or obj.type.upper()=='EMPTY':\r
+            pass\r
+        else:\r
+            print(obj.type)\r
             return\r
 \r
-        # duplicate and applyMatrix\r
-        mesh, dumy=bl.objectDuplicate(scene, obj)\r
-\r
-        ############################################################\r
-        # write\r
-        ############################################################\r
         io.write("Object \""+obj.name+"\" {\r\n")\r
 \r
         # depth\r
         io.write("\tdepth %d\r\n" % info.depth)\r
 \r
-        # mirroring                \r
-        isMirrorring=False\r
-        for mod in obj.modifiers:\r
-                if mod.name.upper()=="MIRROR":\r
-                        isMirrorring=True\r
-                        break\r
-        if isMirrorring:\r
+        # mirror\r
+        if bl.modifier.hasType(obj, 'MIRROR'):\r
                 io.write("\tmirror 1\r\n")\r
                 io.write("\tmirror_axis 1\r\n")\r
 \r
+        if obj.type.upper()=='MESH':\r
+            # duplicate and applyMatrix\r
+            copyMesh, copyObj=bl.object.duplicate(obj)\r
+            # apply transform\r
+            copyObj.scale=obj.scale\r
+            bpy.ops.object.scale_apply()\r
+            copyObj.rotation_euler=obj.rotation_euler\r
+            bpy.ops.object.rotation_apply()\r
+            copyObj.location=obj.location\r
+            bpy.ops.object.location_apply()\r
+            # write mesh\r
+            self.__write_mesh(io, copyMesh, info.material_map)\r
+            bl.object.delete(copyObj)\r
+\r
+        io.write("}\r\n") # end of object\r
+\r
+    def __write_mesh(self, io, mesh, material_map):\r
         # vertices\r
         io.write("\tvertex %d {\r\n" % len(mesh.verts))\r
         for vert in mesh.verts:\r
@@ -207,63 +221,46 @@ class MqoExporter(object):
         # faces\r
         io.write("\tface %d {\r\n" % len(mesh.faces))\r
         for i, face in enumerate(mesh.faces):\r
-            count=bl.faceVertexCount(face)\r
+            count=bl.face.getVertexCount(face)\r
             # V\r
             io.write("\t\t%d V(" % count)\r
-            face_list=[]\r
-            for j in bl.faceVertices(face):\r
-                face_list.insert(0, j)\r
-            # flip face\r
-            for j in face_list:\r
+            for j in reversed(bl.face.getVertices(face)):\r
                 io.write("%d " % j)\r
             io.write(")")\r
             # mat\r
             if len(mesh.materials):\r
                 io.write(" M(%d)" % \r
-                        info.material_map[bl.faceMaterialIndex(face)])\r
+                        material_map[bl.face.getMaterialIndex(face)])\r
             # UV\r
-            if bl.meshHasUV(mesh) and bl.faceHasUV(mesh, i, face):\r
+            if bl.mesh.hasUV(mesh) and bl.mesh.hasFaceUV(mesh, i, face):\r
                 io.write(" UV(")\r
-                uv_list=[]\r
-                for uv in bl.faceGetUV(mesh, i, face, count):\r
+                for uv in reversed(bl.mesh.getFaceUV(mesh, i, face, count)):\r
                     # reverse vertical value\r
-                    uv_list.insert(0, uv)\r
-                # flip face\r
-                for uv in uv_list:\r
                     io.write("%f %f " % (uv[0], 1.0-uv[1])) \r
                 io.write(")")\r
             io.write("\r\n")\r
         io.write("\t}\r\n") # end of faces\r
-        io.write("}\r\n") # end of object\r
-        ############################################################\r
-\r
-        # 削除する\r
-        scene.objects.unlink(dumy)\r
 \r
 \r
 def __execute(filename, scene, scale=10):\r
+    if not scene.objects.active:\r
+        bl.message('no active object !')\r
+        return\r
+\r
     exporter=MqoExporter(scale)\r
     exporter.setup(scene)\r
-    exporter.write(filename, scene)\r
+    exporter.write(filename)\r
 \r
 \r
 if isBlender24():\r
     # for 2.4\r
     def execute_24(filename):\r
-        """\r
-        export mqo.\r
-        """\r
-        filename=filename.decode(bl.INTERNAL_ENCODING)\r
-        print("mqo exporter: %s" % filename)\r
-\r
-        Blender.Window.WaitCursor(1) \r
-        t = Blender.sys.time() \r
-\r
-        __execute(filename, Blender.Scene.GetCurrent())\r
-\r
-        print('finished in %.2f seconds' % (Blender.sys.time()-t) )\r
-        Blender.Redraw()\r
-        Blender.Window.WaitCursor(0) \r
+        scene=Blender.Scene.GetCurrent()\r
+        bl.initialize('mqo_export', scene)\r
+        __execute(\r
+                filename.decode(bl.INTERNAL_ENCODING), \r
+                scene)\r
+        bl.finalize()\r
 \r
     # execute\r
     Blender.Window.FileSelector(\r
@@ -273,8 +270,10 @@ if isBlender24():
 \r
 else:\r
     # for 2.5\r
-    def execute_25(*args):\r
-        __execute(*args)\r
+    def execute_25(path, scene, scale):\r
+        bl.initialize('mqo_export', scene)\r
+        __execute(path, scene, scale)\r
+        bl.finalize()\r
 \r
     # operator\r
     class EXPORT_OT_mqo(bpy.types.Operator):\r
@@ -302,7 +301,7 @@ else:
                 name="Scale", \r
                 description="Scale the MQO by this value", \r
                 min=0.0001, max=1000000.0, \r
-                soft_min=0.001, soft_max=100.0, default=100.0)\r
+                soft_min=0.001, soft_max=100.0, default=10.0)\r
 \r
         check_existing = BoolProperty(\r
                 name="Check Existing",\r