OSDN Git Service

fix blender24 scripts.
authorousttrue <ousttrue@gmail.com>
Fri, 14 May 2010 20:56:31 +0000 (05:56 +0900)
committerousttrue <ousttrue@gmail.com>
Fri, 14 May 2010 20:56:31 +0000 (05:56 +0900)
blender24/mqo_import.py
blender24/pmd_import.py
blender24/vmd_import.py
blender25/import_scene_mqo.py
include/mqo.h
include/vmd.h
src/vmd.cpp
swig/englishmap.py
swig/setup.py

index a68e096..d1ad069 100644 (file)
@@ -36,15 +36,11 @@ import meshio.mqo
 \r
 # ファイルシステムの文字コード\r
 # 改造版との共用のため\r
+FS_ENCODING=sys.getfilesystemencoding()\r
 if os.path.exists(os.path.dirname(sys.argv[0])+"/utf8"):\r
-    FS_ENCODING='utf-8'\r
+    INTERNAL_ENCODING='utf-8'\r
 else:\r
-    FS_ENCODING=sys.getfilesystemencoding()\r
-print FS_ENCODING\r
-\r
-\r
-def cp932_to_utf8(cp932):\r
-    return str(cp932).decode('cp932').encode('utf-8')\r
+    INTERNAL_ENCODING=FS_ENCODING\r
 \r
 \r
 def has_mikoto(mqo):\r
@@ -58,17 +54,17 @@ def create_materials(scene, mqo, directory):
     materials = []\r
     images = []\r
     for m in mqo.materials:\r
-        material = Blender.Material.New(cp932_to_utf8(m.name))\r
+        material = Blender.Material.New(m.getName())\r
         materials.append(material)\r
 \r
         material.mode |= Blender.Material.Modes.SHADELESS\r
-        material.rgbCol = (m.color.r, m.color.g, m.color.b)\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=cp932_to_utf8(m.texture)\r
+            texture_path=m.getTexture()\r
 \r
             # load texture image\r
             if os.path.isabs(texture_path):\r
@@ -79,17 +75,19 @@ def create_materials(scene, mqo, directory):
                 path = os.path.join(directory, texture_path)\r
 \r
             # backslash to slash\r
-            path = path.replace('\\', '/')\r
+            #path = path.replace('\\', '/')\r
 \r
             # texture\r
-            if os.path.exists(path.encode(FS_ENCODING)):\r
-                image = Blender.Image.Load(path)\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)\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
@@ -110,6 +108,7 @@ def create_objects(scene, root, mqo, materials):
 \r
         # add hierarchy\r
         stack_depth=len(stack)-1\r
+        print(o.depth, stack_depth)\r
         if o.depth<stack_depth:\r
             for i in range(stack_depth-o.depth):\r
                 stack.pop()\r
@@ -171,7 +170,12 @@ def create_objects(scene, root, mqo, materials):
                     f.getUV(i).x, \r
                     1.0-f.getUV(i).y)\r
                     )\r
-            face.uv=uv_array\r
+            try:\r
+                face.uv=uv_array\r
+            except Exception, msg:\r
+                #print msg\r
+                #print face.index, uv_array\r
+                pass\r
         \r
             if f.material_index in usedMaterials:\r
                 face.mat = usedMaterials[f.material_index]\r
@@ -582,8 +586,9 @@ def import_mqo(filename):
     """\r
     import a mqo file.\r
     """\r
-    filename=filename.decode(FS_ENCODING)\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
@@ -592,7 +597,7 @@ def import_mqo(filename):
     # parse file\r
     mqo=meshio.mqo.IO()\r
     \r
-    if not mqo.read(filename.encode(FS_ENCODING)):\r
+    if not mqo.read(filename):\r
         return\r
 \r
     # get active scene\r
@@ -603,7 +608,7 @@ def import_mqo(filename):
  \r
     # create objects\r
     root=scene.objects.new("Empty")\r
-    root.setName(os.path.basename(filename).encode('utf8'))\r
+    root.setName(os.path.basename(filename))\r
     objects=create_objects(scene, root, mqo, materials)\r
 \r
     if has_mikoto(mqo):\r
index 221041c..af5a9c3 100644 (file)
@@ -29,15 +29,11 @@ import sys
 from meshio import pmd, englishmap
 
 
+FS_ENCODING=sys.getfilesystemencoding()
 if os.path.exists(os.path.dirname(sys.argv[0])+"/utf8"):
-    FS_ENCODING='utf-8'
+    INTERNAL_ENCODING='utf-8'
 else:
-    FS_ENCODING=sys.getfilesystemencoding()
-print FS_ENCODING
-
-
-def cp932_to_utf8(cp932):
-    return str(cp932).decode('cp932').encode('utf-8')
+    INTERNAL_ENCODING=FS_ENCODING
 
 
 class ProgressBar(object):
@@ -59,7 +55,7 @@ class ProgressBar(object):
         print message
         message="%s: %s" % (self.base, message)
         if message.__class__ is unicode:
-            message=message.encode('utf-8')
+            message=message.encode(INTERNAL_ENCODING)
         Blender.Window.DrawProgressBar(self.progress, message)
 
     def finish(self):
@@ -96,8 +92,8 @@ def convert_uv(uv):
 
 
 def get_bone_name(l, index):
-    name=englishmap.getEnglishBoneName(l.bones[index].name.decode('cp932'))
-    return name if name else cp932_to_utf8(l.bones[index].name)
+    name=englishmap.getEnglishBoneName(l.bones[index].getName())
+    return name if name else l.bones[index].getName().encode(INTERNAL_ENCODING)
 
 
 def createMaterial():
@@ -219,14 +215,13 @@ def import16MaerialAndMesh(mesh, l,
         material.setSpecCol([m.specular.r, m.specular.g, m.specular.b])
         material.setMirCol([m.ambient.r, m.ambient.g, m.ambient.b])
         # set texture
-        if m.texture!='':
-            if not tex_dir.endswith("\\") and not tex_dir.endswith("/"):
-                tex_dir+="/"
-            tex_path = tex_dir+m.texture
+        if m.getTexture()!='':
+            tex_path = os.path.join(tex_dir, m.getTexture()).encode(
+                    INTERNAL_ENCODING)
             tex = Blender.Texture.New()
             tex.setType("Image")
             try:
-                tex.image = Blender.Image.Load(cp932_to_utf8(tex_path))
+                tex.image = Blender.Image.Load(tex_path)
                 material.setTexture(0, tex)
                 material.getTextures()[0].texco = Blender.Texture.TexCo.UV
             except IOError:
@@ -336,8 +331,9 @@ def build_bone(armature, b, parent=None):
         return
 
     bone = Blender.Armature.Editbone()
-    name=englishmap.getEnglishBoneName(b.name.decode('cp932'))
-    bone.name = name if name else cp932_to_utf8(b.name)
+    name=englishmap.getEnglishBoneName(b.getName())
+    bone.name = name if name else b.getName().encode(
+            INTERNAL_ENCODING)
     armature.bones[bone.name] = bone
     if parent:
         bone.head = Mathutils.Vector(*convert_coord(b.pos))
@@ -395,7 +391,7 @@ def importArmature(scene, l):
         # IKtarget->parent(=IK).name
         target=l.bones[ik.target]
         parent=l.bones[target.parent_index]
-        name = englishmap.getEnglishBoneName(parent.name.decode('cp932'))
+        name = englishmap.getEnglishBoneName(parent.getName())
         p_bone = pose.bones[name]
         if not p_bone:
             print 'not found', name
@@ -407,7 +403,7 @@ def importArmature(scene, l):
         ik_const[cSetting.CHAINLEN] = len(ik.children)
         ik_const[cSetting.TARGET] = armature_object
         ik_const[cSetting.BONE] = englishmap.getEnglishBoneName(
-                l.bones[ik.index].name.decode('cp932'))
+                l.bones[ik.index].getName())
         lrot_const = p_bone.constraints.append(Blender.Constraint.Type.LIMITROT)
         lrot_const.influence = ik.weight
         lrot_const[cSetting.OWNERSPACE] = cSetting.SPACE_LOCAL
@@ -443,9 +439,9 @@ def importShape(mesh, l, vertex_map):
     for s in l.morph_list:
         if s.name==base.name:
             continue
-        name=englishmap.getEnglishSkinName(s.name.decode('cp932'))
+        name=englishmap.getEnglishSkinName(s.getName())
         if not name:
-            name=cp932_to_utf8(s.name)
+            name=s.getName().encode(INTERNAL_ENCODING)
         for index, offset in zip(s.indices, s.pos_list):
             try:
                 vertex_index=vertex_map[base.indices[index]]
@@ -486,11 +482,12 @@ def run(filename):
     """
     @param filename
     """
-    filename=filename.decode(FS_ENCODING)
+    filename=filename.decode(INTERNAL_ENCODING)
     tex_dir=os.path.dirname(filename)
 
     # progress
     progress_start('pmd_import')
+    print(INTERNAL_ENCODING, FS_ENCODING)
 
     # load pmd
     progress_set('load %s' % filename, 0.0)
@@ -499,7 +496,7 @@ def run(filename):
     locale.setlocale(locale.LC_ALL, '')
 
     l=pmd.IO()
-    if not l.read(filename.encode('cp932')):
+    if not l.read(filename):
         print "fail to load %s" % filename
         return
     progress_set('loaded %s' % filename, 0.1)
index ff5be8d..17badd9 100644 (file)
@@ -30,11 +30,11 @@ import math
 from meshio import vmd, englishmap
 
 
+FS_ENCODING=sys.getfilesystemencoding()
 if os.path.exists(os.path.dirname(sys.argv[0])+"/utf8"):
-    FS_ENCODING='utf-8'
+    INTERNAL_ENCODING='utf-8'
 else:
-    FS_ENCODING=sys.getfilesystemencoding()
-print FS_ENCODING
+    INTERNAL_ENCODING=FS_ENCODING
 
 
 class ProgressBar(object):
@@ -56,7 +56,7 @@ class ProgressBar(object):
         print message
         message="%s: %s" % (self.base, message)
         if message.__class__ is unicode:
-            message=message.encode('utf-8')
+            message=message.encode(INTERNAL_ENCODING)
         Blender.Window.DrawProgressBar(self.progress, message)
 
     def finish(self):
@@ -244,15 +244,16 @@ def import_shape_key(l, mesh, progressCount):
 
 
 def run(filename):
-    filename=filename.decode(FS_ENCODING)
+    filename=filename.decode(INTERNAL_ENCODING)
 
     # progress
     progress_start('vmd_import')
+    print(INTERNAL_ENCODING, FS_ENCODING)
 
     # load vmd
     progress_set('load %s' % filename, 0.0)
     l=vmd.IO()
-    if not l.read(filename.encode('cp932')):
+    if not l.read(filename.encode(FS_ENCODING)):
         print "failt to load", filename
         return
     progress_set('loaded %s' % filename, 1.0)
index 1dbb663..2e45256 100644 (file)
@@ -23,7 +23,8 @@ def create_texture(directory, texture_name):
     texture=bpy.data.textures.new(texture_name)
     texture.type='IMAGE'
     texture=texture.recast_type()
-    texturePath="%s/%s" % (directory, texture_name)
+    #texturePath="%s/%s" % (directory, texture_name)
+    texturePath=os.path.join(directory, texture_name)
     print('create_texture', texturePath)
     image=bpy.data.images.load(texturePath)
     texture.image=image
index e3b148c..6664694 100644 (file)
@@ -219,7 +219,8 @@ struct Object
        std::vector<Face> faces;
 
        Object()
-               : mirror(0)
+               : depth(0), folding(0), visible(1), locking(0), shading(0), 
+               smoothing(60.0f), color_type(0), mirror(0)
        {}
 
        std::wstring getName()const;
index 336cc41..abe11d6 100755 (executable)
@@ -183,6 +183,7 @@ struct IO
        IO();
        ~IO();
        bool read(binary::IReader &reader);
+       bool read(const wchar_t *path);
        bool read(const char *path);
        bool write(std::ostream &os);
 
index 004d46d..b93b72b 100755 (executable)
@@ -169,6 +169,17 @@ bool IO::read(binary::IReader &reader)
        return Implementation(*this, reader).parse();
 }
 
+bool IO::read(const wchar_t *path)
+{
+       std::vector<char> all;
+       binary::readAll(path, all);
+       if(all.empty()){
+               return false;
+       }
+       binary::MemoryReader reader(&all[0], all.size());
+       return read(reader);
+}
+
 bool IO::read(const char *path)
 {
        std::vector<char> all;
index d6b3a6a..393ebfe 100644 (file)
@@ -1,5 +1,6 @@
 #!/usr/bin/env python
 # coding: utf8
+import sys
 
 ###############################################################################
 # 日本語名との変換マップ
@@ -190,3 +191,12 @@ def getEnglishSkinName(name):
         if v==name:
             return k
 
+if sys.version_info[0]<3:
+    print('convert boneMap and skinMap to unicode')
+    # python2.x
+    # unicodeに変換
+    for k in boneMap.keys():
+        boneMap[k]=boneMap[k].decode('utf-8')
+    for k in skinMap.keys():
+        skinMap[k]=skinMap[k].decode('utf-8')
+
index 8111c64..012cf18 100644 (file)
@@ -1,76 +1,48 @@
-# setup.py
+# coding: utf-8
 
 from distutils.core import setup, Extension
+import os
 
-# mqo
-###############################################################################
-mqoExtension=Extension("_mqo",
-        ["mqo.i"],
-        swig_opts=['-c++'],
-        include_dirs=[
+option={
+        'swig_opts': ['-c++'],
+        'include_dirs': [
             '../include'
             ],
-        libraries=[
+        'libraries': [
             'meshio',
             ],
-        library_dirs=[
+        'library_dirs': [
             '../release',
-            'T:/Blender/bf-blender/lib/windows/python/lib',
             ],
-        extra_compile_args=[
-            '/EHsc', '/MT', '/D_WIN32',
-            ],
-        extra_link_args=[
-            ],
-        )
+        }
 
-# pmd
-###############################################################################
-pmdExtension=Extension("_pmd",
-        ["pmd.i"],
-        swig_opts=['-c++'],
-        include_dirs=[
-            '../include'
-            ],
-        libraries=[
-            'meshio',
-            ],
-        library_dirs=[
-            '../release',
-            ],
-        extra_compile_args=[
-            '/EHsc', '/MT', '/D_WIN32',
-            ],
-        extra_link_args=[
-            ],
-        )
-
-# vmd
-###############################################################################
-vmdExtension=Extension("_vmd",
-        ["vmd.i"],
-        swig_opts=['-c++'],
-        include_dirs=[
-            '../include'
-            ],
-        libraries=[
-            'meshio',
-            ],
-        library_dirs=[
-            '../release',
-            ],
-        extra_compile_args=[
-            '/EHsc', '/MT', '/D_WIN32',
-            ],
-        extra_link_args=[
-            ],
-        )
+if os.name=='nt':
+    option['extra_compile_args']=[
+            '/EHsc', '/MT',
+            ]
 
+ext_modules=[
+        Extension("_mqo", ["mqo.i"], **option),
+        Extension("_pmd", ["pmd.i"], **option),
+        Extension("_vmd", ["vmd.i"], **option),
+        ]
 
-setup(name="meshio",
-        packages=['meshio'],
-        package_dir={'meshio': '.'},
-        ext_package='meshio',
-        ext_modules=[mqoExtension, pmdExtension, vmdExtension]
-        )
+# スタティックruntime(/MT)とリンクするのでマニフェストが不要だが
+# mt.exeの呼び出しを止めることができないので
+for i in range(len(ext_modules)+1):
+    try:
+        setup(name="meshio",
+                version='0.1',
+                description='polygon mesh io utilities',
+                author='ousttrue',
+                author_email='ousttrue@gmail.com',
+                url='http://sourceforge.jp/projects/meshio/',
+                packages=['meshio'],
+                package_dir={'meshio': '.'},
+                ext_package='meshio',
+                ext_modules=ext_modules
+                )
+        break
+    except:
+        continue