#!BPY
"""
Name: 'java'
Blender: 228
Group: 'Export'
Tip: 'Export java code.'
"""
import Blender
from Blender import Mesh
from array import array
print "moo"
def getTabs(tabCount):
# returns tabCount tab characters as a string
tabs = ""
for i in range(0, tabCount):
tabs = tabs + "\t"
return tabs
def numToFloatXML(theFloat):
# returns the number as an XML string
return "" + str(theFloat) + ""
def numToIntXML(theInt):
return "" + str(theInt) + ""
def vertToArrayChunkXML(vert, tabCount, firstIndex):
# converts a vertex to xml
tabs = getTabs(tabCount)
xml = array('c')
xml.fromstring(tabs + "\n")
xml.fromstring(tabs + "\t" + numToFloatXML(vert[0]) + "\n")
xml.fromstring(tabs + "\n")
xml.fromstring(tabs + "\n")
xml.fromstring(tabs + "\t" + numToFloatXML(vert[1]) + "\n")
xml.fromstring(tabs + "\n")
xml.fromstring(tabs + "\n")
xml.fromstring(tabs + "\t" + numToFloatXML(vert[2]) + "\n")
xml.fromstring(tabs + "\n")
return xml
def triangleToArrayChunkXML(vert1, vert2, vert3, tabCount, firstIndex):
# converts three vertices to xml
xml = array('c')
xml.extend(vertToArrayChunkXML(vert1, tabCount, firstIndex))
xml.extend(vertToArrayChunkXML(vert2, tabCount, firstIndex + 3))
xml.extend(vertToArrayChunkXML(vert3, tabCount, firstIndex + 6))
return xml
def facesToTriangleArrayXML(faces, materialIndex, tabCount):
# converts a list of faces to an array
# returns it in xml format
index = 0
tabs = getTabs(tabCount)
xml = array('c')
xmlBody = array('c')
for face in faces:
if (face.mat == materialIndex) and (len(face) > 2) :
# if there are three of more verices, and
# if it has the correct material index
xmlBody.extend(triangleToArrayChunkXML(face[0], face[1], face[2], tabCount + 3, index))
index = index + 9
if len(face) > 3 :
# if there are 4 vertices.
# this breaks quadrilaterals into triangles
xmlBody.extend(triangleToArrayChunkXML(face[0], face[2], face[3], tabCount + 3, index))
index = index + 9
xml.fromstring(tabs + "\n")
return xml
def facesToArrayXML(faces, materialIndex, tabCount):
# converts a list of faces to an array
# returns it in xml format
index = 0
tabs = getTabs(tabCount)
xml = array('c')
xmlBody = array('c')
for face in faces:
if (face.mat == materialIndex) and (len(face) > 2) :
# if there are three of more verices, and
# if it has the correct material index
xmlBody.extend(triangleToArrayChunkXML(face[0], face[1], face[2], tabCount + 1, index))
index = index + 9
if len(face) > 3 :
# if there are 4 vertices.
# this breaks quadrilaterals into triangles
xmlBody.extend(triangleToArrayChunkXML(face[0], face[2], face[3], tabCount + 1, index))
index = index + 9
xml.fromstring(tabs + "\n")
xml.extend(xmlBody)
xml.fromstring(tabs + "\n")
return xml
def meshComponentToTriangleStripArrayXML(mesh, materialIndex, tabCount):
xml = prepareMeshComponentToTriangleStripArrayXML(mesh, materialIndex, tabCount)
xml = actualMeshToComponentTriangleStripArrayXML(mesh, materialIndex, tabCount)
return xml
def actualMeshToComponentTriangleStripArrayXML(mesh, materialIndex, tabCount):
name = mesh.name
xml = array('c')
xml.fromstring(tabs + "\n")
return xml
def prepareMeshComponentToTriangleStripArrayXML(mesh, materialIndex, tabCount):
# creates a TriangleStripArray from the faces in the mesh
# with the materialIndex specified
tabs = getTabs(tabCount)
xml = array('c')
faces = mesh.faces
name = mesh.name
# initialise the GeometryInfo doover
xml.fromstring(tabs + "\n")
xml.fromstring(tabs + "\t\n")
xml.fromstring(tabs + "\t\n")
xml.extend(facesToArrayXML(faces, materialIndex, tabCount + 2))
xml.fromstring(tabs + "\t\n")
xml.fromstring(tabs + "\n")
# do the Normal Generation
xml.fromstring(tabs + "\n")
xml.fromstring(tabs + "\t\n")
xml.fromstring(tabs + "\t\t\n")
xml.fromstring(tabs + "\t\n")
xml.fromstring(tabs + "\t\n")
xml.fromstring(tabs + "\t\t\n")
xml.fromstring(tabs + "\t\n")
xml.fromstring(tabs + "\n")
# do the Stripification
xml.fromstring(tabs + "\n")
xml.fromstring(tabs + "\t\n")
xml.fromstring(tabs + "\t\t\n")
xml.fromstring(tabs + "\t\n")
xml.fromstring(tabs + "\n")
# return the TriangleStripArray
xml.fromstring(tabs + "\n")
xml.fromstring(tabs + "\t\n")
xml.fromstring(tabs + "\n")
return xml
def meshComponentToShape3DXML(mesh, materialIndex, tabCount):
# creates a Shape3D from all the faces in the mesh with the
# materialIndex specified
tabs = getTabs(tabCount)
xml = array('c')
materials = mesh.getMaterials()
name = mesh.name
xml.extend(prepareMeshComponentToTriangleStripArrayXML(mesh, materialIndex, tabCount))
xml.fromstring(tabs + "\n")
xml.fromstring(tabs + "\t\n")
xml.fromstring(tabs + "\t\t\n")
xml.fromstring(tabs + "\t\n")
xml.fromstring(tabs + "\t\n")
xml.extend(materialToAppearanceXML(materials[materialIndex], tabCount + 2))
xml.fromstring(tabs + "\t\n")
xml.fromstring(tabs + "\n")
return xml
def meshToShape3DXMLList(mesh, tabCount):
# creates a set of Shape3D objects (in XML) stored in a list
tabs = getTabs(tabCount)
theList = []
materials = mesh.getMaterials()
for materialIndex in range(0, len(materials)):
theList.append(meshComponentToShape3DXML(mesh, materialIndex, tabCount))
return theList
def colourToColor3fXML(r, g, b, tabCount):
# turns the rgb values into a Color3f object in XML form
tabs = getTabs(tabCount)
xml = array('c')
xml.fromstring(tabs + "\n")
xml.fromstring(tabs + "\t" + numToFloatXML(r) + "\n")
xml.fromstring(tabs + "\t" + numToFloatXML(g) + "\n")
xml.fromstring(tabs + "\t" + numToFloatXML(b) + "\n")
xml.fromstring(tabs + "\n")
return xml
def materialToMaterialXML(material, tabCount):
# converts a blender material into a java material object
# in xml form
tabs = getTabs(tabCount)
xml = array('c')
xml.fromstring(tabs + "\n")
#ambient colour
xml.extend(colourToColor3fXML( material.R * material.amb,
material.G * material.amb,
material.B * material.amb,
tabCount + 1
))
#emissive colour
xml.extend(colourToColor3fXML( material.emit, material.emit, material.emit, tabCount + 1))
#diffuse colour
xml.extend(colourToColor3fXML( material.R,
material.G,
material.B,
tabCount + 1
))
xml.extend(colourToColor3fXML( material.specR,
material.specG,
material.specB,
tabCount + 1
))
xml.fromstring(tabs + "\t" + numToFloatXML(material.spec * 64) + "\n")
xml.fromstring(tabs + "\n")
return xml
def materialToAppearanceXML(material, tabCount):
# converts the material into a java Appearance object
tabs = getTabs(tabCount)
xml = array('c')
xml.fromstring(tabs + "\n")
xml.fromstring(tabs + "\t\n")
xml.extend(materialToMaterialXML(material, tabCount + 2))
xml.fromstring(tabs + "\t\n")
xml.fromstring(tabs + "\n")
return xml
def outputXML(xml, filename):
# outputs the xml to the file
outXML = array('c', "\n\n")
outXML.extend(xml)
outXML.fromstring("")
openfile = open(filename, "wb")
outXML.tofile(openfile)
openfile.flush()
openfile.close()
print "wrote " + filename
mesh = Blender.Object.getSelected()[0].getData()
print mesh
moo = meshToShape3DXMLList(mesh, 1)
for i in range(0, len(moo)):
outputXML(moo[i], mesh.materials[i].name + "." + mesh.name + ".Shape3D.xml")
print("done")