#! /usr/bin/env python

from math import *
from lightflowPM import *

s = scene()

s.lightOn( s.newLight( "soft",
		       [ "position", vector3( -4, -7, 6 ),
			 "color", vector3( 450, 450, 450 ) ] ) )

s.lightOn( s.newLight( "soft",
		       [ "position", vector3( 9, -5, 2 ),
			 "color", vector3( 350, 0.5 * 350, 0.6 * 350 ) ] ) )

ambient = s.newMaterial( "diffuse",
			 [ "ka", vector3( 0.1, 0.1, 0.1 ),
			   "kr", vector3( 0.7, 0.7, 0.7 ) ] )

pits = s.newPattern( "pits",
		     [ "area", 0.5,
		       "size", 0.02,
		       "power", 5.0,
		       "scale", 0.6,
		       "depth", 0.01 ] )

pastella = s.newPattern( "multifractal-RGB",
			 [ "rcolor",
			   0.0, vector3(1.0, 1.0, 0.9), vector3(1.0, 1.0, 0.9),
			   1.0, vector3(0.5, 0.2, 0.0), vector3(0.5, 0.2, 0.0),
			   "gcolor",
			   0.0, vector3(0.9, 0.9, 1.0), vector3(0.9, 0.9, 1.0),
			   0.5, vector3(1.0, 0.8, 0.6), vector3(1.0, 0.8, 0.6),
			   1.0, vector3(0.5, 1.0, 0.6), vector3(0.5, 1.0, 0.6),
			   "bcolor",
			   0.0, vector3(0.9, 1.0, 1.0), vector3(0.9, 1.0, 1.0),
			   1.0, vector3(1.0, 0.8, 0.6), vector3(1.0, 0.8, 0.6),
			   "scale", 0.4 ] )

metal = s.newMaterial( "standard",
		       [ "fresnel", 1, 0.2, 0.2,
			 "IOR", 5.0,
			 "kc", vector3( 0.9, 0.9, 1 ),
			 "kr", vector3( 0.9 * 0.35, 0.9 * 0.35, 0.35 ),
			 "kd", 0.5,
			 "km", 0.1,
			 "kc", pastella,
			 "shinyness", 1.0,
			 "displacement", pits ] )

threads = s.newPattern( "threads",
			[ "frequency", 6.0,
			  "dampzone", 0.2,
			  "depth", 0.1 ] )

pittedthreads = s.newPattern( "compose", [ "patterns", threads, pits ] )

threadedmetal = s.newMaterial( "standard",
			       [ "fresnel", 1, 0.2, 0.2,
				 "IOR", 5.0,
				 "kc", vector3( 0.9, 0.9, 1 ),
				 "kr", vector3( 0.9 * 0.35, 0.9 * 0.35, 0.35 ),
				 "kd", 0.5,
				 "km", 0.1,
				 "kc", pastella,
				 "shinyness", 1.0,
				 "displacement", pittedthreads ] )

checkpattern = s.newPattern( "check", [ "scale", 0.05 ] )

check = s.newMaterial( "standard",
		       [ "kc", vector3( 1.0, 1.0, 1.0 ),
			 "kr", vector3( 0.2, 0.3, 0.6 ),
			 "kd", 0.6,
			 "km", 0.1,
			 "ka", checkpattern,
			 "kc", checkpattern ] )


# model a mechanic die
s.materialBegin( metal )

surfaces = intarray()

for i in range(0, 6) :
    u1 = 2.0 * 3.141592 * (i - 0.5) / 6.0
    u2 = 2.0 * 3.141592 * (i + 0.5) / 6.0

    sin_u1 = sin( u1 )
    sin_u2 = sin( u2 )
    cos_u1 = cos( u1 )
    cos_u2 = cos( u2 )

    surfaces.add( s.newObject( "patch",
			       [ "points",
				 vector3( cos_u1, sin_u1, -0.4 ), vector3( cos_u1, sin_u1, 0.4 ),
				 vector3( cos_u2, sin_u2, -0.4 ), vector3( cos_u2, sin_u2, 0.4 ) ] ) )

    surfaces.add( s.newObject( "triangle",
			       [ "points",
				 vector3( cos_u1, sin_u1, -0.4 ), vector3( cos_u2, sin_u2, -0.4 ), vector3( 0, 0, -0.4 ) ] ) )

    surfaces.add( s.newObject( "triangle",
			       [ "points",
				 vector3( cos_u1, sin_u1, 0.4 ), vector3( cos_u2, sin_u2, 0.4 ), vector3( 0, 0, 0.4 ) ] ) )

boundary = s.newObject( "boundary", [ "surfaces", surfaces ] )

s.transformBegin( transform().scaling( vector3( 1.0, 1.0, 0.4 ) ) )

sphere = s.newObject( "sphere", [ "radius", 1.3 ] )

s.transformEnd()

body = s.newObject( "solid",
		    [ "type", "intersection",
		      "solids", boundary, sphere ] )

s.transformBegin( transform().translation( vector3( 0.0, 0.0, -0.41 ) ) )

s.materialBegin( threadedmetal )

cyl = s.newObject( "cylinder",
		   [ "radius", 0.5,
		     "height", 0.82 ] )

s.materialEnd()

disc1 = s.newObject( "disc", [ "radius", 0.5 ] )

s.transformEnd()

s.transformBegin( transform().translation( vector3( 0.0, 0.0, 0.41 ) ) )

disc2 = s.newObject( "disc", [ "radius", 0.5 ] )

s.transformEnd()

hole = s.newObject( "boundary", [ "surfaces", cyl, disc1, disc2 ] )

s.addObject( s.newObject( "solid",
			  [ "type", "difference",
			    "solids", body, hole ] ) )

s.materialEnd()


# make the room
s.materialBegin( ambient )

s.addObject( s.newObject( "box",
			  [ "position", vector3(-8, -12, -12), vector3(12, 8, 12) ] ) )

s.materialEnd()

# make the floor
s.materialBegin( check )

s.addObject( s.newObject( "patch",
			  [ "points",
			    vector3(-8, -12, -0.4), vector3(12, -12, -0.4),
			    vector3(-8,   8, -0.4), vector3(12,   8, -0.4) ] ) )

s.materialEnd()


dof    = s.newImager( "dof", [ "radius", 0.01, "depth", 3.0 ] )
saver  = s.newImager( "tga-saver", [ "file", "mechanic.tga", "imager", dof ] )

s.imagerBegin( saver )

camera = s.newCamera( "pinhole",
    [ "eye", vector3( 2.1, -2.0,  1.8 ),
      "aim", vector3( 0.0,  0.0,  0.0 ),
      "aa-samples", 2, 4 ] )

s.imagerEnd()

s.render( camera, 400, 400 )
