# MiniLight Python : minimal global illumination renderer
#
# Copyright (c) 2007-2008, Harrison Ainsworth / HXA7241 and Juraj Sukop.
# http://www.hxa7241.org/
from random import choice
from spatialindex import SpatialIndex
from triangle import Triangle
from vector3f import Vector3f, ZERO, ONE, MAX
import re
SEARCH = re.compile('(\(.+\))\s*(\(.+\))').search
MAX_TRIANGLES = 0x100000
class Scene(object):
def __init__(self, in_stream, eye_position):
for line in in_stream:
if not line.isspace():
s, g = SEARCH(line).groups()
self.sky_emission = Vector3f(s).clamped(ZERO, MAX)
self.ground_reflection = Vector3f(g).clamped(ZERO, ONE)
self.triangles = []
try:
for i in range(MAX_TRIANGLES):
self.triangles.append(Triangle(in_stream))
except StopIteration:
pass
self.emitters = [triangle for triangle in self.triangles if not triangle.emitivity.is_zero() and triangle.area > 0.0]
self.index = SpatialIndex(eye_position, self.triangles)
self.get_intersection = self.index.get_intersection
break
## def get_intersection(self, ray_origin, ray_direction, last_hit):
## return self.index.get_intersection(ray_origin, ray_direction, last_hit)
def get_emitter(self):
emitter = None if len(self.emitters) == 0 else choice(self.emitters)
return [(emitter.get_sample_point() if emitter else ZERO), emitter]
def emitters_count(self):
return len(self.emitters)
def get_default_emission(self, back_direction):
return self.sky_emission if back_direction.y < 0.0 else self.sky_emission * self.ground_reflection
|