OSDN Git Service

refactoring.
authorousttrue <ousttrue@gmail.com>
Tue, 8 Jun 2010 14:39:04 +0000 (23:39 +0900)
committerousttrue <ousttrue@gmail.com>
Tue, 8 Jun 2010 14:39:04 +0000 (23:39 +0900)
swig/blender/bl24.py
swig/blender/bl25.py
swig/blender/pmd_import.py

index f7dab98..d85d2b3 100644 (file)
@@ -673,3 +673,29 @@ def objectActivate(scene, o):
     o.select(True )
     scene.objects.active=o
 
+def meshAddVertexGroup(meshObject, name):
+    meshObject.getData(mesh=True).addVertGroup(name)
+
+def meshUseVertexUv(mesh):
+    mesh.vertexUV = 1
+
+def vertexSetNormal(mvert, normal):
+    mvert.no=Mathutils.Vector(*normal)
+
+def vertexSetUv(mvert, uv):
+    mvert.uvco=uv
+
+def meshAssignVertexGroup(meshObject, name, index, weight):
+    mesh.getData(mesh=True).assignVertsToGroup(name, 
+            [index], weight, Blender.Mesh.AssignModes.ADD)
+
+def meshCreateVerteicesAndFaces(mesh, vertices, faces):
+    mesh.verts.extend(vertices)
+    mesh.faces.extend(mesh_face_indices, ignoreDups=True)
+
+def meshAddUV(mesh):
+    mesh.addUVLayer('NewUV')
+
+def meshVertsDelete(mesh, remove_vertices):
+    mesh.verts.delete(remove_vertices)
+
index e66bac4..5cba50b 100644 (file)
@@ -1,7 +1,10 @@
 # coding: utf-8
 import bpy
+import mathutils
+
 import os
 import time
+import functools
 
 ###############################################################################
 # ProgressBar
@@ -279,17 +282,50 @@ def poseBoneLimit(n, b):
         b.lock_rotation[1]=True
 
 def enterEditMode():
-    bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
+    bpy.ops.object.mode_set(mode='EDIT', 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
 
+def meshAddVertexGroup(meshObject, name):
+    meshObject.add_vertex_group(name)
+
+def vertexSetNormal(mvert, normal):
+    mvert.normal=mathutils.Vector(normal)
+
+def meshUseVertexUv(mesh):
+    pass
+
+def vertexSetUv(mvert, uv):
+    pass
+
+def meshAssignVertexGroup(meshObject, name, index, weight):
+    meshObject.add_vertex_to_group(index, 
+                meshObject.vertex_groups[name], weight, 'ADD')
+
+def meshCreateVerteicesAndFaces(mesh, vertices, faces):
+    vertexCount=int(len(vertices)/3)
+    faceCount=int(len(faces)/4)
+    mesh.add_geometry(vertexCount, 0, faceCount)
+    mesh.verts.foreach_set("co", vertices)
+    mesh.faces.foreach_set("verts_raw", faces)
+    assert(len(mesh.verts)==vertexCount)
+
+def meshAddUV(mesh):
+    mesh.add_uv_texture()
+
+def meshVertsDelete(mesh, remove_vertices):
+    enterEditMode()
+    bpy.ops.mesh.select_all(action='DESELECT')
+    for i in remove_vertices:
+        mesh.verts[i].selected=True
+    bpy.ops.mesh.delete(type='VERT')
+    exitEditMode()
+
index 7b97652..aefdc4b 100644 (file)
@@ -100,147 +100,6 @@ if isBlender24():
         return name if name else l.bones[index].getName().encode(bl.INTERNAL_ENCODING)
 
 
-    def import16MaerialAndMesh(meshObject, l, 
-            material_order, face_map, tex_dir):
-        mesh=bl.objectGetData(meshObject)
-        ############################################################
-        # material
-        ############################################################
-        progress_print('create materials')
-        mesh_material_map={}
-        textureMap={}
-        index=0
-        for material_index in material_order:
-            try:
-                m=l.materials[material_index]
-                mesh_material_map[material_index]=index
-            except KeyError:
-                break
-
-            material=bl.createPmdMaterial(m)
-
-            texture_name=m.getTexture()
-            #tex_file=re.compile('\*.*.spa$').sub('', m.getTexture())
-            #tex_path = os.path.join(tex_dir, tex_file).encode(
-            #        bl.INTERNAL_ENCODING)
-            if texture_name!='':
-                if texture_name in textureMap:
-                    texture=textureMap[texture_name]
-                else:
-                    try:
-                        texture, image=bl.createTexture(
-                                os.path.join(tex_dir, texture_name))
-                        textureMap[texture_name]=texture
-                        imageMap[material_index]=image
-                    except:
-                        continue
-                bl.materialAddTexture(material, texture)
-            bl.meshAddMaterial(mesh, material)
-            index+=1
-
-        ############################################################
-        # vertex
-        ############################################################
-        progress_print('create vertices')
-        # create vertices
-        vertices=[]
-        for v in l.each_vertex():
-            vertices.append(convert_coord(v.pos))
-        mesh.verts.extend(vertices)
-
-        ############################################################
-        # vertex bone weight
-        ############################################################
-        # create vertex group
-        vertex_groups={}
-        for v in l.each_vertex():
-            vertex_groups[v.bone0]=True
-            vertex_groups[v.bone1]=True
-        for i in vertex_groups.keys():
-            mesh.addVertGroup(get_bone_name(l, i))
-
-        # vertex params
-        mesh.vertexUV = 1
-        for i, v, mvert in zip(xrange(len(l.vertices)), l.each_vertex(), mesh.verts):
-            mvert.no=Mathutils.Vector(*convert_coord(v.normal))
-            mvert.uvco=convert_uv(v.uv)
-            w1=float(v.weight0)/100.0
-            w2=1.0-w1
-            mesh.assignVertsToGroup(get_bone_name(l, v.bone0), [i], w1, 
-                    Blender.Mesh.AssignModes.ADD)
-            mesh.assignVertsToGroup(get_bone_name(l, v.bone1), [i], w2, 
-                    Blender.Mesh.AssignModes.ADD)    
-
-        ############################################################
-        # face
-        ############################################################
-        progress_print('create faces')
-        # create faces
-        mesh_face_indices=[]
-        mesh_face_materials=[]
-        used_vertices=set()
-
-        def degenerate(i0, i1, i2):
-            return i0==i1 or i1==i2 or i2==i0
-
-        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]
-            for j in xrange(0, len(material_faces), 3):
-                i0=material_faces[j]
-                i1=material_faces[j+1]
-                i2=material_faces[j+2]
-                triangle=[i0, i1, i2]
-                if degenerate(*triangle):
-                    continue
-                mesh_face_indices.append(triangle)
-                mesh_face_materials.append(material_index)
-                used_vertices.add(i0)
-                used_vertices.add(i1)
-                used_vertices.add(i2)
-
-        mesh.faces.extend(mesh_face_indices, ignoreDups=True)
-
-        # face params
-        used_map={}
-        mesh.addUVLayer('NewUV')
-        for face, material_index in zip(mesh.faces, mesh_face_materials):
-            try:
-                index=mesh_material_map[material_index]
-            except KeyError as message:
-                print(message, mesh_material_map, m)
-                assert(False)
-            face.mat=index
-            material=mesh.materials[index]
-            texture=material.getTextures()[0]
-            used_map[index]=True
-            if texture:
-                face.image=texture.tex.image
-                texture.tex.imageFlags|=Blender.Texture.ImageFlags.USEALPHA
-                face.uv=[face.verts[0].uvco, face.verts[1].uvco, face.verts[2].uvco]
-            # set smooth
-            face.smooth = 1
-        # flip
-        mesh.flipNormals()
-
-        ############################################################
-        # clean up not used vertices
-        ############################################################
-        progress_print('clean up vertices not used')
-        remove_vertices=[]
-        vertex_map={}
-        for i, v in enumerate(l.each_vertex()):
-            if i in used_vertices:
-                vertex_map[i]=len(vertex_map)
-            else:
-                remove_vertices.append(i)
-        mesh.verts.delete(remove_vertices)
-
-        progress_print('%s created' % mesh.name)
-        return vertex_map
-
-
     class Builder(object):
         def __init__(self):
             self.boneMap={}
@@ -467,6 +326,11 @@ else:
         return name if name else bone.getName()
 
 
+    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'
@@ -481,150 +345,6 @@ else:
         return texture
 
 
-    def import16MaerialAndMesh(meshObject, l, 
-            material_order, face_map, tex_dir):
-        mesh=bl.objectGetData(meshObject)
-        ############################################################
-        # material
-        ############################################################
-        #progress_print('create materials')
-        mesh_material_map={}
-        textureMap={}
-        imageMap={}
-        index=0
-        for material_index in material_order:
-            try:
-                m=l.materials[material_index]
-                mesh_material_map[material_index]=index
-            except KeyError:
-                break
-
-            material=bl.createPmdMaterial(m)
-
-            texture_name=m.getTexture()
-            if texture_name!='':
-                if texture_name in textureMap:
-                    texture=textureMap[texture_name]
-                else:
-                    texture, image=bl.createTexture(
-                            os.path.join(tex_dir, texture_name))
-                    textureMap[texture_name]=texture
-                    imageMap[material_index]=image
-                bl.materialAddTexture(material, texture)
-            bl.meshAddMaterial(mesh, material)
-            index+=1
-
-        ############################################################
-        # vertex
-        ############################################################
-        #progress_print('create vertices')
-        # create vertices
-        unpackedVertices=[]
-        for v in l.each_vertex():
-            unpackedVertices.extend(
-                    convert_coord(v.pos))
-
-        ############################################################
-        # vertex bone weight
-        ############################################################
-        # create vertex group
-        vertex_groups={}
-        for v in l.each_vertex():
-            vertex_groups[v.bone0]=True
-            vertex_groups[v.bone1]=True
-        for i in vertex_groups.keys():
-            meshObject.add_vertex_group(getBoneName(l.bones[i]))
-
-        # vertex params
-        for i, v, mvert in zip(range(len(l.vertices)), 
-                l.each_vertex(), mesh.verts):
-            mvert.normal=mathutils.Vector(convert_coord(v.normal))
-            #mvert.uvco=convert_uv(v.uv)
-            w1=float(v.weight0)/100.0
-            w2=1.0-w1
-
-            meshObject.add_vertex_to_group(i, 
-                    meshObject.vertex_groups[getBoneName(l.bones[v.bone0])], w1, 'ADD')
-            meshObject.add_vertex_to_group(i, 
-                    meshObject.vertex_groups[getBoneName(l.bones[v.bone1])], w2, 'ADD')
-        ############################################################
-        # face
-        ############################################################
-        #progress_print('create faces')
-        # create faces
-        mesh_face_indices=[]
-        mesh_face_materials=[]
-        used_vertices=set()
-
-        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]
-            for j in range(0, len(material_faces), 3):
-                i0=material_faces[j]
-                i1=material_faces[j+1]
-                i2=material_faces[j+2]
-                if i2==0:
-                    mesh_face_indices.extend([i2, i0, i1, 0])
-                else:
-                    mesh_face_indices.extend([i0, i1, i2, 0])
-                mesh_face_materials.append(material_index)
-                used_vertices.add(i0)
-                used_vertices.add(i1)
-                used_vertices.add(i2)
-
-        ############################################################
-        # create vertices & faces
-        ############################################################
-        mesh.add_geometry(
-                int(len(unpackedVertices)/3), 0, int(len(mesh_face_indices)/4))
-        mesh.verts.foreach_set("co", unpackedVertices)
-        mesh.faces.foreach_set("verts_raw", mesh_face_indices)
-        assert(len(l.vertices)==len(mesh.verts))
-
-        ############################################################
-        # face params
-        ############################################################
-        used_map={}
-        mesh.add_uv_texture()
-
-        for face, uv_face, material_index in zip(mesh.faces, 
-                mesh.uv_textures[0].data,
-                mesh_face_materials,
-                ):
-            try:
-                index=mesh_material_map[material_index]
-            except KeyError as message:
-                print(message, mesh_material_map, m)
-                assert(False)
-            face.material_index=index
-            material=mesh.materials[index]
-            used_map[index]=True
-            if material.texture_slots[0]:
-                #texture=material.texture_slots[0].texture
-                #face.image=texture.image
-                #texture.imageFlags|=Blender.Texture.ImageFlags.USEALPHA
-                uv=l.getUV(face.verts[0])
-                uv_face.uv1=[uv.x, 1.0-uv.y]
-
-                uv=l.getUV(face.verts[1])
-                uv_face.uv2=[uv.x, 1.0-uv.y]
-
-                uv=l.getUV(face.verts[2])
-                uv_face.uv3=[uv.x, 1.0-uv.y]
-            if face.material_index in imageMap:
-                uv_face.image=imageMap[face.material_index]
-                uv_face.tex=True
-
-            # set smooth
-            face.smooth = 1
-
-        mesh.update()
-
-        #progress_print('%s created' % mesh.name)
-        return meshObject, used_vertices
-
-
     def build_bone(armature, b, parent=None):
         if b.tail_index==0:
             return
@@ -775,7 +495,206 @@ else:
             #icu.interpolation = Blender.IpoCurve.InterpTypes.LINEAR
             #icu.append( (0.0, 0.0) )
 
-   
+
+def __import16MaerialAndMesh(meshObject, l, 
+        material_order, face_map, tex_dir):
+
+    mesh=bl.objectGetData(meshObject)
+    ############################################################
+    # material
+    ############################################################
+    progress_print('create materials')
+    mesh_material_map={}
+    textureMap={}
+    imageMap={}
+    index=0
+
+    for material_index in material_order:
+        try:
+            m=l.materials[material_index]
+            mesh_material_map[material_index]=index
+        except KeyError:
+            break
+
+        material=bl.createPmdMaterial(m)
+
+        texture_name=m.getTexture()
+        #tex_file=re.compile('\*.*.spa$').sub('', m.getTexture())
+        #tex_path = os.path.join(tex_dir, tex_file).encode(
+        #        bl.INTERNAL_ENCODING)
+        if texture_name!='':
+            if texture_name in textureMap:
+                texture=textureMap[texture_name]
+            else:
+                try:
+                    texture, image=bl.createTexture(
+                            os.path.join(tex_dir, texture_name))
+                    textureMap[texture_name]=texture
+                    imageMap[material_index]=image
+                except:
+                    continue
+            bl.materialAddTexture(material, texture)
+        bl.meshAddMaterial(mesh, material)
+        index+=1
+
+    ############################################################
+    # vertex
+    ############################################################
+    progress_print('create vertices')
+    # create vertices
+    vertices=[]
+    if isBlender24():
+        for v in l.each_vertex():
+            vertices.append(convert_coord(v.pos))
+    else:
+        for v in l.each_vertex():
+            vertices.extend(convert_coord(v.pos))
+
+    ############################################################
+    # face
+    ############################################################
+    progress_print('create faces')
+    # create faces
+    mesh_face_indices=[]
+    mesh_face_materials=[]
+    used_vertices=set()
+
+    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]
+
+        def degenerate(i0, i1, i2):
+            """
+            縮退しているか?
+            """
+            return i0==i1 or i1==i2 or i2==i0
+
+        for j in xrange(0, len(material_faces), 3):
+            i0=material_faces[j]
+            i1=material_faces[j+1]
+            i2=material_faces[j+2]
+            if i2==0:
+                triangle=[i2, i0, i1]
+            else:
+                triangle=[i0, i1, i2]
+            if degenerate(*triangle):
+                continue
+            if isBlender24():
+                mesh_face_indices.append(triangle[0:3])
+            else:
+                mesh_face_indices.extend(
+                        [triangle[0], triangle[1], triangle[2], 0])
+            mesh_face_materials.append(material_index)
+            used_vertices.add(i0)
+            used_vertices.add(i1)
+            used_vertices.add(i2)
+
+    ############################################################
+    # create vertices & faces
+    ############################################################
+    bl.meshCreateVerteicesAndFaces(mesh, vertices, mesh_face_indices)
+
+    ############################################################
+    # vertex bone weight
+    ############################################################
+    # create vertex group
+    vertex_groups={}
+    for v in l.each_vertex():
+        vertex_groups[v.bone0]=True
+        vertex_groups[v.bone1]=True
+    for i in vertex_groups.keys():
+        bl.meshAddVertexGroup(meshObject, get_bone_name(l, i))
+
+    # vertex params
+    bl.meshUseVertexUv(mesh)
+    for i, v, mvert in zip(xrange(len(l.vertices)), 
+        l.each_vertex(), mesh.verts):
+        # normal, uv
+        bl.vertexSetNormal(mvert, convert_coord(v.normal))
+        bl.vertexSetUv(mvert, convert_uv(v.uv))
+        # bone weight
+        w1=float(v.weight0)/100.0
+        w2=1.0-w1
+        bl.meshAssignVertexGroup(meshObject, get_bone_name(l, v.bone0),
+            i,  w1)
+        bl.meshAssignVertexGroup(meshObject, get_bone_name(l, v.bone1),
+            i,  w2)
+
+    ############################################################
+    # face params
+    ############################################################
+    used_map={}
+    bl.meshAddUV(mesh)
+
+    if isBlender24():
+        for face, material_index in zip(mesh.faces, mesh_face_materials):
+            try:
+                index=mesh_material_map[material_index]
+            except KeyError as message:
+                print(message, mesh_material_map, m)
+                assert(False)
+            face.mat=index
+            material=mesh.materials[index]
+            texture=material.getTextures()[0]
+            used_map[index]=True
+            if texture:
+                face.image=texture.tex.image
+                texture.tex.imageFlags|=Blender.Texture.ImageFlags.USEALPHA
+                face.uv=[
+                    face.verts[0].uvco, face.verts[1].uvco, face.verts[2].uvco]
+            # set smooth
+            face.smooth = 1
+        # flip
+        mesh.flipNormals()
+    else:
+        for face, uv_face, material_index in zip(mesh.faces, 
+                mesh.uv_textures[0].data,
+                mesh_face_materials,
+                ):
+            try:
+                index=mesh_material_map[material_index]
+            except KeyError as message:
+                print(message, mesh_material_map, m)
+                assert(False)
+            face.material_index=index
+            material=mesh.materials[index]
+            used_map[index]=True
+            if material.texture_slots[0]:
+                uv=l.getUV(face.verts[0])
+                uv_face.uv1=[uv.x, 1.0-uv.y]
+
+                uv=l.getUV(face.verts[1])
+                uv_face.uv2=[uv.x, 1.0-uv.y]
+
+                uv=l.getUV(face.verts[2])
+                uv_face.uv3=[uv.x, 1.0-uv.y]
+            if face.material_index in imageMap:
+                uv_face.image=imageMap[face.material_index]
+                uv_face.tex=True
+
+            # set smooth
+            face.smooth = 1
+    mesh.update()
+
+    ############################################################
+    # clean up not used vertices
+    ############################################################
+    progress_print('clean up vertices not used')
+    remove_vertices=[]
+    vertex_map={}
+    for i, v in enumerate(l.each_vertex()):
+        if i in used_vertices:
+            vertex_map[i]=len(vertex_map)
+        else:
+            remove_vertices.append(i)
+
+    bl.meshVertsDelete(mesh, remove_vertices)
+
+    progress_print('%s created' % mesh.name)
+    return vertex_map
+
+
 def __importMesh(scene, io, tex_dir):
     """
     @param l[in] mmd.PMDLoader
@@ -833,16 +752,18 @@ def __importMesh(scene, io, tex_dir):
         #meshObject.layers = [1]
         mesh_objects.append(meshObject)
 
+        # activate object
+        bl.objectDeselectAll()
+        bl.objectActivate(scene, meshObject)
+
         # shapeキーで使われる順に並べなおしたマテリアル16個分の
         # メッシュを作成する
-        vertex_map=import16MaerialAndMesh(
+        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