#!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)
]