forked from bartvdbraak/blender
333 lines
16 KiB
Python
333 lines
16 KiB
Python
|
#######################
|
||
|
# (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)
|