OSDN Git Service

refactoring add geometry.
authorousttrue <ousttrue@gmail.com>
Wed, 23 Jun 2010 12:01:44 +0000 (21:01 +0900)
committerousttrue <ousttrue@gmail.com>
Wed, 23 Jun 2010 13:28:25 +0000 (22:28 +0900)
swig/blender/bl24.py
swig/blender/bl25.py
swig/blender/mqo_export.py
swig/blender/mqo_import.py
swig/blender/pmd_import.py

index 9b3652b..079400f 100644 (file)
@@ -123,12 +123,15 @@ def createTexture(path):
     texture = Blender.Texture.New(path.encode(INTERNAL_ENCODING))
     texture.type = Blender.Texture.Types.IMAGE
     texture.image = image
+    texture.tex.imageFlags|=Blender.Texture.ImageFlags.USEALPHA
     return texture, image
 
 def materialAddTexture(material, texture):
     material.mode = material.mode | Blender.Material.Modes.TEXFACE
     material.setTexture(0, texture, Blender.Texture.TexCo.UV)
 
+def materialHasTexture(material):
+    return len(material.getTextures())>0
 
 def createMesh(scene, name):
     mesh = Blender.Mesh.New()
@@ -144,76 +147,18 @@ def meshAddMaterial(mesh, material):
     mesh.materials+=[material]
 
 
-def meshAddMqoGeometry(mesh_object, o, materials, imageMap, scale):
-    mesh=mesh_object.getData(mesh=True)
-    # add vertices
-    mesh.verts.extend(Mathutils.Vector(0, 0, 0)) # dummy
-    mesh.verts.extend([(v.x * scale, -v.z * scale, v.y * scale) for v in o.vertices])
-    # add faces
-    mesh_faces=[]
-    for face in o.faces:
-        face_indices=[]
-        for i in xrange(face.index_count):
-            face_indices.append(face.getIndex(i)+1)
-        mesh_faces.append(face_indices)
-    #new_faces=mesh.faces.extend([face.indices for face in o.faces], 
-    new_faces=mesh.faces.extend(mesh_faces,
+def meshAddGeometry(mesh, vertices, faces):
+    mesh.verts.extend(vertices)
+    new_faces=mesh.faces.extend(faces,
             #ignoreDups=True, 
             indexList=True)
     mesh.update()
-    
-    # gather used materials
-    materialMap = {}
-    if new_faces:
-        for i in new_faces:
-            if type(i) is int:
-                materialMap[o.faces[i].material_index]=True
-
-    # blender limits 16 materials per mesh
-    # separate mesh ?
-    for i, material_index in enumerate(materialMap.keys()):
-        if i>=16:
-            print("over 16 materials!")
-            break
-        mesh.materials+=[materials[material_index]]
-        materialMap[material_index]=i
-    
-    # set face params
-    for i, f in enumerate(o.faces):       
-        if not type(new_faces[i]) is int:
-            continue
-
-        face=mesh.faces[new_faces[i]]
-
-        uv_array=[]
-        for i in xrange(f.index_count):
-            uv_array.append(Blender.Mathutils.Vector(
-                f.getUV(i).x, 
-                1.0-f.getUV(i).y)
-                )
-        try:
-            face.uv=uv_array
-        except Exception as msg:
-            #print msg
-            #print face.index, uv_array
-            pass
-    
-        if f.material_index in materialMap:
-            face.mat = materialMap[f.material_index]
-
-        face.smooth = 1
-
-    # rmeove dummy 0 vertex
-    mesh.verts.delete(0)
-        
-    mesh.calcNormals()
-    mesh.flipNormals()
-    mesh.update()
-
 
 def objectAddMirrorModifier(mesh_object):
     return mesh_object.modifiers.append(Blender.Modifier.Types.MIRROR)
 
+def faceSetNormal(face, normal):
+    face.no=normal
 
 def getTexture(m, dirname):
     tex=""
@@ -262,6 +207,15 @@ def faceGetUV(mesh, i, face, count):
     # flip
     return reversed(face.uv)
 
+def faceSetMaterial(face, material_index):
+    face.mat=material_index
+
+def faceSetSmooth(face, isSmooth):
+    face.smooth=1 if isSmooth else 0
+def faceSetUv(face, uv_array):
+    face.uv=uv_array
+
 def materialToMqo(m):
     return "\"%s\" shader(3) col(%f %f %f %f)" % (
             m.name, m.rgbCol[0], m.rgbCol[1], m.rgbCol[2], m.alpha)
@@ -328,10 +282,6 @@ def meshAssignVertexGroup(meshObject, name, index, weight):
     meshObject.getData(mesh=True).assignVertsToGroup(name, 
             [index], weight, Blender.Mesh.AssignModes.ADD)
 
-def meshCreateVerteicesAndFaces(mesh, vertices, faces):
-    mesh.verts.extend(vertices)
-    mesh.faces.extend(faces, ignoreDups=True)
-
 def meshAddUV(mesh):
     mesh.addUVLayer('NewUV')
 
@@ -425,9 +375,15 @@ def meshVertexGroupNames(meshObject):
 def faceNormal(face):
     return face.no
 
-def meshFaceUv(mesh, i, face):
+def meshGetFaceUv(mesh, i, face):
     return face.uv
 
+def meshSetFaceUv(mesh, i, face, uv_array, image):
+    face.uv=[Mathutils.Vector(uv[0], uv[1]) for uv in  uv_array]
+    if image:
+        face.image=image
+
+
 def armatureModifierGetObject(m):
     return m[Blender.Modifier.Settings.OBJECT]
 
@@ -484,3 +440,13 @@ def meshSetSmooth(mesh, smoothing):
     mesh.degr=int(smoothing)
     #mesh.smooth()
 
+def meshRecalcNormals(mesh_object):
+    mesh=mesh_object.getData(mesh=True)
+    mesh.calcNormals() 
+
+def meshFlipNormals(mesh):
+    mesh.flipNormals()
+
+def faceGetIndices(face):
+    return [face.verts[0].index, face.verts[1].index, face.verts[2].index]
+
index ca79e58..74214a5 100644 (file)
@@ -95,7 +95,7 @@ def createMqoMaterial(m):
 
 def createPmdMaterial(m):
     material = bpy.data.materials.new("Material")
-    material.diffuse_shader='TOON'
+    material.diffuse_shader='FRESNEL'
     material.specular_shader='TOON'
     material.diffuse_color=([m.diffuse.r, m.diffuse.g, m.diffuse.b])
     material.alpha=m.diffuse.a
@@ -139,39 +139,18 @@ def objectMakeParent(parent, child):
 def objectAddMirrorModifier(mesh_object):
     return mesh_object.modifiers.new("Modifier", "MIRROR")
 
-def meshAddMqoGeometry(mesh_object, o, materials, imageMap, scale):
-    mesh=mesh_object.data
-    # count triangle and quadrangle
-    faceCount=0
-    for f in o.faces:
-        if f.index_count==3 or f.index_count==4:
-            faceCount+=1
-    mesh.add_geometry(len(o.vertices), 0, faceCount)
-
+def meshAddGeometry(mesh, vertices, faces):
+    mesh.from_pydata(vertices, [], faces)
+    """
+    mesh.add_geometry(len(vertices), 0, len(faces))
     # add vertex
     unpackedVertices=[]
-    for v in o.vertices:
-        # convert right-handed y-up to right-handed z-up
-        unpackedVertices.extend(
-                (scale*v.x, scale*-v.z, scale*v.y))
+    for v in vertices:
+        unpackedVertices.extend(v)
     mesh.verts.foreach_set("co", unpackedVertices)
-
     # add face
     unpackedFaces = []
-    usedMaterial=set()
-
-    def getFace(f):
-        face = []
-        for i in range(f.index_count):
-            face.append(f.getIndex(i))
-        return face
-
-    for f in o.faces:
-        face=getFace(f)
-        if len(face) != 3 and len(face) != 4:
-            print("{0} vertices in face.".format(len(face)))
-            continue
-
+    for face in faces:
         if len(face) == 4:
             if face[3] == 0:
                 # rotate indices if the 4th is 0
@@ -182,43 +161,24 @@ def meshAddMqoGeometry(mesh_object, o, materials, imageMap, scale):
                 face = [face[2], face[0], face[1], 0]
             else:
                 face.append(0)
-
         unpackedFaces.extend(face)
-        usedMaterial.add(f.material_index)
-    try:
-        mesh.faces.foreach_set("verts_raw", unpackedFaces)
-    except:
-        #print([getFace(f) for f in o.faces])
-        print("fail to mesh.faces.foreach_set")
-        return
+    mesh.faces.foreach_set("verts_raw", unpackedFaces)
+    """
+    assert(len(vertices)==len(mesh.verts))
+    assert(len(faces)==len(mesh.faces))
 
-    # add material
-    meshMaterialMap={}
-    materialIndex=0
-    for i in usedMaterial:
-        mesh.add_material(materials[i])
-        meshMaterialMap[i]=materialIndex
-        materialIndex+=1
+def meshSetFaceUv(mesh, i, face, uv_array, image):
+    uv_face=mesh.uv_textures[0].data[i]
+    uv_face.uv=uv_array
+    if image:
+        uv_face.image=image
+        uv_face.tex=True
 
-    # each face
-    mesh.add_uv_texture()
-    for mqo_face, blender_face, uv_face in zip(
-            o.faces, mesh.faces, mesh.uv_textures[0].data):
-        if mqo_face.index_count<3:
-            continue
-        blender_face.material_index=meshMaterialMap[mqo_face.material_index]
-        if mqo_face.index_count>=3:
-            uv_face.uv1=[mqo_face.getUV(0).x, 1.0-mqo_face.getUV(0).y]
-            uv_face.uv2=[mqo_face.getUV(1).x, 1.0-mqo_face.getUV(1).y]
-            uv_face.uv3=[mqo_face.getUV(2).x, 1.0-mqo_face.getUV(2).y]
-            if mqo_face.index_count==4:
-                uv_face.uv4=[
-                        mqo_face.getUV(3).x, 1.0-mqo_face.getUV(3).y]
-        if materials[mqo_face.material_index] in imageMap:
-            uv_face.image=imageMap[mqo_face.material_index]
-            uv_face.tex=True
-
-    mesh.update()
+def faceSetMaterial(face, material_index):
+    face.material_index=material_index
+
+def faceSetSmooth(face, isSmooth):
+    face.smooth=True if isSmooth else False
 
 def getTexture(m, dirname):
     tex=""
@@ -338,6 +298,9 @@ def meshAddVertexGroup(meshObject, name):
 def vertexSetNormal(mvert, normal):
     mvert.normal=mathutils.Vector(normal)
 
+def faceSetNormal(face, normal):
+    face.normal=normal
+
 def meshUseVertexUv(mesh):
     pass
 
@@ -348,14 +311,6 @@ 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()
 
@@ -517,5 +472,20 @@ def VtoV(v):
 def meshSetSmooth(mesh, smoothing):
     mesh.autosmooth_angle=int(smoothing)
     mesh.autosmooth=True
-    mesh.calc_normals()
+
+def meshRecalcNormals(mesh_object):
+    bpy.ops.object.select_all(action='DESELECT')
+    objectActivate(bpy.context.scene, mesh_object)
+    enterEditMode()
+    bpy.ops.mesh.normals_make_consistent()
+    exitEditMode()
+
+def meshFlipNormals(mesh):
+    mesh.flipNormals()
+
+def materialHasTexture(material):
+    return material.texture_slots[0]
+
+def faceGetIndices(face):
+    return [face.verts[0], face.verts[1], face.verts[2]]
 
index ddc7e57..09b91b8 100644 (file)
@@ -169,7 +169,7 @@ class MqoExporter(object):
         io.write("}\r\n") \r
 \r
     def __write_object(self, io, info, scene):\r
-        print(info)\r
+        #print(info)\r
 \r
         obj=info.object\r
         if obj.type.upper()!='MESH':\r
index dff4fec..b297a90 100644 (file)
@@ -132,7 +132,41 @@ def __createObjects(scene, mqo, root, materials, imageMap, scale):
         elif o.getName().startswith('bone'):\r
             bl.objectLayerMask(mesh_object, [0, 1])\r
 \r
-        bl.meshAddMqoGeometry(mesh_object, o, materials, imageMap, scale)\r
+        # geometry\r
+        vertices=[(v.x * scale, -v.z * scale, v.y * scale) for v in o.vertices]\r
+        faces=[]\r
+        materialMap={}\r
+        for f in o.faces:\r
+            face_indices=[]\r
+            # flip face\r
+            for i in reversed(range(f.index_count)):\r
+                face_indices.append(f.getIndex(i))\r
+            faces.append(face_indices)\r
+            materialMap[f.material_index]=True\r
+        bl.meshAddGeometry(mesh, vertices, faces)\r
+\r
+        # blender limits 16 materials per mesh\r
+        for i, material_index in enumerate(materialMap.keys()):\r
+            if i>=16:\r
+                # split a mesh ?\r
+                print("over 16 materials!")\r
+                break\r
+            bl.meshAddMaterial(mesh, materials[material_index])\r
+            materialMap[material_index]=i\r
\r
+        # set face params\r
+        assert(len(o.faces)==len(mesh.faces))\r
+        bl.meshAddUV(mesh)\r
+        for i, (f, face) in enumerate(zip(o.faces, mesh.faces)):\r
+            uv_array=[]\r
+            # flip face\r
+            for j in reversed(range(f.index_count)):\r
+                uv_array.append((f.getUV(j).x, 1.0-f.getUV(j).y))\r
+            bl.meshSetFaceUv(mesh, i, face, uv_array, \r
+                    imageMap.get(f.material_index, None))\r
+            if f.material_index in materialMap:\r
+                bl.faceSetMaterial(face, materialMap[f.material_index])\r
+            bl.faceSetSmooth(face, True)\r
 \r
         # mirror modifier\r
         if o.mirror:\r
@@ -141,6 +175,9 @@ def __createObjects(scene, mqo, root, materials, imageMap, scale):
         # set smoothing\r
         bl.meshSetSmooth(mesh, o.smoothing)\r
 \r
+        # calc normal\r
+        #bl.meshRecalcNormals(mesh_object)\r
+\r
     return objects\r
 \r
 \r
index 7ae67a4..9813deb 100644 (file)
@@ -335,12 +335,8 @@ def __import16MaerialAndMesh(meshObject, l,
     bl.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))
+    for v in l.each_vertex():
+        vertices.append(convert_coord(v.pos))
 
     ############################################################
     # face
@@ -366,17 +362,11 @@ def __import16MaerialAndMesh(meshObject, l,
             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]
+            # flip
+            triangle=[i2, i1, i0]
             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_indices.append(triangle[0:3])
             mesh_face_materials.append(material_index)
             used_vertices.add(i0)
             used_vertices.add(i1)
@@ -385,7 +375,7 @@ def __import16MaerialAndMesh(meshObject, l,
     ############################################################
     # create vertices & faces
     ############################################################
-    bl.meshCreateVerteicesAndFaces(mesh, vertices, mesh_face_indices)
+    bl.meshAddGeometry(mesh, vertices, mesh_face_indices)
 
     ############################################################
     # vertex bone weight
@@ -404,7 +394,7 @@ def __import16MaerialAndMesh(meshObject, l,
         l.each_vertex(), mesh.verts):
         # normal, uv
         bl.vertexSetNormal(mvert, convert_coord(v.normal))
-        bl.vertexSetUv(mvert, convert_uv(v.uv))
+        #bl.vertexSetUv(mvert, convert_uv(v.uv))
         # bone weight
         w1=float(v.weight0)/100.0
         w2=1.0-w1
@@ -418,55 +408,26 @@ def __import16MaerialAndMesh(meshObject, l,
     ############################################################
     used_map={}
     bl.meshAddUV(mesh)
+    for i, (face, material_index) in enumerate(
+            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)
+        bl.faceSetMaterial(face, index)
+        material=mesh.materials[index]
+        used_map[index]=True
+        if bl.materialHasTexture(material):
+            uv_array=[l.getUV(i) for i in bl.faceGetIndices(face)]
+            bl.meshSetFaceUv(mesh, i, face, 
+                    # fix uv
+                    [(uv.x, 1.0-uv.y) for uv in uv_array], 
+                    imageMap.get(index, None))
+
+        # set smooth
+        face.smooth = 1
 
-    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()
 
     ############################################################