OSDN Git Service

implement pmd_import.
authorousttrue <ousttrue@gmail.com>
Fri, 11 Jun 2010 13:39:58 +0000 (22:39 +0900)
committerousttrue <ousttrue@gmail.com>
Fri, 11 Jun 2010 14:25:10 +0000 (23:25 +0900)
include/la.h
swig/blender/bl24.py
swig/blender/bl25.py
swig/blender/cp.py
swig/blender/pmd_import.py
swig/englishmap.py
swig/setup.py

index 12935e4..6350afa 100644 (file)
@@ -47,6 +47,11 @@ struct Vector3
        {
                return x==rhs.x && y==rhs.y && z==rhs.z;
        }
+
+       Vector3 operator+(const Vector3 &rhs)
+       {
+               return Vector3(x+rhs.x, y+rhs.y, z+rhs.z);
+       }
 };
 #ifndef SWIG
 inline std::ostream &operator<<(std::ostream &os, const Vector3 &rhs)
index 5ad411a..d699a64 100644 (file)
@@ -490,7 +490,6 @@ def createTexture(path):
     texture.image = image
     return texture, image
 
-
 def materialAddTexture(material, texture):
     material.mode = material.mode | Blender.Material.Modes.TEXFACE
     material.setTexture(0, texture, Blender.Texture.TexCo.UV)
@@ -735,7 +734,7 @@ def createIkConstraint(armature_object, p_bone, effector_name, ik):
 
 def createArmatureBone(armature, name):
     bone=Blender.Armature.Editbone()
-    bone.name=name
+    bone.name=name.encode(INTERNAL_ENCODING)
     armature.bones[name]=bone
     return bone
 
@@ -748,9 +747,27 @@ def createVector(x, y, z):
 def armatureUpdate(armature):
     armature.update()
 
-def boneLayerMask(bone, mask):
+def boneLayerMask(bone, layers):
     mask=0
-    for i, enable in enumerate(mask):
-        mask+=(1<<i)
+    for i, enable in enumerate(layers):
+        if enable!=0:
+            mask+=(1<<i)
     bone.layerMask=mask
 
+def objectPinShape(o):
+    o.pinShape=True
+
+def objectAddShapeKey(o, name):
+    mesh=o.getData(mesh=True)
+    mesh.insertKey()
+    block=mesh.key.blocks[-1]
+    block.name=name.encode(INTERNAL_ENCODING)
+    return block
+
+def objectActivateShapeKey(o, index):
+    o.activeShape=index
+
+def shapeKeyAssign(shapeKey, index, pos):
+    shapeKey.data[index]=pos
+
+
index e8b182c..24b1d8b 100644 (file)
@@ -274,12 +274,15 @@ def poseBoneLimit(n, b):
     if n.endswith("_t"):
         return
     if n.startswith("knee_"):
-        b.lock_rotation[1]=True
-        b.lock_rotation[2]=True
+        b.ik_dof_y=False
+        b.ik_dof_z=False
+        b.ik_dof_x=True
+        b.ik_limit_x=True
         b.ik_min_x=0
         b.ik_max_x=180
     elif n.startswith("ankle_"):
-        b.lock_rotation[1]=True
+        #b.ik_dof_y=False
+        pass
 
 def enterEditMode():
     bpy.ops.object.mode_set(mode='EDIT', toggle=False)
@@ -369,7 +372,24 @@ def createVector(x, y, z):
 def armatureUpdate(armature):
     pass
 
-def boneLayerMask(bone, mask):
-    for i, enable in enumerate(mask):
-        bone.layer[i]=True if enable else False 
+def boneLayerMask(bone, layers):
+    layer=[]
+    for i in range(32):
+        try:
+            layer.append(True if layers[i]!=0 else False)
+        except IndexError:
+            layer.append(False)
+    bone.layer=layer
+
+def objectPinShape(o):
+    o.shape_key_lock=True
+
+def objectAddShapeKey(o, name):
+    return o.add_shape_key(name)
+
+def objectActivateShapeKey(o, index):
+    o.active_shape_key_index=index
+
+def shapeKeyAssign(shapeKey, index, pos):
+    shapeKey.data[index].co=pos
 
index 2c49f92..8426715 100644 (file)
@@ -1,5 +1,7 @@
 import shutil
 
+SWIG="T:/work2/sf/MeshIO/swig"
+
 DST_24=[
         "T:/Blender/bf-blender/build2.4git/bin/Release/.blender/scripts",
         "T:/Blender/bf-blender/build2.4git/bin/Debug/.blender/scripts",
@@ -7,6 +9,7 @@ DST_24=[
         ]
 
 MAP_25={
+        "bl24.py": "bl24.py",
         "bl25.py": "bl25.py",
         "mqo_import.py": "import_scene_mqo.py",
         "mqo_export.py": "export_scene_mqo.py",
@@ -26,6 +29,7 @@ def copy24(src):
         dst="%s/%s" % (dst, src)
         print(dst)
         shutil.copy(src, dst)
+    shutil.copy(src, SWIG)
 
 def copy25(src):
     print("copy %s..." % src)
@@ -36,6 +40,7 @@ def copy25(src):
             continue
         print(dst)
         shutil.copy(src, dst)
+    shutil.copy(src, "%s/%s" % (SWIG, MAP_25[src]))
 
 if __name__=="__main__":
     import sys
index f04d5d3..408e84b 100644 (file)
@@ -27,6 +27,7 @@ This script imports a pmd into Blender for editing.
 """
 
 MMD_SHAPE_GROUP_NAME='_MMD_SHAPE'
+BASE_SHAPE_NAME='Basis'
 
 
 ###############################################################################
@@ -89,62 +90,62 @@ def convert_coord(pos):
     """
     return (pos.x, pos.z, pos.y)
 
+
 def convert_uv(uv):
     return (uv.x, 1.0 - uv.y)
 
+
 def to_radian(degree):
     return math.pi * degree / 180
 
 
-if isBlender24():
-    # functions
-    def get_bone_name(l, index):
-        name=englishmap.getEnglishBoneName(l.bones[index].getName())
-        return name if name else l.bones[index].getName().encode(bl.INTERNAL_ENCODING)
+def get_bone_name(l, index):
+    name=englishmap.getEnglishBoneName(l.bones[index].getName())
+    return name if name else l.bones[index].getName()
 
+def __importShape(obj, l, vertex_map):
+    if len(l.morph_list)==0:
+        return
 
-    def importShape(obj, l, vertex_map):
-        if len(l.morph_list)==0:
-            return
-        obj.pinShape=True
-        mesh=obj.getData(mesh=True)
+    # set shape_key pin
+    bl.objectPinShape(obj)
 
-        # find base 
-        base=None
-        for s in l.morph_list:
-            if s.type==0:
-                base=s
-
-                # create vertex group
-                mesh.addVertGroup(MMD_SHAPE_GROUP_NAME)
-                indices=[]
-                hasShape=False
-                for i in s.indices:
-                    if i in vertex_map:
-                        hasShape=True
-                        indices.append(vertex_map[i])
-                mesh.assignVertsToGroup(MMD_SHAPE_GROUP_NAME, indices, 0, 
-                        Blender.Mesh.AssignModes.ADD)
-                if not hasShape:
-                    return
-
-                # create base key
-                mesh.insertKey()
-                assert(len(mesh.key.blocks)==1)
-                baseShapeIndex=0
-                baseShapeBlock=mesh.key.blocks[baseShapeIndex]
-                baseShapeBlock.name='Basis'
-                obj.activeShape=baseShapeIndex
-                mesh.update()
-                break
+    # find base 
+    base=None
+    for s in l.morph_list:
+        if s.type==0:
+            base=s
 
-        assert(base)
+            # create vertex group
+            bl.meshAddVertexGroup(obj, MMD_SHAPE_GROUP_NAME)
+            hasShape=False
+            for i in s.indices:
+                if i in vertex_map:
+                    hasShape=True
+                    bl.meshAssignVertexGroup(
+                            obj, MMD_SHAPE_GROUP_NAME, vertex_map[i], 0)
+            if not hasShape:
+                return
+    assert(base)
+
+    # create base key
+    baseShapeBlock=bl.objectAddShapeKey(obj, BASE_SHAPE_NAME)
+    # mesh
+    mesh=bl.objectGetData(obj)
+    mesh.update()
 
-        # each skin
-        for s in l.morph_list:
-            if s.name==base.name:
-                continue
+    # each skin
+    for s in l.morph_list:
+        if s.type==0:
+            continue
+
+        # name
+        name=englishmap.getEnglishSkinName(s.getName())
+        if not name:
+            name=s.getName()
 
+        if isBlender24():
+            # 24
             for index, offset in zip(s.indices, s.pos_list):
                 try:
                     vertex_index=vertex_map[base.indices[index]]
@@ -153,7 +154,7 @@ if isBlender24():
                     v[0]+=offset[0]
                     v[1]+=offset[1]
                     v[2]+=offset[2]
-                except IndexErrora as msg:
+                except IndexError as msg:
                     print(msg)
                     print(index, len(base.indices), len(vertex_map))
                     print(len(mesh.verts))
@@ -164,17 +165,8 @@ if isBlender24():
                     #print 'this mesh not has shape vertices'
                     break
 
-            # get skin name
-            name=englishmap.getEnglishSkinName(s.getName())
-            if not name:
-                name=s.getName().encode(bl.INTERNAL_ENCODING)
-                print(name)
-
             # create shapekey block
-            mesh.insertKey()
-            shapeIndex=len(mesh.key.blocks)-1
-            keyBlock=mesh.key.blocks[shapeIndex]
-            keyBlock.name=name
+            new_shape_key=bl.objectAddShapeKey(obj, name)
 
             # copy vertex to shape key
             mesh.update()
@@ -186,88 +178,30 @@ if isBlender24():
                 mv.co[2] = v[2]
             mesh.update()
 
-        # select base shape
-        obj.activeShape=baseShapeIndex
-
-else:
-    # for 2.5
-    def get_bone_name(l, index):
-        name=englishmap.getEnglishBoneName(l.bones[index].getName())
-        return name if name else l.bones[index].getName()
-
-
-    def create_texture(directory, texture_name):
-        texture=bpy.data.textures.new(texture_name)
-        texture.type='IMAGE'
-        texture=texture.recast_type()
-        texturePath=os.path.join(directory, texture_name)
-        print('create_texture', texturePath)
-        image=bpy.data.images.load(texturePath)
-        texture.image=image
-        texture.mipmap = True
-        texture.interpolation = True
-        texture.use_alpha = True
-        return texture
-
-
-
-    def importShape(meshObject, l, vertex_map):
-        if len(l.morph_list)==0:
-            return
-
-        # base 
-        base=None
-        for s in l.morph_list:
-            if s.type!=0:
-                continue
-            base=s
-            break
-        assert(base)
-
-        # create base key
-        baseblock=meshObject.add_shape_key("Basis")
-
-        # mesh
-        mesh=meshObject.data
-
-        # each skin
-        for s in l.morph_list:
-            if s.getName()==base.name:
-                # skip base
-                continue
+        else:
+            # 25
+            new_shape_key=bl.objectAddShapeKey(obj, name)
 
-            # restore
-            #for v, base_pos in zip(mesh.verts, baseblock.data):
-            #    v.co=base_pos.co
-            #mesh.update()
-
-            # name
-            name=englishmap.getEnglishSkinName(s.getName())
-            if not name:
-                name=s.getName()
-            new_shape_key=meshObject.add_shape_key(name)
-            #new_shape_key.value=1.0
-
-            # morph
-            for i, offset in zip(s.indices, s.pos_list):
+            for index, offset in zip(s.indices, s.pos_list):
                 try:
-                    vertex_index=base.indices[i]
-                    new_shape_key.data[vertex_index].co=[p+o for p, o in zip(
-                        mesh.verts[vertex_index].co, convert_coord(offset))]
+                    vertex_index=base.indices[index]
+                    bl.shapeKeyAssign(new_shape_key, vertex_index,
+                            mesh.verts[vertex_index].co+
+                            bl.createVector(*convert_coord(offset)))
                 except IndexError as msg:
-                    print(IndexError, msg)
-                    print(i, len(base.indices))
-                    print(vertex_index, len(mesh.verts))
-                    print(base.indices[i])
+                    print(msg)
+                    print(index, len(base.indices), len(vertex_map))
+                    print(len(mesh.verts))
+                    print(base.indices[index])
+                    print(vertex_index)
                     break
                 except KeyError:
                     #print 'this mesh not has shape vertices'
                     break
-            
-            # set ipo curve
-            #icu=ipo.addCurve(name)
-            #icu.interpolation = Blender.IpoCurve.InterpTypes.LINEAR
-            #icu.append( (0.0, 0.0) )
+
+    # select base shape
+    bl.objectActivateShapeKey(obj, 0)
+
 
 def __build(armature, b, p, parent):
     name=englishmap.getEnglishBoneName(b.getName())
@@ -344,6 +278,7 @@ def __importArmature(scene, l):
 
     return armature_object
         
+
 def __import16MaerialAndMesh(meshObject, l, 
         material_order, face_map, tex_dir):
 
@@ -615,7 +550,7 @@ def __importMesh(scene, io, tex_dir):
         bl.enterEditMode()
 
         # crete shape key
-        importShape(meshObject, io, vertex_map)
+        __importShape(meshObject, io, vertex_map)
 
         # exit Edit Mode
         bl.exitEditMode()
@@ -625,6 +560,7 @@ def __importMesh(scene, io, tex_dir):
 
     return mesh_objects
 
+
 def __execute(filename, scene):
     """
     load pmd file to context.
index d3e2a22..a17380e 100644 (file)
@@ -217,7 +217,7 @@ def getUnicodeSkinName(name):
             return v
 
 if sys.version_info[0]<3:
-    print 'convert boneMap and skinMap to unicode...',
+    print('convert boneMap and skinMap to unicode...')
     # python2.x
     # unicodeに変換
     for i, l in enumerate(boneMap):
index a7eca78..c14fce0 100644 (file)
@@ -36,10 +36,10 @@ if sys.version_info[0]<3:
      data_files=[
              ('blender24', [
                  'blender24/README',
-                 'blender24/mqo_import.py', 
-                 'blender24/pmd_import.py', 
+                 'mqo_import.py', 
+                 'mqo_export.py',
+                 'pmd_import.py', 
                  'blender24/vmd_import.py',
-                 'blender24/mqo_export.py',
                  'blender24/pmd_export.py',
                  ])
              ]
@@ -49,8 +49,9 @@ else:
     data_files=[
             ('blender25', [
                 'blender25/README',
-                'blender25/import_scene_mqo.py',
-                'blender25/import_scene_pmd.py',
+                'import_scene_mqo.py',
+                'export_scene_mqo.py',
+                'import_scene_pmd.py',
                 ])
             ]
 
@@ -59,7 +60,7 @@ else:
 for i in range(len(ext_modules)+1):
     try:
         setup(name="meshio",
-                version='0.4',
+                version='0.5',
                 description='polygon mesh io utilities',
                 author='ousttrue',
                 author_email='ousttrue@gmail.com',