#! /usr/bin/env python

from lightflowPM import *
from math import *
import sys

s = scene()

s.newInterface( "default",
		[ "trace-depth", 4 ] )

s.newInterface( "surface-engine",
		[ "caching", 48 * 1024 ] )


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


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 ] )

bump = s.newPattern( "multifractal",
		     [ "basis", "ridged",
		       "scale", 0.6,
		       "depth", 0.1,
		       "turbulence.omega", 0.4, 0.7,
		       "turbulence.octaves", 6 ] )

metal = s.newMaterial( "physical",
		       [ "fresnel", 1,
			 "IOR", 9.0,
			 "kr", vector3( 1.0, 0.6, 0.2 ),
			 "kd", 0.1,
			 "km", 0.1,
			 "shinyness", 1.0,
			 "radiosity", 0,
			 "caustics", 1, 1,
			 "displacement", bump ] )


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( metal )

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.1 ] ) )

# destroy arrays
del p

s.materialEnd()


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

s.imagerBegin( saver )

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

s.imagerEnd()


s.render( camera, 400, 400 )
