OSDN Git Service

fix export vertex map.
[meshio/meshio.git] / swig / blender / bl25.py
index 3cfd60c..a1ed64b 100755 (executable)
@@ -34,9 +34,12 @@ def message(msg):
 def enterEditMode():
     bpy.ops.object.mode_set(mode='EDIT', toggle=False)
 
-def exitEditMode():
+def enterObjectMode():
     bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
 
+def enterPoseMode():
+    bpy.ops.object.mode_set(mode='POSE', toggle=False)
+
 def createVector(x, y, z):
     return mathutils.Vector([x, y, z])
 
@@ -224,6 +227,22 @@ class object:
         o.add_vertex_to_group(index, 
                     o.vertex_groups[name], weight, 'ADD')
 
+    @staticmethod
+    def createBoneGroup(o, name, color_set='DEFAULT'):
+        # create group
+        object.activate(o)
+        enterPoseMode()
+        bpy.ops.pose.group_add()
+        # set name
+        pose=object.getPose(o)
+        g=pose.active_bone_group
+        g.name=name
+        g.color_set=color_set
+
+    @staticmethod
+    def boneGroups(o):
+        return object.getPose(o).bone_groups
+
 
 class modifier:
     @staticmethod
@@ -279,6 +298,13 @@ class texture:
         texture.use_alpha=True
         return texture, image
 
+    @staticmethod
+    def getPath(t):
+        if  t.type=="IMAGE":
+            image=t.image
+            if image:
+                return image.filename
+
 
 class material:
     @staticmethod
@@ -290,21 +316,40 @@ class material:
         return bpy.data.materials[material_name]
 
     @staticmethod
-    def addTexture(material, texture):
-        material.add_texture(texture, "UV", "COLOR")
-        slot=material.texture_slots[material.active_texture_index]
-        slot.blend_type='MULTIPLY'
-        slot.map_alpha=True
+    def addTexture(material, texture, enable=True):
+        # search free slot
+        index=None
+        for i, slot in enumerate(material.texture_slots):
+            if not slot:
+                index=i
+                break
+        if index==None:
+            return
+
+        if enable:
+            material.add_texture(texture, "UV", "COLOR")
+            slot=material.texture_slots[index]
+            slot.blend_type='MULTIPLY'
+            slot.map_alpha=True
+        else:
+            material.add_texture(texture)
+            material.use_textures[index]=False
+        return index
+
+    @staticmethod
+    def getTexture(material, index):
+        return material.texture_slots[index].texture
 
     @staticmethod
     def hasTexture(material):
         return material.texture_slots[0]
 
     @staticmethod
-    def getTexturePath(m, dirname):
-        tex=""
-        aplane=""
-        # texture
+    def setUseTexture(material, index, enable):
+        material.use_textures[index]=enable
+
+    @staticmethod
+    def eachTexturePath(m):
         for slot in m.texture_slots:
             if slot and slot.texture:
                 texture=slot.texture
@@ -312,17 +357,7 @@ class material:
                     image=texture.image
                     if not image:
                         continue
-                    imagePath=image.filename
-                    if len(dirname)>0 and imagePath.startswith(dirname):
-                        # \e$BAjBP%Q%9$KJQ49$9$k\e(B
-                        imagePath=imagePath[len(dirname)+1:len(imagePath)]
-                    #imagePath=Blender.sys.expandpath(
-                    #        imagePath).replace("\\", '/')
-                    if slot.map_colordiff:
-                        tex=" tex(\"%s\")" % imagePath
-                    elif slot.map_alpha:
-                        aplane=" aplane(\"%s\")" % imagePath
-        return tex, aplane
+                    yield image.filename
 
 
 class mesh:
@@ -377,44 +412,47 @@ class mesh:
 
     @staticmethod
     def hasFaceUV(mesh, i, face):
-        return mesh.active_uv_texture.data[i]
+        return mesh.active_uv_texture and mesh.active_uv_texture.data[i]
 
     @staticmethod
     def getFaceUV(mesh, i, faces, count=3):
-        uvFace=mesh.active_uv_texture.data[i]
-        if count==3:
-            return (uvFace.uv1, uvFace.uv2, uvFace.uv3)
-        elif count==4:
-            return (uvFace.uv1, uvFace.uv2, uvFace.uv3, uvFace.uv4)
+        if mesh.active_uv_texture and mesh.active_uv_texture.data[i]:
+            uvFace=mesh.active_uv_texture.data[i]
+            if count==3:
+                return (uvFace.uv1, uvFace.uv2, uvFace.uv3)
+            elif count==4:
+                return (uvFace.uv1, uvFace.uv2, uvFace.uv3, uvFace.uv4)
+            else:
+                print(count)
+                assert(False)
         else:
-            print(count)
-            assert(False)
+            return ((0, 0), (0, 0), (0, 0), (0, 0))
 
     @staticmethod
-    def setFaceUV(mesh, i, face, uv_array, image):
-        uv_face=mesh.uv_textures[0].data[i]
+    def setFaceUV(m, i, face, uv_array, image):
+        uv_face=m.uv_textures[0].data[i]
         uv_face.uv=uv_array
         if image:
             uv_face.image=image
             uv_face.tex=True
 
     @staticmethod
-    def vertsDelete(mesh, remove_vertices):
+    def vertsDelete(m, remove_vertices):
         enterEditMode()
         bpy.ops.mesh.select_all(action='DESELECT')
-        exitEditMode()
+        enterObjectMode()
 
         for i in remove_vertices:
-            mesh.verts[i].selected=True
+            m.verts[i].selected=True
 
         enterEditMode()
         bpy.ops.mesh.delete(type='VERT')
-        exitEditMode()
+        enterObjectMode()
 
     @staticmethod
-    def setSmooth(mesh, smoothing):
-        mesh.autosmooth_angle=int(smoothing)
-        mesh.autosmooth=True
+    def setSmooth(m, smoothing):
+        m.autosmooth_angle=int(smoothing)
+        m.autosmooth=True
 
     @staticmethod
     def recalcNormals(mesh_object):
@@ -422,15 +460,19 @@ class mesh:
         object.activate(mesh_object)
         enterEditMode()
         bpy.ops.mesh.normals_make_consistent()
-        exitEditMode()
+        enterObjectMode()
+
+    @staticmethod
+    def flipNormals(m):
+        m.flipNormals()
 
     @staticmethod
-    def flipNormals(mesh):
-        mesh.flipNormals()
+    def addMaterial(m, material):
+        m.add_material(material)
 
     @staticmethod
-    def addMaterial(mesh, material):
-        mesh.add_material(material)
+    def getMaterial(m, index):
+        return m.materials[index]
 
 
 class vertex:
@@ -492,7 +534,8 @@ class armature:
 
         armature_object.x_ray=True
         armature.draw_names=True
-        armature.drawtype='OCTAHEDRAL'
+        #armature.drawtype='OCTAHEDRAL'
+        armature.drawtype='STICK'
         armature.deform_envelope=False
         armature.deform_vertexgroups=True
         armature.x_axis_mirror=True