#! /usr/bin/env python

from lightflowPM import *
from math import *
import sys

s = scene()

s.newInterface( "default",
		[ "trace-depth", 5,
		  "radiosity-depth", 0, 5,
		  "radiosity-sampling", "default",
		  "radiosity-samples", 64,
		  "radiosity-threshold", 0.1,
		  "radiosity-reuse-distance", 0.4, 0.01,
		  "photon-count", 2000000,
		  "photon-clustering-count", 1000, 100 ] )


s.lightOn( s.newLight( "soft", [ "position", vector3( 4.0, -5.0, 5.0 ), "color", vector3( 300.0, 300.0, 300.0 ), "bias", 0.5 ] ) )


sky = s.newMaterial( "matte", [ "kc", vector3( 0.6, 0.8, 1.0 ) ] )

plastic = s.newMaterial( "standard",
			 [ "kc", vector3( 1, 1, 1 ),
			   "kr", vector3( 0.2, 0.2, 0.2 ),
			   "kd", 0.5, "km", 0.1 ] )

glass = s.newMaterial( "generic",
		       [ "fresnel", 1,
			 "IOR", 1.57,
			 "kdr", vector3( 0, 0, 0 ),
 			 "kdt", vector3( 0, 0, 0 ),
			 "ksr", vector3( 0.6, 1.0, 0.8 ),
			 "kst", vector3( 0.6, 0.8, 1.0 ),
			 "kr", vector3( 0.6, 1.0, 0.8 ),
			 "kt", vector3( 0.6, 0.8, 1.0 ),
			 "km", 0.03,
			 "shinyness", 1.0,
			 "transmission", 0,
			 "radiosity", 0,
			 "caustics", 1, 1 ] )


s.materialBegin( sky )

s.addObject( s.newObject( "sphere", [ "radius", 20.0 ] ) )

s.materialEnd()

s.materialBegin( plastic )

s.addObject( s.newObject( "disc", [ "radius", 20.0 ] ) )

s.materialEnd()

s.materialBegin( glass )

p = vector3array()

N = 50
M = 10
R = 1.0
r = 0.2

#alloc arrays
p.setSize( N * M )

for i in range( 0, N ) :
    u = 2.0 * pi * i / N

    for j in range( 0, M ) :
	v = 2.0 * pi * j / M

        index = i + j*N

	p.set( index, vector3( cos(u) * (R + cos(v)*r * (1.0 + cos(u*8.0)*0.8)),
			       sin(u) * (R + cos(v)*r * (1.0 + cos(u*8.0)*0.8)),
			       sin(v)*r * (1.0 + cos(u*8.0)*0.8) + r*(1.8) ) )

    if not (i % 10) :
        sys.stdout.write("\rallocating vertices %d %%" % ((i * 100) / N) )
        sys.stdout.flush()

print

s.addObject( s.newObject( "bspline",
			  [ "size", N, M,
			    "wrap", 1, 1,
			    "step", BSplineStep(), BSplineStep(),
			    "basis", BSplineBasis(), BSplineBasis(),
			    "points", p,
			    "tolerance", 0.02, 0.1, 0.05 ] ) )

# destroy arrays
del p

s.materialEnd()


saver = s.newImager( "tga-saver", [ "file", "bspline3.tga" ] )

s.imagerBegin( saver )

camera = s.newCamera( "pinhole", [ "eye", vector3( -2, -3, 3 ), "aim", vector3( 0, 0, 0 ) ] )

s.imagerEnd()


s.radiosity()

s.render( camera, 400, 400 )
