# extrude.py for the Golly cellular automata simulator # Extrudes any number of ticks into a 3D object that is loadable in Blender # by Paul Slocum / www.qotile.net # version 1.0 / January 2010 from glife import rect import golly xScale=5 yscale=5 layers=100 roughFileSize=0 estimatedLineLength=125 file = open('3dlife.raw','w') if golly.empty(): golly.show('empty set.') else: layers = int( golly.getstring("How many layers to render:", "100") ) golly.show('processing...') for layer in range(1,layers) : if golly.empty() == False : world = golly.getrect() worldx1 = world[0] worldy1 = world[1] worldx2 = world[0]+world[2] worldy2 = world[1]+world[3] golly.show( 'layer: '+repr(layer) + ' estimated file size: '+repr(roughFileSize/1024/1024)+'MB' ) for x in range( worldx1, worldx2, 1 ) : for y in range( worldy1, worldy2, 1) : if golly.getcell(x,y) : roughFileSize=roughFileSize+estimatedLineLength*3; #file.write( repr((x+0)*xScale)+'.00 '+repr((y+0)*yscale)+'.00 '+repr(layer+0)+'.00 ' ) #file.write( repr((x+1)*xScale)+'.00 '+repr((y+0)*yscale)+'.00 '+repr(layer+0)+'.00 ' ) #file.write( repr((x+1)*xScale)+'.00 '+repr((y+1)*yscale)+'.00 '+repr(layer+0)+'.00 ' ) #file.write( repr((x+0)*xScale)+'.00 '+repr((y+1)*yscale)+'.00 '+repr(layer+0)+'.00 ' ) #file.write( '\n' ) file.write( repr((x+0)*xScale)+'.00 '+repr((y+0)*yscale)+'.00 '+repr(layer+1)+'.00 ' ) file.write( repr((x+1)*xScale)+'.00 '+repr((y+0)*yscale)+'.00 '+repr(layer+1)+'.00 ' ) file.write( repr((x+1)*xScale)+'.00 '+repr((y+1)*yscale)+'.00 '+repr(layer+1)+'.00 ' ) file.write( repr((x+0)*xScale)+'.00 '+repr((y+1)*yscale)+'.00 '+repr(layer+1)+'.00 ' ) file.write( '\n' ) if golly.getcell(x,y-1) == False : roughFileSize=roughFileSize+estimatedLineLength; file.write( repr((x+0)*xScale)+'.00 '+repr((y+0)*yscale)+'.00 '+repr(layer+0)+'.00 ' ) file.write( repr((x+0)*xScale)+'.00 '+repr((y+0)*yscale)+'.00 '+repr(layer+1)+'.00 ' ) file.write( repr((x+1)*xScale)+'.00 '+repr((y+0)*yscale)+'.00 '+repr(layer+1)+'.00 ' ) file.write( repr((x+1)*xScale)+'.00 '+repr((y+0)*yscale)+'.00 '+repr(layer+0)+'.00 ' ) file.write( '\n' ) file.write( repr((x+0)*xScale)+'.00 '+repr((y+1)*yscale)+'.00 '+repr(layer+0)+'.00 ' ) file.write( repr((x+0)*xScale)+'.00 '+repr((y+1)*yscale)+'.00 '+repr(layer+1)+'.00 ' ) file.write( repr((x+1)*xScale)+'.00 '+repr((y+1)*yscale)+'.00 '+repr(layer+1)+'.00 ' ) file.write( repr((x+1)*xScale)+'.00 '+repr((y+1)*yscale)+'.00 '+repr(layer+0)+'.00 ' ) file.write( '\n' ) if golly.getcell(x-1,y) == False : roughFileSize=roughFileSize+estimatedLineLength; file.write( repr((x+0)*xScale)+'.00 '+repr((y+0)*yscale)+'.00 '+repr(layer+0)+'.00 ' ) file.write( repr((x+0)*xScale)+'.00 '+repr((y+1)*yscale)+'.00 '+repr(layer+0)+'.00 ' ) file.write( repr((x+0)*xScale)+'.00 '+repr((y+1)*yscale)+'.00 '+repr(layer+1)+'.00 ' ) file.write( repr((x+0)*xScale)+'.00 '+repr((y+0)*yscale)+'.00 '+repr(layer+1)+'.00 ' ) file.write( '\n' ) file.write( repr((x+1)*xScale)+'.00 '+repr((y+0)*yscale)+'.00 '+repr(layer+0)+'.00 ' ) file.write( repr((x+1)*xScale)+'.00 '+repr((y+1)*yscale)+'.00 '+repr(layer+0)+'.00 ' ) file.write( repr((x+1)*xScale)+'.00 '+repr((y+1)*yscale)+'.00 '+repr(layer+1)+'.00 ' ) file.write( repr((x+1)*xScale)+'.00 '+repr((y+0)*yscale)+'.00 '+repr(layer+1)+'.00 ' ) file.write( '\n' ) #file.write( 'layer:'+repr(layer)+' x:'+repr(x)+' y:'+repr(y)+'\n' ) golly.run(1) golly.show('complete.')