# MiniLight Python : minimal global illumination renderer
#
# Copyright (c) 2007-2008, Harrison Ainsworth / HXA7241 and Juraj Sukop.
# http://www.hxa7241.org/
#import psyco
#psyco.full()
from camera import Camera
from image import Image
from scene import Scene
from math import log10
from sys import argv, stdout
from time import time
BANNER = '''
MiniLight 1.5.2 Python
Copyright (c) 2008, Harrison Ainsworth / HXA7241 and Juraj Sukop.
http://www.hxa7241.org/minilight/
'''
HELP = '''
----------------------------------------------------------------------
MiniLight 1.5.2 Python
Copyright (c) 2008, Harrison Ainsworth / HXA7241 and Juraj Sukop.
http://www.hxa7241.org/minilight/
2008-02-17
----------------------------------------------------------------------
MiniLight is a minimal global illumination renderer.
usage:
minilight image_file_pathname
The model text file format is:
#MiniLight
iterations
imagewidth imageheight
viewposition viewdirection viewangle
skyemission groundreflection
vertex0 vertex1 vertex2 reflectivity emitivity
vertex0 vertex1 vertex2 reflectivity emitivity
...
-- where iterations and image values are ints, viewangle is a float,
and all other values are three parenthised floats. The file must end
with a newline. Eg.:
#MiniLight
100
200 150
(0 0.75 -2) (0 0 1) 45
(3626 5572 5802) (0.1 0.09 0.07)
(0 0 0) (0 1 0) (1 1 0) (0.7 0.7 0.7) (0 0 0)
'''
MODEL_FORMAT_ID = '#MiniLight'
SAVE_PERIOD = 180
def save_image(image_file_pathname, image, frame_no):
image_file = open(image_file_pathname, 'wb')
image.get_formatted(image_file, frame_no - 1)
image_file.close()
if __name__ == '__main__':
if len(argv) < 2 or argv[1] == '-?' or argv[1] == '--help':
print HELP
else:
print BANNER
model_file_pathname = argv[1]
image_file_pathname = model_file_pathname + '.ppm'
model_file = open(model_file_pathname, 'r')
if model_file.next().strip() != MODEL_FORMAT_ID:
raise 'invalid model file'
for line in model_file:
if not line.isspace():
iterations = int(line)
break
image = Image(model_file)
camera = Camera(model_file)
scene = Scene(model_file, camera.view_position)
model_file.close()
last_time = time() - (SAVE_PERIOD + 1)
try:
for frame_no in range(1, iterations + 1):
camera.get_frame(scene, image)
if SAVE_PERIOD < time() - last_time or frame_no == iterations:
last_time = time()
save_image(image_file_pathname, image, frame_no)
stdout.write('\b' * ((int(log10(frame_no - 1)) if frame_no > 1 else -1) + 12) + 'iteration: %u' % frame_no)
stdout.flush()
print '\nfinished'
except KeyboardInterrupt:
save_image(image_file_pathname, image, frame_no)
print '\ninterupted'
|