#!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") xml.fromstring(tabs + "\t" + numToIntXML(index) + "\n") xml.fromstring(tabs + "\t\n") xml.fromstring(tabs + "\t\n") xml.fromstring(tabs + "\t\t" + numToIntXML(0) + "\n") xml.fromstring(tabs + "\t\t\n") xml.extend(xmlBody) xml.fromstring(tabs + "\t\t\n") xml.fromstring(tabs + "\t\n") 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")