5 from Blender import Mathutils
11 FS_ENCODING=sys.getfilesystemencoding()
12 if os.path.exists(os.path.dirname(sys.argv[0])+"/utf8"):
13 INTERNAL_ENCODING='utf-8'
15 INTERNAL_ENCODING=FS_ENCODING
18 ###############################################################################
20 ###############################################################################
22 def __init__(self, path, encoding):
23 self.io=open(path, "wb")
24 self.encoding=encoding
36 ###############################################################################
38 ###############################################################################
39 class ProgressBar(object):
40 def __init__(self, base):
41 print("#### %s ####" % base)
43 self.start=Blender.sys.time()
44 self.set('<start>', 0)
46 def advance(self, message, progress):
47 self.progress+=float(progress)
50 def set(self, message, progress):
51 self.progress=float(progress)
54 def _print(self, message):
56 message="%s: %s" % (self.base, message)
57 if message.__class__ is unicode:
58 message=message.encode(FS_ENCODING)
59 Blender.Window.DrawProgressBar(self.progress, message)
63 message='finished in %.2f sec' % (Blender.sys.time()-self.start)
64 self.set(message, 1.0)
67 def progress_start(base):
69 progressBar=ProgressBar(base)
71 def progress_finish():
75 def progress_print(message, progress=0.05):
77 progressBar.advance(message, progress)
79 def progress_set(message, progress):
81 progressBar.set(message, progress)
84 ###############################################################################
85 def createEmptyObject(scene, name):
86 empty=scene.objects.new("Empty")
90 def createMaterial(name):
91 material = Blender.Material.New(name)
94 def createMqoMaterial(m):
95 material = Blender.Material.New(m.getName().encode(INTERNAL_ENCODING))
96 material.mode |= Blender.Material.Modes.SHADELESS
97 material.rgbCol = [m.color.r, m.color.g, m.color.b]
98 material.alpha = m.color.a
99 material.amb = m.ambient
100 material.spec = m.specular
101 material.hard = int(255 * m.power)
104 def createPmdMaterial(m):
105 material=Blender.Material.New()
106 material.setDiffuseShader(Blender.Material.Shaders.DIFFUSE_TOON)
108 material.diffuseSize = 3.14/2
109 material.setDiffuseSmooth(0)
110 material.setSpecShader(Blender.Material.Shaders.SPEC_TOON)
111 material.setSpecSize(0)
113 material.setRGBCol([m.diffuse.r, m.diffuse.g, m.diffuse.b])
114 material.setAlpha(m.diffuse.a)
115 material.setSpec(m.shinness*0.1)
116 material.setSpecCol([m.specular.r, m.specular.g, m.specular.b])
117 material.setMirCol([m.ambient.r, m.ambient.g, m.ambient.b])
118 material.enableSSS=True if m.flag==1 else False
121 def createTexture(path):
122 image = Blender.Image.Load(path.encode(INTERNAL_ENCODING))
123 texture = Blender.Texture.New(path.encode(INTERNAL_ENCODING))
124 texture.type = Blender.Texture.Types.IMAGE
125 texture.image = image
126 return texture, image
128 def materialAddTexture(material, texture):
129 material.mode = material.mode | Blender.Material.Modes.TEXFACE
130 material.setTexture(0, texture, Blender.Texture.TexCo.UV)
133 def createMesh(scene, name):
134 mesh = Blender.Mesh.New()
135 mesh_object=scene.objects.new(mesh, name.encode(INTERNAL_ENCODING))
136 return mesh, mesh_object
139 def objectMakeParent(parent, child):
140 parent.makeParent([child])
143 def meshAddMaterial(mesh, material):
144 mesh.materials+=[material]
147 def meshAddMqoGeometry(mesh_object, o, materials, imageMap, scale):
148 mesh=mesh_object.getData(mesh=True)
150 mesh.verts.extend(Mathutils.Vector(0, 0, 0)) # dummy
151 mesh.verts.extend([(v.x * scale, -v.z * scale, v.y * scale) for v in o.vertices])
156 for i in xrange(face.index_count):
157 face_indices.append(face.getIndex(i)+1)
158 mesh_faces.append(face_indices)
159 #new_faces=mesh.faces.extend([face.indices for face in o.faces],
160 new_faces=mesh.faces.extend(mesh_faces,
165 # gather used materials
170 materialMap[o.faces[i].material_index]=True
172 # blender limits 16 materials per mesh
174 for i, material_index in enumerate(materialMap.keys()):
176 print("over 16 materials!")
178 mesh.materials+=[materials[material_index]]
179 materialMap[material_index]=i
182 for i, f in enumerate(o.faces):
183 if not type(new_faces[i]) is int:
186 face=mesh.faces[new_faces[i]]
189 for i in xrange(f.index_count):
190 uv_array.append(Blender.Mathutils.Vector(
196 except Exception as msg:
198 #print face.index, uv_array
201 if f.material_index in materialMap:
202 face.mat = materialMap[f.material_index]
206 # rmeove dummy 0 vertex
209 mesh.mode |= Blender.Mesh.Modes.AUTOSMOOTH
210 mesh.maxSmoothAngle = int(o.smoothing)
218 mod=mesh_object.modifiers.append(Blender.Modifier.Types.MIRROR)
220 def getTexture(m, dirname):
224 for texture in m.getTextures():
225 if texture and texture.tex and texture.tex.getImage():
226 image=texture.tex.getImage()
229 imagePath=Blender.sys.expandpath(image.getFilename())
230 if len(dirname)>0 and imagePath.startswith(dirname):
232 imagePath=imagePath[len(dirname)+1:len(imagePath)]
234 tex=" tex(\"%s\")" % imagePath
235 elif texture.mtAlpha>0:
236 aplane=" aplane(\"%s\")" % imagePath
239 def objectDuplicate(scene, obj):
240 mesh, dumy=createMesh(scene, obj.name.decode(INTERNAL_ENCODING))
241 # not apply modifiers
242 mesh.getFromObject(obj.name, 1)
244 dumy.setMatrix(obj.matrixWorld)
247 def objectDelete(scene, obj):
248 scene.objects.unlink(obj)
250 def faceVertexCount(face):
253 def faceVertices(face):
255 return [v.index for v in reversed(face.v)]
260 def faceHasUV(mesh, i, face):
261 return len(face.uv)>0
263 def faceGetUV(mesh, i, face, count):
265 return reversed(face.uv)
267 def materialToMqo(m):
268 return "\"%s\" shader(3) col(%f %f %f %f)" % (
269 m.name, m.rgbCol[0], m.rgbCol[1], m.rgbCol[2], m.alpha)
271 def faceMaterialIndex(face):
274 def objectGetData(o):
275 return o.getData(mesh=True)
277 def objectAddArmatureModifier(o, armature_object):
278 mod=o.modifiers.append(Blender.Modifier.Types.ARMATURE)
279 mod[Blender.Modifier.Settings.OBJECT] = armature_object
280 mod[Blender.Modifier.Settings.ENVELOPES] = False
285 def objectGetPose(o):
288 def poseBoneLimit(n, b):
291 if n.startswith("knee_"):
296 b.limitMax=[180, 0, 0]
297 elif n.startswith("ankle_"):
301 Blender.Window.EditMode(1)
304 Blender.Window.EditMode(0)
306 def objectDeselectAll():
307 for o in bpy.data.scenes.active.objects:
310 def objectActivate(scene, o):
312 scene.objects.active=o
314 def objectGetActive(scene):
315 return scene.objects.active
317 def meshAddVertexGroup(meshObject, name):
318 meshObject.getData(mesh=True).addVertGroup(name)
320 def meshUseVertexUv(mesh):
323 def vertexSetNormal(mvert, normal):
324 mvert.no=Mathutils.Vector(*normal)
326 def vertexSetUv(mvert, uv):
329 def meshAssignVertexGroup(meshObject, name, index, weight):
330 meshObject.getData(mesh=True).assignVertsToGroup(name,
331 [index], weight, Blender.Mesh.AssignModes.ADD)
333 def meshCreateVerteicesAndFaces(mesh, vertices, faces):
334 mesh.verts.extend(vertices)
335 mesh.faces.extend(faces, ignoreDups=True)
338 mesh.addUVLayer('NewUV')
340 def meshVertsDelete(mesh, remove_vertices):
341 mesh.verts.delete(remove_vertices)
343 def createArmature(scene):
344 armature = Blender.Armature.New()
345 armature_object = scene.objects.new(armature)
348 armature_object.drawMode = (
349 armature_object.drawMode | Blender.Object.DrawModes.XRAY)
351 armature.drawType = Blender.Armature.OCTAHEDRON
352 armature.drawNames=True
353 armature.envelopes = False
354 armature.vertexGroups = True
355 armature.mirrorEdit = True
357 return armature, armature_object
359 def armatureMakeEditable(scene, armature_object):
361 armature_object.getData().makeEditable()
363 def createIkConstraint(armature_object, p_bone, effector_name, ik):
364 cSetting = Blender.Constraint.Settings
366 constraint = p_bone.constraints.append(Blender.Constraint.Type.IKSOLVER)
367 constraint[cSetting.CHAINLEN]=len(ik.children)
368 constraint[cSetting.TARGET]=armature_object
369 constraint[cSetting.USETIP]=False
370 constraint[cSetting.BONE]=effector_name
371 # not used. place folder when export.
372 constraint[cSetting.ROTWEIGHT]=ik.weight
373 constraint[cSetting.ITERATIONS]=ik.iterations * 10
376 def createArmatureBone(armature, name):
377 bone=Blender.Armature.Editbone()
378 bone.name=name.encode(INTERNAL_ENCODING)
379 armature.bones[name]=bone
382 def boneSetConnected(bone):
383 bone.options+=[Blender.Armature.CONNECTED]
385 def createVector(x, y, z):
386 return Mathutils.Vector(x, y, z)
388 def armatureUpdate(armature):
391 def boneLayerMask(bone, layers):
393 for i, enable in enumerate(layers):
398 def objectLayerMask(object, layers):
400 for i, enable in enumerate(layers):
405 def objectPinShape(o):
408 def objectAddShapeKey(o, name):
409 mesh=o.getData(mesh=True)
411 block=mesh.key.blocks[-1]
412 block.name=name.encode(INTERNAL_ENCODING)
415 def objectActivateShapeKey(o, index):
418 def shapeKeyAssign(shapeKey, index, pos):
419 shapeKey.data[index]=pos
421 def objectIsVisible(obj):
422 return obj.restrictDisplay
424 def meshVertexGroupNames(meshObject):
425 return meshObject.getData(mesh=True).getVertGroupNames()
427 def faceNormal(face):
430 def meshFaceUv(mesh, i, face):
433 def armatureModifierGetObject(m):
434 return m[Blender.Modifier.Settings.OBJECT]
436 def objectHasShapeKey(o):
437 return o.getData(mesh=True).key
439 def objectShapeKeys(o):
440 return o.getData(mesh=True).key.blocks
442 def meshVertexGroup(meshObject, name):
444 for index in meshObject.getData(mesh=True).getVertsFromGroup(name):
445 indices.append(index)
448 def materialGet(scene, material_name):
449 return Blender.Material.Get(material_name)
451 def modifierIsArmature(m):
452 return m.name=="Armature"
454 def boneHeadLocal(b):
455 return b.head['ARMATURESPACE'][0:3]
457 def boneTailLocal(b):
458 return b.tail['ARMATURESPACE'][0:3]
460 def boneIsConnected(b):
461 return Blender.Armature.CONNECTED in b.options
463 def constraintIsIKSolver(c):
464 return c.type==Blender.Constraint.Type.IKSOLVER
467 return c[Blender.Constraint.Settings.CHAINLEN]
470 return c[Blender.Constraint.Settings.BONE]
473 return c[Blender.Constraint.Settings.ITERATIONS]
475 def ikRotationWeight(c):
476 return c[Blender.Constraint.Settings.ROTWEIGHT]
478 def shapeKeyGet(b, index):