Code:
#!BPY
"""
Name: Export to XML
Blender: 228
Group: 'Export'
Tip: 'Export MSX.'
"""
# Exporter by {MSX}
# Released under GPL
import Blender
import sys
from string import *
PATH = "c:\\enter\\your\\path\\"
def dumpFace(fi, num, a,b,c, auv, buv, cuv):
fi.write(" <FACE id=\""+`num`+"\">\n")
fi.write(" <A>"+`a` + "</A>\n")
fi.write(" <AU>"+`auv[0]` + "</AU>\n")
fi.write(" <AV>"+`-auv[1]` + "</AV>\n")
fi.write(" <B>" + `b` + "</B>\n")
fi.write(" <BU>"+`buv[0]` + "</BU>\n")
fi.write(" <BV>"+`-buv[1]` + "</BV>\n")
fi.write(" <C>" + `c` + "</C>\n")
fi.write(" <CU>"+`cuv[0]` + "</CU>\n")
fi.write(" <CV>"+`-cuv[1]` + "</CV>\n")
fi.write(" </FACE>\n")
# dumpMesh -- the object dumper f: File, o: NMesh
def dumpMesh(o):
if o.block_type == 'NMesh' :
filename = lower(o.name) + '.mesh'
print('Exporting ' + filename + ' mesh')
fmesh = open(PATH+filename, 'w')
fmesh.write("<MESH>\n")
mesh = Blender.NMesh.GetRaw(o.name)
# add face UV if it doesn't have
mesh.hasFaceUV(1)
# header
fmesh.write("<NAME>" + lower(o.name) + "</NAME>\n")
# Vertex Coordinate header
fmesh.write("<POINTCOUNT>" + `len(mesh.verts)` + "</POINTCOUNT>\n")
# Verticies
fmesh.write("<POINTS>\n")
i = 0
for vert in mesh.verts:
fmesh.write(" <VERTEX id=\""+`i`+"\">\n")
fmesh.write(" <X>"+`-vert.co[0]` + "</X>\n")
fmesh.write(" <Y>" + `vert.co[2]` + "</Y>\n")
fmesh.write(" <Z>" + `vert.co[1]` + "</Z>\n")
fmesh.write(" <NX>"+`vert.no[0]` + "</NX>\n")
fmesh.write(" <NY>" + `vert.no[2]` + "</NY>\n")
fmesh.write(" <NZ>" + `vert.no[1]` + "</NZ>\n")
fmesh.write(" </VERTEX>\n")
i = i + 1
fmesh.write("</POINTS>\n")
# faces
faces = len(mesh.faces)
i=0
data = ""
colordata = ""
fmesh.write("<FACES>\n")
for face in mesh.faces:
if len(face.v) < 3:
# discard
faces = faces - 1
print 'Face discarded'
elif len(face.v) == 3:
# Already a triangle, add it to the data, do not change the count
# reset face uv if it doesn't have
if len(face.uv) == 0:
face.uv = [(0,0),(0,1),(1,0)]
dumpFace(fmesh, i, face.v[0].index, face.v[1].index, face.v[2].index, face.uv[0], face.uv[1], face.uv[2])
i=i+1
else:
# this one is a quad
# Break it up into two triangles
# Hence one additional face
# reset face uv if it doesn't have
if len(face.uv) == 0:
face.uv = [(0,0),(0,1),(1,0), (1,1)]
faces = faces + 1
dumpFace(fmesh, i, face.v[0].index, face.v[1].index, face.v[3].index, face.uv[0], face.uv[1], face.uv[3])
i=i+1
dumpFace(fmesh, i, face.v[1].index, face.v[2].index, face.v[3].index, face.uv[1], face.uv[2], face.uv[3])
i=i+1
fmesh.write("</FACES>\n")
# Now I can write the the correct face count
fmesh.write("<FACECOUNT>" + `faces` + "</FACECOUNT>\n")
fmesh.write("</MESH>\n")
# Close the file
fmesh.close();
def findTexture(mesh):
for face in mesh.faces:
if face.image:
s = split(face.image.filename, "/")
s1 = split(s[len(s)-1],".")
return s1[0]
return "none"
def DumpObject(f, ob):
textu = findTexture(ob.data)
meshname = lower(ob.data.name)
print "Dumping mesh "+meshname+" texture: "+textu
dumpMesh(ob.data)
f.write(" <BLOCK>\n")
f.write(" <MESH>"+meshname+"</MESH>\n")
f.write(" <TEXTURE>"+textu+"</TEXTURE>\n")
f.write(" <POS>\n")
f.write(" <X>"+`-ob.LocX-ob.dLocX`+"</X>\n")
f.write(" <Y>"+`ob.LocZ+ob.dLocZ`+"</Y>\n")
f.write(" <Z>"+`ob.LocY+ob.dLocY`+"</Z>\n")
f.write(" </POS>\n")
f.write(" <ROT>\n")
f.write(" <X>"+`ob.RotX+ob.dRotX`+"</X>\n")
f.write(" <Y>"+`ob.RotY+ob.dRotY`+"</Y>\n")
f.write(" <Z>"+`-ob.RotZ-ob.dRotZ`+"</Z>\n")
f.write(" </ROT>\n")
f.write(" </BLOCK>\n")
def DumpModel(f, scene):
f.write("<MODEL>\n")
f.write(" <NAME>"+lower(scene.name)+"</NAME>\n")
f.write(" <MESHES>\n")
# Go through the objects and export them
for ob in scene.getChildren():
print (ob.getType())
if ob.getType()=='Mesh':
DumpObject(f, ob)
f.write(" </MESHES>\n")
f.write("</MODEL>\n")
scene = Blender.Scene.getCurrent()
filename = lower(scene.name) + '.model'
print('Exporting ' + filename + ' model')
fout = open(PATH+filename, 'w')
DumpModel(fout, scene)
fout.close();
print('Model exported!')
Bookmarks