############################################################################################ from Blender import * from Blender import Draw from Blender import BGL from Blender import Window ############################################################################################ status='' error=False obj=0 mesh=0 filename="" normals=True texCoords=False materials=False faceMode=False frame=False frameHierarchy=False ############################################################################################ if(len(Object.GetSelected())>0): obj=Object.GetSelected()[0] mesh=obj.getData(mesh=1) filename=obj.getName()+".x" try: mesh.verts status='Exporting '+obj.getName()+' to Direct-X Format' except: status='Error: Please select a mesh object!' error=True else: status='Error: Please select a mesh object!' error=True ############################################################################################ def filename_callback(str): global filename filename=str def draw(): BGL.glClearColor(0.5,0.7,0.5,1) BGL.glClear(BGL.GL_COLOR_BUFFER_BIT) BGL.glColor3i(0,0,0) BGL.glRasterPos2i(10,190) Draw.Text(status) if(not error): Draw.String("Filename: ",1,10,70,300,20,filename,200,"Filename i.e. car.x") Draw.PushButton("Browse",2,315,70,50,20,"Browse directory for exporting your model.") Draw.PushButton("Export",3,130,10,100,50,"Export the model now.") Draw.Toggle("Normals",4,10,100,100,20,normals,"Export normals.") Draw.Toggle("Texture UVs",5,120,100,100,20,texCoords,"Export texture coordinates.") Draw.Toggle("Material",6,230,100,100,20,materials,"Export materials and texure filenames.") Draw.Toggle("Face Mode",7,10,130,100,20,faceMode,"Every face has it's own vertices, normals and texture coordinates.") Draw.Toggle("Frame",8,10,160,100,20,frame,"Export a frame with matrix for the selected object.") Draw.Toggle("Frame Hierarchy",9,120,160,100,20,frameHierarchy,"Export the frame hierarchy of the selected object") Draw.PushButton("Exit",0,10,10,100,50,"Exit mgXPort now.") def button(evt): global faceMode,frame,frameHierarchy if(evt==0): Draw.Exit() return elif(evt==2): Window.FileSelector(filename_callback,"Create X-File",obj.getName()+'.x') elif(evt==3): export() elif(evt==4): global normals normals=not normals elif(evt==5): global texCoords if(not faceMode): if(not texCoords): if not mesh.vertexUV: Draw.PupMenu("Error: UVs are not sticky!") else: texCoords=True else: texCoords=not texCoords elif(evt==6): global materials if len(mesh.materials)>0: for m in mesh.materials: if m==None: Draw.PupMenu('You have to assign all materials.') else: materials=not materials else: Draw.PupMenu('You have to create a material.') elif(evt==7): if not mesh.vertexUV: texCoords=False faceMode=not faceMode elif(evt==8): frame=not frame if not frame: frameHierarchy=False elif(evt==9): frameHierarchy=not frameHierarchy if(frameHierarchy): frame=True; Draw.Redraw(0) def event(evt,val): if(evt==Draw.ESCKEY): Draw.Exit() return Draw.Register(draw,event,button) ############################################################################################ def getChildrenOfObject(obj): children=[] scene=Scene.GetCurrent() for o in scene.objects: if o.getParent()==obj: children+=[o] return children ############################################################################################ def export(): global status file=open(filename,"w") file.write("xof 0303txt 0032") file.write("//exported by mgXPort from Blender\n") if(frame): export_frame(file,obj) else: if(faceMode): export_mesh_faceMode(file,mesh) else: export_mesh(file,mesh) status=obj.getName()+' was exported sucessfully!' file.close() ############################################################################################ def export_frame(file,obj): file.write('Frame '+obj.getName().replace('.','_')+'\n{\n') file.write('FrameTransformMatrix \n{\n %f,%f,%f,%f,\n%f,%f,%f,%f,\n%f,%f,%f,%f,\n%f,%f,%f,%f;;\n}\n'% (obj.mat[0][0],obj.mat[0][1],obj.mat[0][2],obj.mat[0][3], obj.mat[1][0],obj.mat[1][1],obj.mat[1][2],obj.mat[1][3], obj.mat[2][0],obj.mat[2][1],obj.mat[2][2],obj.mat[2][3], obj.mat[3][0],obj.mat[3][1],obj.mat[3][2],obj.mat[3][3])) mesh=obj.getData(mesh=1) if(mesh): if(faceMode): export_mesh_faceMode(file,mesh) else: export_mesh(file,mesh) if frameHierarchy: for child in getChildrenOfObject(obj): export_frame(file,child) file.write('}\n') ############################################################################################ def export_mesh(file,mesh): file.write('Mesh\n{\n') vertexCount=len(mesh.verts) file.write('%i;\n'%vertexCount) i=0 for vert in mesh.verts: i=i+1 if(i==vertexCount): file.write('%f;%f;%f;;\n'%(vert.co[0],vert.co[1],vert.co[2])) else: file.write('%f;%f;%f;,\n'%(vert.co[0],vert.co[1],vert.co[2])) export_faces(file,mesh) if(normals): export_normals(file,mesh) if(texCoords): export_texCoords(file,mesh) if(materials): export_materialList(file,mesh) file.write('}\n') ############################################################################################ def export_mesh_faceMode(file,mesh): file.write('Mesh\n{\n') vertexCount=0 for face in mesh.faces: vertexCount+=len(face.verts) file.write('%i;\n'%vertexCount) i=0 for face in mesh.faces: for vert in face.verts: i=i+1 if(i==vertexCount): file.write('%f;%f;%f;;\n'%(vert.co[0],vert.co[1],vert.co[2])) else: file.write('%f;%f;%f;,\n'%(vert.co[0],vert.co[1],vert.co[2])) export_faces_faceMode(file,mesh) if(normals): export_normals_faceMode(file,mesh) if(texCoords): export_texCoords_faceMode(file,mesh) if(materials): export_materialList(file,mesh) file.write('}\n') ############################################################################################ def export_faces(file,mesh): faceCount=len(mesh.faces) file.write('%i;\n'%faceCount) i=0 for face in mesh.faces: i=i+1 faceVertexCount=len(face.verts) file.write('%i; '%faceVertexCount) l=0 for vert in face.verts: l=l+1 if(l==len(face.verts)): file.write('%i;'%vert.index) else: file.write('%i,'%vert.index) if(i==faceCount): file.write(';\n') else: file.write(',\n') ############################################################################################ def export_faces_faceMode(file,mesh): faceCount=len(mesh.faces) file.write('%i;\n'%faceCount) vertexIndex=0 i=0 for face in mesh.faces: i=i+1 faceVertexCount=len(face.verts) file.write('%i; '%faceVertexCount) l=0 for vert in face.verts: l=l+1 if(l==len(face.verts)): file.write('%i;'%vertexIndex) else: file.write('%i,'%vertexIndex) vertexIndex+=1 if(i==faceCount): file.write(';\n') else: file.write(',\n') ############################################################################################ def export_normals(file,mesh): file.write('MeshNormals\n{\n') normalCount=len(mesh.verts) file.write('%i;\n'%normalCount) i=0 for vert in mesh.verts: i=i+1 if(i==normalCount): file.write('%f;%f;%f;;\n'%(vert.no[0],vert.no[1],vert.no[2])) else: file.write('%f;%f;%f;,\n'%(vert.no[0],vert.no[1],vert.no[2])) export_faces(file,mesh) file.write('}\n') ############################################################################################ def export_normals_faceMode(file,mesh): file.write('MeshNormals\n{\n') normalCount=0 for face in mesh.faces: normalCount+=len(face.verts) file.write('%i;\n'%normalCount) i=0 for face in mesh.faces: for vert in face: i=i+1 if(i==normalCount): file.write('%f;%f;%f;;\n'%(vert.no[0],vert.no[1],vert.no[2])) else: file.write('%f;%f;%f;,\n'%(vert.no[0],vert.no[1],vert.no[2])) export_faces_faceMode(file,mesh) file.write('}\n') ############################################################################################ def export_texCoords(file,mesh): file.write('MeshTextureCoords\n{\n') vertexCount=len(mesh.verts) file.write('%i;\n'%vertexCount) i=0 for vert in mesh.verts: i=i+1 if(i==vertexCount): file.write('%f;%f;;\n'%(vert.uvco[0],vert.uvco[1])) else: file.write('%f;%f;,\n'%(vert.uvco[0],vert.uvco[1])) file.write('}\n') ############################################################################################ def export_texCoords_faceMode(file,mesh): file.write('MeshTextureCoords\n{\n') vertexCount=0 for face in mesh.faces: vertexCount+=len(face.verts) file.write('%i;\n'%vertexCount) i=0 for face in mesh.faces: for uv in face.uv: i=i+1 if(i==vertexCount): file.write('%f;%f;;\n'%(uv[0],uv[1])) else: file.write('%f;%f;,\n'%(uv[0],uv[1])) file.write('}\n') ############################################################################################ def export_materialList(file,mesh): file.write('MeshMaterialList\n{\n') materialCount=len(mesh.materials) file.write('%i;\n'%materialCount) faceCount=len(mesh.faces) file.write('%i;\n'%faceCount) i=0 for face in mesh.faces: i=i+1 if(i==faceCount): file.write("%i;;\n"%face.mat) else: file.write("%i,\n"%face.mat) export_materials(file,mesh) file.write("}\n") ############################################################################################ def export_materials(file,mesh): for mat in mesh.materials: reflectivity=mat.getRef() col=mat.getRGBCol() specularCol=mat.getSpecCol() specularity=mat.getSpec() alpha=mat.getAlpha() hardness=mat.getHardness() emit=mat.getEmit() diffuse=[reflectivity*col[0],reflectivity*col[1],reflectivity*col[2],alpha] specular=[specularity*specularCol[0],specularity*specularCol[1],specularity*specularCol[2]] power=hardness emissive=[emit*diffuse[0],emit*diffuse[1],emit*diffuse[2]] file.write('Material '+mat.getName()+' \n{\n') file.write('%f;%f;%f;%f;;\n%i;\n%f;%f;%f;;\n%f;%f;%f;;'% (diffuse[0],diffuse[1],diffuse[2],diffuse[3],power, specular[0],specular[1],specular[2],emissive[0],emissive[1],emissive[2])) textures=mat.getTextures() for texture in textures: if(texture): image=texture.tex.getImage() if(not image==None): file.write('TextureFilename{ "'+image.getFilename()+'"; }\n') break; file.write('}\n')