--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/demos/render_nff.py Sun Apr 20 16:48:24 2008 +0200
@@ -0,0 +1,81 @@
+#!/usr/bin/python
+
+# read nff data from standart input and render image to render_nff.png
+# see http://tog.acm.org/resources/SPD/
+# only spheres and triangles are implemented
+
+from raytracer import Raytracer, Camera, Light, Material, Sphere, NormalVertex, Triangle
+from math import pi
+import sys, Image
+
+rt = Raytracer()
+imagesize = (800, 600)
+
+mat = Material(colour=(1.0, 1.0, 1.0))
+
+f = sys.stdin
+while True:
+ line = f.readline()
+ if line == "":
+ break;
+ ln = line.split()
+ if ln[0] == 'v': # Viewpoint location
+ # from
+ ln = f.readline().split()
+ assert ln[0] == 'from'
+ eye = (float(ln[1]), float(ln[2]), float(ln[3]))
+ # at
+ ln = f.readline().split()
+ assert ln[0] == 'at'
+ lookat = (float(ln[1]), float(ln[2]), float(ln[3]))
+ # up
+ ln = f.readline().split()
+ assert ln[0] == 'up'
+ up = (float(ln[1]), float(ln[2]), float(ln[3]))
+ # angle
+ ln = f.readline().split()
+ assert ln[0] == 'angle'
+ angle = float(ln[1])
+ # hither
+ ln = f.readline().split()
+ assert ln[0] == 'hither'
+ hither = float(ln[1])
+ # resolution
+ ln = f.readline().split()
+ assert ln[0] == 'resolution'
+ imagesize = (int(ln[1]), int(ln[2]))
+ # set camera as specified
+ cam = Camera(eye=eye, lookat=lookat, up=up)
+ cam.setAngle(angle/180*pi)
+ rt.setcamera(cam)
+ elif ln[0] == 'b': # Background color
+ rt.setbgcolour((float(ln[1]), float(ln[2]), float(ln[3])))
+ elif ln[0] == 'l': # Light
+ pos = (float(ln[1]), float(ln[2]), float(ln[3]))
+ rt.addlight(Light(position=pos))
+ elif ln[0] == 'f': # Fill color and shading parameters
+ colour = (float(ln[1]), float(ln[2]), float(ln[3]))
+ mat = Material(colour=colour)
+ mat.setPhong(0,float(ln[4]),float(ln[5]),float(ln[6]))
+ mat.setTransmissivity(float(ln[7]),float(ln[8]))
+ elif ln[0] == 's': # Sphere
+ center = (float(ln[1]), float(ln[2]), float(ln[3]))
+ radius = float(ln[4])
+ rt.addshape(Sphere(centre=center, radius=radius, material=mat))
+ elif ln[0] == 'p': # Polygon
+ vertex_count = int(ln[1])
+ vertices = []
+ for i in range(vertex_count):
+ ln = f.readline().split()
+ vertex = (float(ln[0]), float(ln[1]), float(ln[2]))
+ vertices.append(NormalVertex(vertex))
+ rt.addshape(Triangle(vertices[0], vertices[1], vertices[2], mat))
+ for i in range(vertex_count)[3:]:
+ rt.addshape(Triangle(vertices[0], vertices[i-1], vertices[i], mat))
+ else:
+ print "Not implemented:", line
+f.close()
+
+data = rt.render(imagesize)
+img = Image.fromstring("RGB", imagesize, data)
+img.save('render_nff.png')