####################### # (c) Jan Walter 2000 # ####################### # CVS # $Author$ # $Date$ # $RCSfile$ # $Revision$ import Blender import math exportAnimations = 0 class RenderManExport: def __init__(self, filename): self.file = open(filename, "w") self.scene = None self.display = None def export(self, scene): global exportAnimations print "exporting ..." self.scene = scene self.writeHeader() self.display = Blender.getDisplaySettings() if exportAnimations: for frame in xrange(self.display.startFrame, self.display.endFrame + 1): self.writeFrame(frame) else: self.writeFrame(self.display.currentFrame) self.writeEnd() def writeCamera(self): camobj = self.scene.getCurrentCamera() camera = Blender.getCamera(camobj.data) factor = self.display.yResolution / float(self.display.xResolution) self.file.write('Projection "perspective" "fov" [%s]\n' % (360.0 * math.atan(factor * 16.0 / camera.Lens) / math.pi)) self.file.write("Clipping %s %s\n" % (camera.ClSta, camera.ClEnd)) self.file.write("Transform [" + "%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s]\n" % (camobj.inverseMatrix[0][0], camobj.inverseMatrix[0][1], -camobj.inverseMatrix[0][2], camobj.inverseMatrix[0][3], camobj.inverseMatrix[1][0], camobj.inverseMatrix[1][1], -camobj.inverseMatrix[1][2], camobj.inverseMatrix[1][3], camobj.inverseMatrix[2][0], camobj.inverseMatrix[2][1], -camobj.inverseMatrix[2][2], camobj.inverseMatrix[2][3], camobj.inverseMatrix[3][0], camobj.inverseMatrix[3][1], -camobj.inverseMatrix[3][2], camobj.inverseMatrix[3][3])) def writeDisplaySettings(self, frame): self.file.write("Format %s %s %s\n" % (self.display.xResolution, self.display.yResolution, self.display.pixelAspectRatio)) self.file.write('Display "%s" "file" "rgba"\n' % ("frame" + "%04d" % frame + ".tif")) def writeEnd(self): self.file.close() print "... finished" def writeFrame(self, frame): print "frame:", frame Blender.setCurrentFrame(frame) self.file.write("FrameBegin %s\n" % (frame - self.display.startFrame)) self.writeDisplaySettings(frame) self.writeCamera() self.writeWorld() self.file.write("FrameEnd\n") def writeHeader(self): self.file.write("##RenderMan RIB-Structure 1.0\n") self.file.write("version 3.03\n") def writeIdentifier(self, name): self.file.write("%s\n" % ("#" * (len(name) + 4))) self.file.write("# %s #\n" % name) self.file.write("%s\n" % ("#" * (len(name) + 4))) def writeLamp(self, name, num): self.writeIdentifier(name) lampobj = Blender.getObject(name) lamp = Blender.getLamp(lampobj.data) x = lampobj.matrix[3][0] / lampobj.matrix[3][3] y = lampobj.matrix[3][1] / lampobj.matrix[3][3] z = lampobj.matrix[3][2] / lampobj.matrix[3][3] self.file.write('LightSource "pointlight" %s ' % num + '"from" [%s %s %s] ' % (x, y, z) + '"lightcolor" [%s %s %s] ' % (lamp.R, lamp.G, lamp.B) + '"intensity" 50\n') def writeMatrix(self, matrix): self.file.write("Transform [" + "%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s]\n" % (matrix[0][0], matrix[0][1], matrix[0][2], matrix[0][3], matrix[1][0], matrix[1][1], matrix[1][2], matrix[1][3], matrix[2][0], matrix[2][1], matrix[2][2], matrix[2][3], matrix[3][0], matrix[3][1], matrix[3][2], matrix[3][3])) def writeObject(self, name): if Blender.isMesh(name): self.writeIdentifier(name) meshobj = Blender.getObject(name) mesh = Blender.getMesh(meshobj.data) if mesh.texcoords: self.file.write('Surface "paintedplastic" "texturename" ' + '["%s.tif"]\n' % "st") else: self.file.write('Surface "plastic"\n') self.file.write("Color [%s %s %s]\n" % (0.8, 0.8, 0.8)) self.file.write("AttributeBegin\n") self.writeMatrix(meshobj.matrix) index = 0 for face in mesh.faces: if meshobj.materials and meshobj.materials[face[5]]: material = Blender.getMaterial(meshobj.materials[face[5]]) self.file.write("Color [%s %s %s]\n" % (material.R, material.G, material.B)) if face[3]: # quad if face[4]: # smooth # first triangle self.file.write('Polygon "P" [ ') for i in xrange(3): self.file.write("%s %s %s " % (mesh.vertices[face[i]][0], mesh.vertices[face[i]][1], mesh.vertices[face[i]][2])) self.file.write('] "N" [ ') for i in xrange(3): self.file.write("%s %s %s " % (mesh.normals[face[i]][0], mesh.normals[face[i]][1], mesh.normals[face[i]][2])) if mesh.colors: self.file.write('] "Cs" [ ') for i in xrange(3): self.file.write("%s %s %s " % (mesh.colors[face[i]][0], mesh.colors[face[i]][1], mesh.colors[face[i]][2])) self.file.write(']\n') if mesh.texcoords: self.file.write('] "st" [ ') for i in xrange(3): self.file.write("%s %s " % (mesh.texcoords[index+i][0], 1.0 - mesh.texcoords[index+i][1])) self.file.write(']\n') else: self.file.write(']\n') # second triangle self.file.write('Polygon "P" [ ') for i in [0, 2, 3]: self.file.write("%s %s %s " % (mesh.vertices[face[i]][0], mesh.vertices[face[i]][1], mesh.vertices[face[i]][2])) self.file.write('] "N" [ ') for i in [0, 2, 3]: self.file.write("%s %s %s " % (mesh.normals[face[i]][0], mesh.normals[face[i]][1], mesh.normals[face[i]][2])) if mesh.colors: self.file.write('] "Cs" [ ') for i in [0, 2, 3]: self.file.write("%s %s %s " % (mesh.colors[face[i]][0], mesh.colors[face[i]][1], mesh.colors[face[i]][2])) self.file.write(']\n') if mesh.texcoords: self.file.write('] "st" [ ') for i in [0, 2, 3]: self.file.write("%s %s " % (mesh.texcoords[index+i][0], 1.0 - mesh.texcoords[index+i][1])) self.file.write(']\n') else: self.file.write(']\n') else: # not smooth # first triangle self.file.write('Polygon "P" [ ') for i in xrange(3): self.file.write("%s %s %s " % (mesh.vertices[face[i]][0], mesh.vertices[face[i]][1], mesh.vertices[face[i]][2])) if mesh.colors: self.file.write('] "Cs" [ ') for i in xrange(3): self.file.write("%s %s %s " % (mesh.colors[face[i]][0], mesh.colors[face[i]][1], mesh.colors[face[i]][2])) self.file.write(']\n') if mesh.texcoords: self.file.write('] "st" [ ') for i in xrange(3): self.file.write("%s %s " % (mesh.texcoords[index+i][0], 1.0 - mesh.texcoords[index+i][1])) self.file.write(']\n') else: self.file.write(']\n') # second triangle self.file.write('Polygon "P" [ ') for i in [0, 2, 3]: self.file.write("%s %s %s " % (mesh.vertices[face[i]][0], mesh.vertices[face[i]][1], mesh.vertices[face[i]][2])) if mesh.colors: self.file.write('] "Cs" [ ') for i in [0, 2, 3]: self.file.write("%s %s %s " % (mesh.colors[face[i]][0], mesh.colors[face[i]][1], mesh.colors[face[i]][2])) self.file.write(']\n') if mesh.texcoords: self.file.write('] "st" [ ') for i in [0, 2, 3]: self.file.write("%s %s " % (mesh.texcoords[index+i][0], 1.0 - mesh.texcoords[index+i][1])) self.file.write(']\n') else: self.file.write(']\n') else: # triangle if face[4]: # smooth self.file.write('Polygon "P" [ ') for i in xrange(3): self.file.write("%s %s %s " % (mesh.vertices[face[i]][0], mesh.vertices[face[i]][1], mesh.vertices[face[i]][2])) self.file.write('] "N" [ ') for i in xrange(3): self.file.write("%s %s %s " % (mesh.normals[face[i]][0], mesh.normals[face[i]][1], mesh.normals[face[i]][2])) if mesh.colors: self.file.write('] "Cs" [ ') for i in xrange(3): self.file.write("%s %s %s " % (mesh.colors[face[i]][0], mesh.colors[face[i]][1], mesh.colors[face[i]][2])) self.file.write(']\n') if mesh.texcoords: self.file.write('] "st" [ ') for i in xrange(3): self.file.write("%s %s " % (mesh.texcoords[index+i][0], 1.0 - mesh.texcoords[index+i][1])) self.file.write(']\n') else: self.file.write(']\n') else: # not smooth self.file.write('Polygon "P" [ ') for i in xrange(3): self.file.write("%s %s %s " % (mesh.vertices[face[i]][0], mesh.vertices[face[i]][1], mesh.vertices[face[i]][2])) if mesh.colors: self.file.write('] "Cs" [ ') for i in xrange(3): self.file.write("%s %s %s " % (mesh.colors[face[i]][0], mesh.colors[face[i]][1], mesh.colors[face[i]][2])) self.file.write(']\n') if mesh.texcoords: self.file.write('] "st" [ ') for i in xrange(3): self.file.write("%s %s " % (mesh.texcoords[index+i][0], 1.0 - mesh.texcoords[index+i][1])) self.file.write(']\n') else: self.file.write(']\n') index = index + 4 self.file.write("AttributeEnd\n") else: print "Sorry can export meshes only ..." def writeWorld(self): self.file.write("WorldBegin\n") self.file.write('Attribute "light" "shadows" "on"\n') # first all lights lamps = 0 for name in self.scene.objects: if Blender.isLamp(name): lamps = lamps + 1 self.writeLamp(name, lamps) # now all objects which are not a camera or a light for name in self.scene.objects: if not Blender.isCamera(name) and not Blender.isLamp(name): self.writeObject(name) self.file.write("WorldEnd\n") ribexport = RenderManExport("test.rib") scene = Blender.getCurrentScene() ribexport.export(scene)