OSDN Git Service

fix bone connection.
[meshio/meshio.git] / swig / blender / mqo_export.py
index 55a3668..1c5b1f2 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,29 +161,28 @@ 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
@@ -186,84 +191,70 @@ class MqoExporter(object):
         # 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
+        if bl.modifier.hasType(obj, 'MIRROR'):\r
                 io.write("\tmirror 1\r\n")\r
                 io.write("\tmirror_axis 1\r\n")\r
 \r
-        # vertices\r
-        io.write("\tvertex %d {\r\n" % len(mesh.verts))\r
-        for vert in mesh.verts:\r
-            x, y, z = convert_to_mqo(vert.co)\r
-            io.write("\t\t%f %f %f\r\n" % \r
-                    (x*self.scale, y*self.scale, z*self.scale)) # rotate to y-up\r
-        io.write("\t}\r\n")\r
-\r
-        # 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
-            # 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
-                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
-            # UV\r
-            if bl.meshHasUV(mesh) and bl.faceHasUV(mesh, i, face):\r
-                io.write(" UV(")\r
-                uv_list=[]\r
-                for uv in bl.faceGetUV(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
+        if obj.type.upper()=='MESH':\r
+            # duplicate and applyMatrix\r
+            mesh, dumy=bl.object.duplicate(obj)\r
+\r
+            # vertices\r
+            io.write("\tvertex %d {\r\n" % len(mesh.verts))\r
+            for vert in mesh.verts:\r
+                x, y, z = convert_to_mqo(vert.co)\r
+                io.write("\t\t%f %f %f\r\n" % \r
+                        (x*self.scale, y*self.scale, z*self.scale)) # rotate to y-up\r
+            io.write("\t}\r\n")\r
+\r
+            # faces\r
+            io.write("\tface %d {\r\n" % len(mesh.faces))\r
+            for i, face in enumerate(mesh.faces):\r
+                count=bl.face.getVertexCount(face)\r
+                # V\r
+                io.write("\t\t%d V(" % count)\r
+                for j in reversed(bl.face.getVertices(face)):\r
+                    io.write("%d " % j)\r
                 io.write(")")\r
-            io.write("\r\n")\r
-        io.write("\t}\r\n") # end of faces\r
+                # mat\r
+                if len(mesh.materials):\r
+                    io.write(" M(%d)" % \r
+                            info.material_map[bl.face.getMaterialIndex(face)])\r
+                # UV\r
+                if bl.mesh.hasUV(mesh) and bl.mesh.hasFaceUV(mesh, i, face):\r
+                    io.write(" UV(")\r
+                    for uv in reversed(bl.mesh.getFaceUV(mesh, i, face, count)):\r
+                        # reverse vertical value\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
+\r
+            # 削除する\r
+            bl.object.delete(dumy)\r
+\r
         io.write("}\r\n") # end of object\r
-        ############################################################\r
 \r
-        # 削除する\r
-        scene.objects.unlink(dumy)\r
 \r
+def __execute(filename, scene, scale=10):\r
+    if not scene.objects.active:\r
+        bl.message('no active object !')\r
+        return\r
 \r
-def __execute(filename, scene, scale):\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(), 1.0)\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 +264,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 +295,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