demos/render_nff.py
branchpyrit
changeset 72 7c3f38dff082
child 73 a5127346fbcd
--- /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')