rename Python module from 'raytracer' to 'pyrit'
improve Python binding:
- new objects: Container, Octree, KdTree, Shape,
Pixmap, Sampler, DefaultSampler
- all shapes are now subclasses of Shape
- clean, remove redundant Getattr's
- Raytracer render method now just wraps C++ method
without doing any additional work
adjust all demos for changes in Python binding, remove PIL dependency
add demo_PIL.py as a example of pyrit + PIL usage
render_nff.py now either loads file given as a argument
or reads input from stdin otherwise
fix bug in pixmap float to char conversion
#!/usr/bin/python# read nff data from standart input and render image to render_nff.png# see http://tog.acm.org/resources/SPD/# cylinders are not implementedfrom pyrit import *from math import piimport sysrt = Raytracer()top = KdTree()rt.setTop(top)rt.setCamera(Camera())imagesize = (800, 600)mat = Material(colour=(1.0, 1.0, 1.0))f = sys.stdinfbase = "render_nff"if len(sys.argv) > 1: f = open(sys.argv[1]) fbase = sys.argv[1].rsplit('.',1)[0]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)) elif ln[0] == 'pp': # Polygonal patch mat.setSmooth(True) 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])) normal = (float(ln[3]), float(ln[4]), float(ln[5])) vertices.append(NormalVertex(vertex, normal)) 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)) elif ln[0] == '#': # Comment pass else: print "Not implemented:", linef.close()top.optimize()sampler = DefaultSampler(imagesize)rt.setSampler(sampler)rt.render()sampler.getPixmap().writePNG(fbase+'.png')