import sys, os class File: def __init__(self,fnam="out.pov",*items): self.file = open(fnam,"w") self.__indent = 0 self.write(*items) def include(self,name): self.writeln( '#include "%s"'%name ) self.writeln() def indent(self): self.__indent += 1 def dedent(self): self.__indent -= 1 assert self.__indent >= 0 def block_begin(self): self.writeln( "{" ) self.indent() def block_end(self): self.dedent() self.writeln( "}" ) if self.__indent == 0: # blank line if this is a top level end self.writeln( ) def write(self,*items): for item in items: if type(item) == str: self.include(item) else: item.write(self) def writeln(self,s=""): #print " "*self.__indent+s self.file.write(" "*self.__indent+s+os.linesep) class Vector: def __init__(self,*args): if len(args) == 1: self.v = args[0] else: self.v = args def __str__(self): return "<%s>"%(", ".join([str(x)for x in self.v])) def __repr__(self): return "Vector(%s)"%self.v def __mul__(self,other): return Vector( [r*other for r in self.v] ) def __rmul__(self,other): return Vector( [r*other for r in self.v] ) class Item: def __init__(self,name,args=[],opts=[],**kwargs): self.name = name args=list(args) for i in range(len(args)): if type(args[i]) == tuple or type(args[i]) == list: args[i] = Vector(args[i]) self.args = args self.opts = opts self.kwargs=kwargs def append(self, item): self.opts.append( item ) def write(self, file): file.writeln( self.name ) file.block_begin() if self.args: file.writeln( ", ".join([str(arg) for arg in self.args]) ) for opt in self.opts: if hasattr(opt,"write"): opt.write(file) else: file.writeln( str(opt) ) for key,val in self.kwargs.items(): if type(val)==tuple or type(val)==list: val = Vector(*val) file.writeln( "%s %s"%(key,val) ) else: file.writeln( "%s %s"%(key,val) ) file.block_end() def __setattr__(self,name,val): self.__dict__[name]=val if name not in ["kwargs","args","opts","name"]: self.__dict__["kwargs"][name]=val def __setitem__(self,i,val): if i < len(self.args): self.args[i] = val else: i += len(args) if i < len(self.opts): self.opts[i] = val def __getitem__(self,i,val): if i < len(self.args): return self.args[i] else: i += len(args) if i < len(self.opts): return self.opts[i] class Texture(Item): def __init__(self,*opts,**kwargs): Item.__init__(self,"texture",(),opts,**kwargs) class Pigment(Item): def __init__(self,*opts,**kwargs): Item.__init__(self,"pigment",(),opts,**kwargs) class Finish(Item): def __init__(self,*opts,**kwargs): Item.__init__(self,"finish",(),opts,**kwargs) class Normal(Item): def __init__(self,*opts,**kwargs): Item.__init__(self,"normal",(),opts,**kwargs) class Camera(Item): def __init__(self,*opts,**kwargs): Item.__init__(self,"camera",(),opts,**kwargs) class LightSource(Item): def __init__(self,v,*opts,**kwargs): Item.__init__(self,"light_source",(Vector(v),),opts,**kwargs) class Background(Item): def __init__(self,*opts,**kwargs): Item.__init__(self,"background",(),opts,**kwargs) class Box(Item): def __init__(self,v1,v2,*opts,**kwargs): #self.v1 = Vector(v1) #self.v2 = Vector(v2) Item.__init__(self,"box",(v1,v2),opts,**kwargs) class Cylinder(Item): def __init__(self,v1,v2,r,*opts,**kwargs): " opts: open " Item.__init__(self,"cylinder",(v1,v2,r),opts,**kwargs) class Plane(Item): def __init__(self,v,r,*opts,**kwargs): Item.__init__(self,"plane",(v,r),opts,**kwargs) class Torus(Item): def __init__(self,r1,r2,*opts,**kwargs): Item.__init__(self,"torus",(r1,r2),opts,**kwargs) class Cone(Item): def __init__(self,v1,r1,v2,r2,*opts,**kwargs): " opts: open " Item.__init__(self,"cone", (v1,r1,v2,r2),opts,**kwargs) class Sphere(Item): def __init__(self,v,r,*opts,**kwargs): Item.__init__(self,"sphere",(v,r),opts,**kwargs) class Union(Item): def __init__(self,*opts,**kwargs): Item.__init__(self,"union",(),opts,**kwargs) class Intersection(Item): def __init__(self,*opts,**kwargs): Item.__init__(self,"intersection",(),opts,**kwargs) class Difference(Item): def __init__(self,*opts,**kwargs): Item.__init__(self,"difference",(),opts,**kwargs) class Merge(Item): def __init__(self,*opts,**kwargs): Item.__init__(self,"merge",(),opts,**kwargs) x = Vector(1,0,0) y = Vector(0,1,0) z = Vector(0,0,1) white = Texture(Pigment(color=(1,1,1))) def tutorial31(): " from the povray tutorial sec. 3.1" file=File("demo.pov","colors.inc","stones.inc") cam = Camera(location=(0,2,-3),look_at=(0,1,2)) sphere = Sphere( (0,1,2), 2, Texture(Pigment(color="Yellow"))) light = LightSource( (2,4,-3), color="White") file.write( cam, sphere, light ) def spiral(): " Fibonacci spiral " gamma = (sqrt(5)-1)/2 file = File() Camera(location=(0,0,-128), look_at=(0,0,0)).write(file) LightSource((100,100,-100), color=(1,1,1)).write(file) LightSource((150,150,-100), color=(0,0,0.3)).write(file) LightSource((-150,150,-100), color=(0,0.3,0)).write(file) LightSource((150,-150,-100), color=(0.3,0,0)).write(file) theta = 0.0 for i in range(200): r = i * 0.5 color = 1,1,1 v = [ r*sin(theta), r*cos(theta), 0 ] Sphere( v, 0.7*sqrt(i), Texture( Finish( ambient = 0.0, diffuse = 0.0, reflection = 0.85, specular = 1 ), Pigment(color=color)) ).write(file) theta += gamma * 2 * pi