OSDN Git Service

implement createMaterials.
[meshio/meshio.git] / swig / blender / mqo_import.py
index 13d2aac..038ddf0 100644 (file)
@@ -22,6 +22,8 @@ This script imports a mqo into Blender for editing.
 0.6 20100505: C extension.\r
 0.7 20100606: integrate 2.4 and 2.5.\r
 '''\r
+\r
+\r
 ###############################################################################\r
 # import\r
 ###############################################################################\r
@@ -41,73 +43,25 @@ if isBlender24():
     from Blender import Mathutils\r
     import bpy\r
 \r
-    # ファイルシステムの文字コード\r
-    # 改造版との共用のため\r
-    FS_ENCODING=sys.getfilesystemencoding()\r
-    if os.path.exists(os.path.dirname(sys.argv[0])+"/utf8"):\r
-        INTERNAL_ENCODING='utf-8'\r
-    else:\r
-        INTERNAL_ENCODING=FS_ENCODING\r
+    # wrapper\r
+    import bl24 as bl\r
 else:\r
     # for 2.5\r
     import bpy\r
     from bpy.props import *\r
 \r
+    # wrapper\r
+    import bl25 as bl\r
+\r
 \r
 ###############################################################################\r
 # implement\r
 ###############################################################################\r
-if isBlender24():\r
-    def has_mikoto(mqo):\r
-        return False\r
-\r
-\r
-    def create_materials(scene, mqo, directory):\r
-        """\r
-        create blender materials and renturn material list.\r
-        """\r
-        materials = []\r
-        images = []\r
-        for m in mqo.materials:\r
-            material = Blender.Material.New(m.getName().encode(INTERNAL_ENCODING))\r
-            materials.append(material)\r
+def has_mikoto(mqo):\r
+    return False\r
 \r
-            material.mode |= Blender.Material.Modes.SHADELESS\r
-            material.rgbCol = [m.color.r, m.color.g, m.color.b]\r
-            material.alpha = m.color.a\r
-            material.amb = m.ambient\r
-            material.spec = m.specular\r
-            material.hard = int(255 * m.power)\r
-            if m.texture!="":\r
-                texture_path=m.getTexture()\r
-\r
-                # load texture image\r
-                if os.path.isabs(texture_path):\r
-                    # absolute\r
-                    path = texture_path\r
-                else:\r
-                    # relative\r
-                    path = os.path.join(directory, texture_path)\r
-\r
-                # backslash to slash\r
-                #path = path.replace('\\', '/')\r
-\r
-                # texture\r
-                if os.path.exists(path):\r
-                    image = Blender.Image.Load(path.encode(INTERNAL_ENCODING))\r
-                    images.append(image)\r
-                    material.mode = material.mode | Blender.Material.Modes.TEXFACE\r
-                    tex = Blender.Texture.New(path.encode(INTERNAL_ENCODING))\r
-                    tex.type = Blender.Texture.Types.IMAGE\r
-                    tex.image = image\r
-                    material.setTexture(0, tex, Blender.Texture.TexCo.UV)\r
-                else:\r
-                    print("%s not exits" % path)\r
-                \r
-        return materials\r
-\r
-\r
-    def create_objects(scene, root, mqo, materials):\r
+if isBlender24():\r
+    def create_objects(scene, mqo, root, materials, imageMap=None, scale=None):\r
         """\r
         create blender mesh objects.\r
         """\r
@@ -597,96 +551,9 @@ if isBlender24():
             mesh.update()\r
         \r
 \r
-    def execute_24(filename):\r
-        """\r
-        import a mqo file.\r
-        """\r
-        filename=filename.decode(INTERNAL_ENCODING)\r
-        print("##start mqo_import.py##")\r
-        print(INTERNAL_ENCODING, FS_ENCODING)\r
-        print("parse mqo file: %s" % (filename))\r
-\r
-        Blender.Window.WaitCursor(1) \r
-        t = Blender.sys.time() \r
-\r
-        # parse file\r
-        io=mqo.IO()\r
-        \r
-        if not io.read(filename):\r
-            return\r
-\r
-        # get active scene\r
-        scene = Blender.Scene.GetCurrent()\r
-\r
-        # create materials\r
-        materials=create_materials(scene, io, os.path.dirname(filename))\r
-     \r
-        # create objects\r
-        root=scene.objects.new("Empty")\r
-        root.setName(os.path.basename(filename))\r
-        objects=create_objects(scene, root, io, materials)\r
-\r
-        if has_mikoto(io):\r
-            # create mikoto bone\r
-            armature_object=create_armature(scene, io)\r
-            if armature_object:\r
-                root.makeParent([armature_object])\r
-\r
-                # create bone weight\r
-                create_bone_weight(scene, io, armature_object, objects)\r
-\r
-\r
-        print('finished in %.2f seconds' % (Blender.sys.time()-t))\r
-        print('')\r
-        Blender.Redraw()\r
-        Blender.Window.WaitCursor(0) \r
-\r
 \r
 else:\r
-    def create_texture(directory, texture_name):\r
-        texture=bpy.data.textures.new(texture_name)\r
-        texture.type='IMAGE'\r
-        texture=texture.recast_type()\r
-        #texturePath="%s/%s" % (directory, texture_name)\r
-        texturePath=os.path.join(directory, texture_name)\r
-        print('create_texture', texturePath)\r
-        image=bpy.data.images.load(texturePath)\r
-        texture.image=image\r
-        texture.mipmap = True\r
-        texture.interpolation = True\r
-        texture.use_alpha = True\r
-        return texture\r
-\r
-    def create_materials(mqo, scene, directory):\r
-        materials = []\r
-        textureMap={}\r
-        imageMap={}\r
-        if len(mqo.materials)>0:\r
-            for material_index, m in enumerate(mqo.materials):\r
-                material = bpy.data.materials.new(m.getName())\r
-                materials.append(material)\r
-                # mqo material\r
-                material.diffuse_color=[m.color.r, m.color.g, m.color.b]\r
-                material.alpha=m.color.a\r
-                material.diffuse_intensity=m.diffuse\r
-                texture_name=m.getTexture()\r
-                if texture_name!='':\r
-                    if texture_name in textureMap:\r
-                        texture=textureMap[texture_name]\r
-                    else:\r
-                        texture=create_texture(directory, texture_name)\r
-                        textureMap[texture_name]=texture\r
-                        imageMap[material_index]=texture.image\r
-                    #material.add_texture(texture, "UV", {"COLOR", "ALPHA"})\r
-                    material.add_texture(texture, "UV", "COLOR")\r
-                    # temporary\r
-                    material.emit=1.0\r
-        else:\r
-            material = bpy.data.materials.new('Default')\r
-            materials.append(material)\r
-        return materials, imageMap\r
-\r
-    def create_objects(mqo, scene, parent, materials, imageMap, scale):\r
+    def create_objects(scene, mqo, parent, materials, imageMap, scale):\r
         for o in mqo.objects:\r
 \r
             # create mesh\r
@@ -774,37 +641,108 @@ else:
 \r
             mesh.update()\r
 \r
-    def load(filename, context, scale):\r
-        """\r
-        load mqo file to context.\r
-        """\r
-        io=mqo.IO()\r
-        if not io.read(filename):\r
-            print("fail to load",filename)\r
-            return\r
 \r
-        scene=context.scene\r
+def __createMaterials(scene, mqo, directory):\r
+    """\r
+    create blender materials and renturn material list.\r
+    """\r
+    materials = []\r
+    textureMap={}\r
+    imageMap={}\r
+    if len(mqo.materials)>0:\r
+        for material_index, m in enumerate(mqo.materials):\r
+            # material\r
+            material=bl.createMaterial(m)\r
+            materials.append(material)\r
+            # texture\r
+            texture_name=m.getTexture()\r
+            if texture_name!='':\r
+                if texture_name in textureMap:\r
+                    texture=textureMap[texture_name]\r
+                else:\r
+                    # load texture image\r
+                    if os.path.isabs(texture_name):\r
+                        # absolute\r
+                        path = texture_name\r
+                    else:\r
+                        # relative\r
+                        path = os.path.join(directory, texture_name)\r
+                    # texture\r
+                    if os.path.exists(path):\r
+                        print("create texture:", path)\r
+                        texture, image=bl.createTexture(path)\r
+                        textureMap[texture_name]=texture\r
+                        imageMap[material_index]=image\r
+                    else:\r
+                        print("%s not exits" % path)\r
+                        continue\r
+                bl.materialAddTexture(material, texture)\r
+    else:\r
+        # default material\r
+        pass\r
+    return materials, imageMap\r
+\r
 \r
-        # create material\r
-        materials, imageMap=create_materials(\r
-                io, scene, os.path.dirname(filename))\r
+def __execute(filename, scene, scale=1.0):\r
+    # parse file\r
+    io=mqo.IO()\r
+    if not io.read(filename):\r
+        print("fail to load",filename)\r
+        return\r
 \r
-        # create group\r
-        empty=bpy.data.objects.new(os.path.basename(filename), None)\r
-        scene.objects.link(empty)\r
+    # create materials\r
+    materials, imageMap=__createMaterials(scene, io, os.path.dirname(filename))\r
 \r
-        # create mesh\r
-        create_objects(io, scene, empty, materials, imageMap, scale)\r
\r
+    # create objects\r
+    root=bl.createEmptyObject(scene, os.path.basename(filename))\r
+    objects=create_objects(scene, io, root, materials, imageMap, scale)\r
+\r
+    if has_mikoto(io):\r
+        # create mikoto bone\r
+        armature_object=create_armature(scene, io)\r
+        if armature_object:\r
+            root.makeParent([armature_object])\r
+\r
+            # create bone weight\r
+            create_bone_weight(scene, io, armature_object, objects)\r
 \r
\r
 ###############################################################################\r
 # register\r
 ###############################################################################\r
 if isBlender24():\r
+    def execute_24(filename):\r
+        """\r
+        import a mqo file.\r
+        """\r
+        filename=filename.decode(bl.INTERNAL_ENCODING)\r
+        print("##start mqo_import.py##")\r
+        print(bl.INTERNAL_ENCODING, bl.FS_ENCODING)\r
+        print("parse mqo file: %s" % (filename))\r
+\r
+        Blender.Window.WaitCursor(1) \r
+        t = Blender.sys.time() \r
+\r
+        # execute\r
+        scene = Blender.Scene.GetCurrent()\r
+        __execute(filename, scene)\r
+        scene.update(0)\r
+\r
+        print('finished in %.2f seconds' % (Blender.sys.time()-t))\r
+        print('')\r
+        Blender.Redraw()\r
+        Blender.Window.WaitCursor(0) \r
+\r
     # for 2.4\r
     # execute\r
     Blender.Window.FileSelector(execute_24, 'Import MQO', '*.mqo')\r
 else:\r
+    def execute_25(filename, context, scale):\r
+        """\r
+        import a mqo file.\r
+        """\r
+        __execute(filename, context.scene, scale)\r
+\r
     # for 2.5\r
     # import operator\r
     class IMPORT_OT_mqo(bpy.types.Operator):\r
@@ -833,7 +771,7 @@ else:
                 soft_min=0.001, soft_max=100.0, default=1.0)\r
 \r
         def execute(self, context):\r
-            load(self.properties.path, context, self.properties.scale)\r
+            execute_25(self.properties.path, context, self.properties.scale)\r
             return 'FINISHED'\r
 \r
         def invoke(self, context, event):\r