#!BPY """ Registration info for Blender menus: Name: 'Panda3D(.egg)...' Blender: 240 Group: 'Export' Submenu: 'Export all the scene' export Tip: 'Export to egg text file format.' """ __author__ = "Arben (Ben) Omari" __url__ = ("blender", "elysiun", "Author's site, http://www.omariben.too.it") __version__ = "1.0" __bpydoc__ = """\ This script exports a Blender mesh in Panda3D(.egg) text file format. Notes:
Check author's site or the elYsiun forum for a new beta version of the Panda3D exporter. """ import Blender from Blender import Types, Object, NMesh, Material,Armature from Blender.Mathutils import * global DART DART = 1 #*********************************************** #*********************************************** # EGG EXPORTER #*********************************************** #*********************************************** class EggExport: def __init__(self, filename): self.file = open(filename, "w") def Begin(self): self.writeCoordSyst() for obj in Object.Get(): mesh = obj.getData() if type(mesh) == Types.NMeshType : self.writeTextures(mesh) self.writeMaterials(mesh) self.file.write(" %s {\n" % (obj.name)) if DART: self.file.write(" {%s}\n" % (DART)) self.writeMeshCoord(obj, mesh) self.file.write("}\n") #*********************************************** #HEADER #*********************************************** def writeCoordSyst(self): self.file.write(" { Z-Up }\n\n") #*********************************************** #EXPORT MESH DATA #*********************************************** def writeMeshCoord(self, obj, mesh): mat = obj.matrixWorld x_world = mat[3][0] y_world = mat[3][1] z_world = mat[3][2] self.file.write(" %s {\n" % (obj.name)) #VERTICES COORDINATES counter = -1 for face in mesh.faces: for n in range(len(face.v)): counter += 1 self.file.write(" %s {\n" % (counter)) self.file.write(" %f %f %f\n" % (face.v[n].co[0]+x_world, face.v[n].co[1]+y_world, face.v[n].co[2]+z_world)) #self.writeVertColor(face, n) self.writeVertTextureCoords(mesh, face, n) self.file.write(" }\n") self.file.write("}\n") self.file.write(" %s {\n" % (obj.name)) #FACES counter = 0 mater = mesh.getMaterials() for face in mesh.faces : self.file.write(" {\n") self.writeFaceNormal(face) if face.image: self.writeFaceTextureName(face) if mater : self.writeFaceMatName(mater[face.mat]) self.writeFaceMatRef(mater[face.mat]) #FACE VERTICES if len(face.v) == 3: self.file.write(" {") self.file.write("%s %s %s " % (counter, counter + 1, counter + 2)) self.file.write("") self.file.write(" { %s } }\n" % (obj.name)) counter += 3 elif len(face.v) == 4: self.file.write(" {") self.file.write("%s %s %s %s " % (counter, counter + 1, counter + 2, counter + 3)) self.file.write("") self.file.write(" { %s } }\n" % (obj.name)) counter += 4 elif len(face.v) < 3: print "WARNING:the mesh has faces with less then 3 vertices(edges and points)" print " It my be not exported correctly." self.file.write(" }\n") self.file.write("}\n") #*********************************************** #MESH TEXTURE COORDS #*********************************************** def writeVertTextureCoords(self, mesh, face, n): if mesh.hasFaceUV(): self.file.write(" {") #UV COORDS self.file.write(" %s %s" % (face.uv[n][0], face.uv[n][1])) self.file.write(" }\n") #*********************************************** #MESH NORMALS #*********************************************** def writeFaceNormal(self, face): self.file.write(" {") #FACE NORMAL self.file.write(" %f %f %f " %(face.no[0], face.no[1], face.no[2])) self.file.write("}\n") #*********************************************** #MESH TEXTURE REF #*********************************************** def writeFaceTextureName(self, face): self.file.write(" {") filename = face.image.name name = Blender.sys.splitext(filename)[0] self.file.write(' %s '% (name)) self.file.write("}\n") #*********************************************** #MESH Material REF #*********************************************** def writeFaceMatRef(self, mat): self.file.write(" {") self.file.write(' %s '% (mat.name)) self.file.write("}\n") #*********************************************** #MESH TEXTURE #*********************************************** def writeTextures(self, mesh): tex = [] for face in mesh.faces: if face.image and face.image.name not in tex: tex.append(face.image.name) for filename in tex : #filename = face.image.name name = Blender.sys.splitext(filename)[0] self.file.write(" %s { \n" % (name)) self.file.write(' "%s" \n' % (filename)) self.file.write("}\n\n") #*********************************************** #MESH Material REF #*********************************************** def writeFaceMatName(self, mat): self.file.write(" {") self.file.write(' %s %s %s %s '% (mat.R, mat.G, mat.B,mat.alpha)) self.file.write("}\n") #*********************************************** # Vertex Colours #*********************************************** def writeVertColor(self, face, n): vcol = face.col[n] r = vcol.r / 255 g = vcol.g / 255 b = vcol.b / 255 self.file.write(" {") self.file.write(' %f %f %f %f '% (r, g, b, 0.2)) self.file.write("}\n") #*********************************************** #MESH Materials #*********************************************** def writeMaterials(self, mesh): for mat in Material.Get(): self.file.write(" %s { \n" % (mat.name)) self.file.write(" diffr {%s}\n" % (mat.R)) self.file.write(" diffg {%s}\n" % (mat.G)) self.file.write(" diffb {%s}\n" % (mat.B)) self.file.write(" specr {%s}\n" % (mat.specR)) self.file.write(" specg {%s}\n" % (mat.specG)) self.file.write(" specb {%s}\n" % (mat.specB)) self.file.write(" shininess {%s}\n" % (mat.spec)) self.file.write("}\n") #*********************************************** # MAIN #*********************************************** def my_callback(filename): if filename.find('.egg', -4) <= 0: filename += '.egg' egg_export = EggExport(filename) egg_export.Begin() arg = __script__['arg'] fname = Blender.sys.makename(ext = ".egg") Blender.Window.FileSelector(my_callback, "Export Panda3D",fname)