OSDN Git Service

refactoring.
authorousttrue <ousttrue@gmail.com>
Mon, 7 Jun 2010 21:59:22 +0000 (06:59 +0900)
committerousttrue <ousttrue@gmail.com>
Mon, 7 Jun 2010 21:59:22 +0000 (06:59 +0900)
swig/blender/bl24.py
swig/blender/bl25.py
swig/blender/pmd_import.py

index 81220e6..5d79475 100644 (file)
@@ -3,6 +3,7 @@ import sys
 import os
 import Blender
 from Blender import Mathutils
+import bpy
 
 
 # ファイルシステムの文字コード
@@ -638,3 +639,17 @@ def poseBoneLimit(n, b):
     elif n.startswith("ankle_"):
         b.lockYRot=True
 
+def enterEditMode():
+    Blender.Window.EditMode(1)
+
+def exitEditMode():
+    Blender.Window.EditMode(0)
+
+def objectDeselectAll():
+    for o in bpy.data.scenes.active.objects:
+        o.select(False)
+
+def objectActivate(scene, o):
+    o.select(True )
+    scene.objects.active=o
+
index 92144c0..07f5114 100644 (file)
@@ -262,3 +262,18 @@ def poseBoneLimit(n, b):
     elif n.startswith("ankle_"):
         b.lock_rotation[1]=True
 
+def enterEditMode():
+    bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
+
+def exitEditMode():
+    bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
+
+def objectDeselectAll():
+    # 25
+    bpy.ops.object.select_all(action='DESELECT')
+
+def objectActivate(scene, o):
+    # 25
+    o.selected=True 
+    scene.objects.active=o
+
index 3f7220a..a09359b 100644 (file)
@@ -60,6 +60,7 @@ else:
     # wrapper
     import bl25 as bl
 
+    xrange=range
 
 ###############################################################################
 # progress bar
@@ -114,84 +115,9 @@ if isBlender24():
         return material
 
 
-    def importMesh(scene, l, tex_dir):
-        """
-        @param l[in] mmd.PMDLoader
-        @param filename[in]
-        """
-
-        ############################################################
-        # shpaeキーで使われるマテリアル優先的に前に並べる
-        ############################################################
-        # shapeキーで使われる頂点インデックスを集める
-        shape_key_used_vertices=set()
-        if len(l.morph_list)>0:
-            # base 
-            base=None
-            for s in l.morph_list:
-                if s.type!=0:
-                    continue
-                base=s
-                break
-            assert(base)
-
-            for index in base.indices:
-                shape_key_used_vertices.add(index)
-
-        # マテリアルに含まれる頂点がshape_keyに含まれるか否か?
-        def isMaterialUsedInShape(offset, m):
-            for i in xrange(offset, offset+m.vertex_count): 
-                if l.indices[i] in shape_key_used_vertices:
-                    return True
-
-        # shapeキーで使われるマテリアルを記録する
-        shape_key_materials=set()
-        # 各マテリアルの開始頂点インデックスを記録する
-        face_map={}
-        face_count=0
-        for i, m in enumerate(l.materials):
-            face_map[i]=face_count
-            if isMaterialUsedInShape(face_count, m):
-                shape_key_materials.add(i)
-            face_count+=m.vertex_count
-
-        # list化
-        material_order=list(shape_key_materials)
-
-        # shapeキーに使われていないマテリアルを後ろに追加
-        for i in range(len(l.materials)):
-            if not i in material_order:
-                material_order.append(i)
-
-        # マテリアル16個ごとに分割したメッシュを作成する
-        material_offset=0
-        mesh_objects=[]
-        while material_offset<len(l.materials):
-            # create mesh
-            mesh = Blender.Mesh.New()
-            mesh.vertexUV = 1
-            # create object
-            obj = scene.objects.new(mesh)
-            obj.layers = [1]
-            mesh_objects.append(obj)
-
-            # shapeキーで使われる順に並べなおしたマテリアル16個分の
-            # メッシュを作成する
-            vertex_map=import16MaerialAndMesh(
-                    mesh, l, 
-                    material_order[material_offset:material_offset+16], 
-                    face_map, tex_dir)
-
-            # crete shape key
-            importShape(obj, l, vertex_map)
-
-            mesh.update()
-            material_offset+=16
-
-        return mesh_objects
-
-
-    def import16MaerialAndMesh(mesh, l, material_order, face_map, tex_dir):
+    def import16MaerialAndMesh(meshObject, l, 
+            material_order, face_map, tex_dir):
+        mesh=bl.objectGetData(meshObject)
         ############################################################
         # material
         ############################################################
@@ -581,123 +507,9 @@ else:
         return material
 
 
-    def importMesh(scene, l, tex_dir):
-        """
-        @param l[in] mmd.PMDLoader
-        @param filename[in]
-        """
-
-        ############################################################
-        # shpaeキーで使われるマテリアル優先的に前に並べる
-        ############################################################
-        # shapeキーで使われる頂点インデックスを集める
-        shape_key_used_vertices=set()
-        if len(l.morph_list)>0:
-            # base 
-            base=None
-            for s in l.morph_list:
-                if s.type!=0:
-                    continue
-                base=s
-                break
-            assert(base)
-
-            for index in base.indices:
-                shape_key_used_vertices.add(index)
-
-        # マテリアルに含まれる頂点がshape_keyに含まれるか否か?
-        def isMaterialUsedInShape(offset, m):
-            for i in range(offset, offset+m.vertex_count): 
-                if l.indices[i] in shape_key_used_vertices:
-                    return True
-
-        # shapeキーで使われるマテリアルを記録する
-        shape_key_materials=set()
-        # 各マテリアルの開始頂点インデックスを記録する
-        face_map={}
-        face_count=0
-        for i, m in enumerate(l.materials):
-            face_map[i]=face_count
-            if isMaterialUsedInShape(face_count, m):
-                shape_key_materials.add(i)
-            face_count+=m.vertex_count
-
-        # shapeキーで使われるマテリアルを前に並べるインデックスマップを作る
-        material_map={}
-        used_index=0
-        not_used_index=len(shape_key_materials)
-        for i, m in enumerate(l.materials):
-            if i in shape_key_materials:
-                material_map[i]=used_index
-                used_index+=1
-            else:
-                material_map[i]=not_used_index
-                not_used_index+=1
-
-        # マテリアル16個ごとに分割したメッシュを作成する
-        material_index=0
-        mesh_objects=[]
-        while material_index<len(l.materials):
-            # shapeキーで使われる順に並べなおしたマテリアル16個分の
-            # メッシュを作成する
-            meshObject, used_vertices=import16MaerialAndMesh(l, 
-                    material_index, material_map, face_map, tex_dir)
-            scene.objects.link(meshObject)
-            scene.update()
-            mesh_objects.append(meshObject)
-
-            # enter Edit Mode
-            bpy.ops.object.select_all(action='DESELECT')
-            meshObject.selected=True
-            scene.objects.active=meshObject
-            bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
-     
-            # crete shape key
-            importShape(meshObject, l)
-
-            ############################################################
-            # clean up not used vertices
-            ############################################################
-            #progress_print('clean up vertices not used')
-            vertex_map={}
-            mesh=meshObject.data
-            for i, v in enumerate(mesh.verts):
-                if i in used_vertices:
-                    vertex_map[i]=len(vertex_map)
-                    v.selected=False
-                else:
-                    v.selected=True
-                    assert(mesh.verts[i].selected)
-            bpy.ops.object.mode_set(mode='EDIT', toggle=False)
-            print("%d vertices selected" % mesh.total_vert_sel)
-            print("used %d/%d" % (len(vertex_map), len(mesh.verts)))
-            bpy.ops.mesh.delete(type='VERT')
-
-            ############################################################
-            # flip face
-            ############################################################
-            bpy.ops.mesh.select_all(action='SELECT')
-            bpy.ops.mesh.flip_normals()
-            bpy.ops.mesh.select_all(action='DESELECT')
-
-            # exit Edit Mode
-            bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
-
-            mesh.update()
-            material_index+=16
-
-        return mesh_objects
-
-
-    def import16MaerialAndMesh(l, 
-            material_offset, material_map, face_map, tex_dir):
-        # create mesh
-        mesh=bpy.data.meshes.new("Mesh")
-
-        # create object
-        meshObject= bpy.data.objects.new("Mesh", mesh)
-        meshObject.layers[0]=True
-
+    def import16MaerialAndMesh(meshObject, l, 
+            material_order, face_map, tex_dir):
+        mesh=bl.objectGetData(meshObject)
         ############################################################
         # material
         ############################################################
@@ -707,9 +519,8 @@ else:
         textureMap={}
         imageMap={}
         index=0
-        for i in range(material_offset, material_offset+16):
+        for material_index in material_order:
             try:
-                material_index=material_map[i]
                 m=l.materials[material_index]
                 mesh_material_map[material_index]=index
             except KeyError:
@@ -758,11 +569,8 @@ else:
         mesh_face_indices=[]
         mesh_face_materials=[]
         used_vertices=set()
-        for i in range(material_offset, material_offset+16):
-            try:
-                material_index=material_map[i]
-            except KeyError:
-                break
+
+        for material_index in material_order:
             face_offset=face_map[material_index]
             m=l.materials[material_index]
             material_faces=l.indices[face_offset:face_offset+m.vertex_count]
@@ -942,7 +750,7 @@ else:
         return armature_object
         
 
-    def importShape(meshObject, l):
+    def importShape(meshObject, l, vertex_map):
         if len(l.morph_list)==0:
             return
 
@@ -1001,6 +809,87 @@ else:
             #icu.append( (0.0, 0.0) )
 
    
+def __importMesh(scene, io, tex_dir):
+    """
+    @param l[in] mmd.PMDLoader
+    @param filename[in]
+    """
+    ############################################################
+    # shpaeキーで使われるマテリアル優先的に前に並べる
+    ############################################################
+    # shapeキーで使われる頂点インデックスを集める
+    shape_key_used_vertices=set()
+    if len(io.morph_list)>0:
+        # base 
+        base=None
+        for s in io.morph_list:
+            if s.type!=0:
+                continue
+            base=s
+            break
+        assert(base)
+
+        for index in base.indices:
+            shape_key_used_vertices.add(index)
+
+    # マテリアルに含まれる頂点がshape_keyに含まれるか否か?
+    def isMaterialUsedInShape(offset, m):
+        for i in xrange(offset, offset+m.vertex_count): 
+            if io.indices[i] in shape_key_used_vertices:
+                return True
+
+    # shapeキーで使われるマテリアルを記録する
+    shape_key_materials=set()
+    # 各マテリアルの開始頂点インデックスを記録する
+    face_map={}
+    face_count=0
+    for i, m in enumerate(io.materials):
+        face_map[i]=face_count
+        if isMaterialUsedInShape(face_count, m):
+            shape_key_materials.add(i)
+        face_count+=m.vertex_count
+
+    # list化
+    material_order=list(shape_key_materials)
+
+    # shapeキーに使われていないマテリアルを後ろに追加
+    for i in range(len(io.materials)):
+        if not i in material_order:
+            material_order.append(i)
+
+    # マテリアル16個ごとに分割したメッシュを作成する
+    material_offset=0
+    mesh_objects=[]
+    while material_offset<len(io.materials):
+        mesh, meshObject=bl.createMesh(scene, 'mesh')
+        #mesh.vertexUV = 1
+        # create object
+        #meshObject.layers = [1]
+        mesh_objects.append(meshObject)
+
+        # shapeキーで使われる順に並べなおしたマテリアル16個分の
+        # メッシュを作成する
+        vertex_map=import16MaerialAndMesh(
+                meshObject, io, 
+                material_order[material_offset:material_offset+16], 
+                face_map, tex_dir)
+
+        # enter Edit Mode
+        bl.objectDeselectAll()
+        bl.objectActivate(scene, meshObject)
+        bl.enterEditMode()
+
+        # crete shape key
+        importShape(meshObject, io, vertex_map)
+
+        # exit Edit Mode
+        bl.exitEditMode()
+
+        mesh.update()
+        material_offset+=16
+
+    return mesh_objects
+
 def __execute(filename, scene):
     """
     load pmd file to context.
@@ -1019,7 +908,7 @@ def __execute(filename, scene):
             io.english_name if len(io.english_name)>0 else io.getName().encode(bl.INTERNAL_ENCODING))
 
     # import mesh
-    mesh_objects=importMesh(scene, io, os.path.dirname(filename))
+    mesh_objects=__importMesh(scene, io, os.path.dirname(filename))
     for o in mesh_objects:
         bl.objectMakeParent(root, o)