#
# A puzzle of transparent boxes in ball inside.
#
# 					Gershon Elber, June 1996

Sqr1 = poly( list( point( -1, -1, 1 ),
		   point( -1,  1, 1 ),
		   point(  1,  1, 1 ),
		   point(  1, -1, 1 ) ), false );
SclFctr = 0.6;
Sqr2 = Sqr1 * sc( -SclFctr ) * tz( SclFctr * 2 );

Trap1 = poly( list( point( -1, -1, 1 ) * sc( SclFctr ),
		    point( -1,  1, 1 ) * sc( SclFctr ),
		    point( -1,  1, 1 ),
		    point( -1, -1, 1 ) ), false );
Trap2 = Trap1 * rz( 180 );

Prim1 = list( Sqr1, Sqr2, Trap1, Trap2 );
Prim2 = Prim1 * rx( 90 );
Prim3 = Prim1 * rx( -90 );

BaseUnitAux = list( Prim1, Prim2, Prim3,
		    Trap1 * rx( 90 ) * ry( -90 ),
		    Trap2 * rx( -90 ) * ry( 90 ) );
BaseUnit = list( BaseUnitAux,
		 BaseUnitAux * ty( 2.35 ),
		 box( vector( -0.15, 1.0, -0.5 ), 0.3, 0.35, 1.0 ) )
	* sc( 0.5 );

BaseUnit1 = BaseUnit;
color( BaseUnit1, red );

BaseUnit2 = BaseUnit * tx( 1.175 );
color( BaseUnit2, green );

BaseUnit3 = BaseUnit * rx( 180 ) * rz( 90 );
color( BaseUnit3, cyan );

BaseUnit4 = BaseUnit3 * ty( 1.175 );
color( BaseUnit4, magenta );

rot_x = creparam( cbezier( list( ctlpt( E1, 0.0 ),
		  	         ctlpt( E1, 360.0 ) ) ),
		  0.0, 1.0 );
rot_y = creparam( cbezier( list( ctlpt( E1, 0.0 ),
		  	         ctlpt( E1, 720.0 ) ) ),
		  0.0, 1.0 );
rot_z = creparam( cbezier( list( ctlpt( E1, 0.0 ),
		  	         ctlpt( E1, 360.0 ) ) ),
		  0.0, 1.0 );

mov_x = creparam( cbezier( list( ctlpt( E1, 0.0 ),
		  	         ctlpt( E1, -1.5 ) ) ),
		  3.0, 4.0 );
mov_z = creparam( cbezier( list( ctlpt( E1, 0.0 ),
		  	         ctlpt( E1, 2.0 ) ) ),
		  1.0, 2.0 );
attrib( BaseUnit1, "animation", list( rot_x, rot_y, rot_z, mov_x, mov_z ) );
free( mov_x );
free( mov_z );

mov_x = creparam( cbezier( list( ctlpt( E1, 0.0 ),
		  	         ctlpt( E1, 3.0 ) ) ),
		  3.0, 4.0 );
mov_z = creparam( cbezier( list( ctlpt( E1, 0.0 ),
		  	         ctlpt( E1, 2.0 ) ) ),
		  2.0, 3.0 );
attrib( BaseUnit2, "animation", list( rot_x, rot_y, rot_z, mov_x, mov_z ) );
free( mov_x );
free( mov_z );

mov_y = creparam( cbezier( list( ctlpt( E1, 0.0 ),
		  	         ctlpt( E1, -1.0 ) ) ),
		  3.0, 4.0 );
attrib( BaseUnit3, "animation", list( rot_x, rot_y, rot_z, mov_y ) );
free( mov_y );

mov_y = creparam( cbezier( list( ctlpt( E1, 0.0 ),
		  	         ctlpt( E1, 1.0 ) ) ),
		  3.0, 4.0 );
attrib( BaseUnit4, "animation", list( rot_x, rot_y, rot_z, mov_y ) );
free( mov_y );

Base = list( BaseUnit1, BaseUnit2, BaseUnit3, BaseUnit4 );
attrib( Base, "transp", 0.4 );

#############################################################################

g = (sqrt( 5 ) + 1) / 2; # The golden ratio
q = g - 1;

v1 = vector(  1,  1,  1 );
v2 = vector(  1, -1, -1 );
v3 = vector( -1,  1, -1 );
v4 = vector( -1, -1,  1 );

pl1 = poly( list( v1, v3, v2 ), false );
pl2 = poly( list( v1, v4, v3 ), false );
pl3 = poly( list( v1, v2, v4 ), false );
pl4 = poly( list( v2, v3, v4 ), false );

tetra = mergepoly( list( pl1, pl2, pl3, pl4 ) );

v1 = vector(  0,  0,  1 );
v2 = vector(  1,  0,  0 );
v3 = vector(  0,  1,  0 );
v4 = vector( -1,  0,  0 );
v5 = vector(  0, -1,  0 );
v6 = vector(  0,  0, -1 );

pl1 = poly( list( v1, v3, v2 ), false );
pl2 = poly( list( v1, v4, v3 ), false );
pl3 = poly( list( v1, v5, v4 ), false );
pl4 = poly( list( v1, v2, v5 ), false );
pl5 = poly( list( v6, v2, v3 ), false );
pl6 = poly( list( v6, v3, v4 ), false );
pl7 = poly( list( v6, v4, v5 ), false );
pl8 = poly( list( v6, v5, v2 ), false );

octa = mergepoly( list( pl1, pl2, pl3, pl4, pl5, pl6, pl7, pl8 ) );

v1  = vector(  0,  q,  g );
v2  = vector(  0, -q,  g );
v3  = vector(  1,  1,  1 );
v4  = vector(  1, -1,  1 );
v5  = vector( -1, -1,  1 );
v6  = vector( -1,  1,  1 );
v7  = vector( -g,  0,  q );
v8  = vector(  g,  0,  q );
v9  = vector(  q,  g,  0 );
v10 = vector( -q,  g,  0 );
v11 = vector( -q, -g,  0 );
v12 = vector(  q, -g,  0 );
v13 = vector( -g,  0, -q );
v14 = vector(  g,  0, -q );
v15 = vector(  1,  1, -1 );
v16 = vector( -1,  1, -1 );
v17 = vector( -1, -1, -1 );
v18 = vector(  1, -1, -1 );
v19 = vector(  0,  q, -g );
v20 = vector(  0, -q, -g );

pl1  = poly( list( v2, v1, v3, v8, v4 ), false );
pl2  = poly( list( v1, v2, v5, v7, v6 ), false );
pl3  = poly( list( v1, v3, v9, v10, v6 ), false );
pl3  = poly( list( v6, v10, v9, v3, v1 ), false );
pl4  = poly( list( v2, v4, v12, v11, v5 ), false );
pl5  = poly( list( v4, v8, v14, v18, v12 ), false );
pl6  = poly( list( v5, v7, v13, v17, v11 ), false );
pl6  = poly( list( v11, v17, v13, v7, v5 ), false );
pl7  = poly( list( v13, v16, v10, v6, v7 ), false );
pl8  = poly( list( v16, v19, v15, v9, v10 ), false );
pl9  = poly( list( v3, v9, v15, v14, v8 ), false );
pl10 = poly( list( v14, v15, v19, v20, v18 ), false );
pl11 = poly( list( v12, v18, v20, v17, v11 ), false );
pl12 = poly( list( v17, v13, v16, v19, v20 ), false );
pl12 = poly( list( v20, v19, v16, v13, v17 ), false );

dodeca = mergepoly( list( pl1, pl2, pl3, pl4, pl5, pl6,
			  pl7, pl8, pl9, pl10, pl11, pl12 ) );

v1  = vector(  1,  0,  g );
v2  = vector( -1,  0,  g );
v3  = vector(  0,  g,  1 );
v4  = vector(  0, -g,  1 );
v5  = vector(  g,  1,  0 );
v6  = vector( -g,  1,  0 );
v7  = vector( -g, -1,  0 );
v8  = vector(  g, -1,  0 );
v9  = vector(  0,  g, -1 );

pl1  = poly( list( v2, v3, v1 ), false );
pl2  = poly( list( v1, v4, v2 ), false );
pl3  = poly( list( v2, v6, v3 ), false );
pl4  = poly( list( v3, v5, v1 ), false );
pl5  = poly( list( v3, v9, v5 ), false );
pl6  = poly( list( v3, v6, v9 ), false );
pl7  = poly( list( v2, v7, v6 ), false );
pl8  = poly( list( v2, v4, v7 ), false );
pl9  = poly( list( v1, v8, v4 ), false );
pl10 = poly( list( v1, v5, v8 ), false );

icosa1 = mergepoly( list( pl1, pl2, pl3, pl4, pl5, pl6, pl7, pl8, pl9, pl10 ) );
icosa2 = icosa1 * rotx( 180 );
icosa = mergepoly( list( icosa1, icosa2 ) );

#############################################################################

tetraAux = tetra * sc( 0.15 );
color( tetraAux, white );
octaAux = octa * sc( 0.2 ) * tx( 1.175 );
color( octaAux, white );
dodecaAux = dodeca * sc( 0.1 ) * ty( 1.175 );
color( dodecaAux, white );
icosaAux = icosa * sc( 0.1 ) * tx( 1.175 ) * ty( 1.175 );
color( icosaAux, white );

Plato = list( tetraAux, octaAux, dodecaAux, icosaAux );
attrib( Plato, "animation", list( rot_x, rot_y, rot_z ) );
attrib( Plato, "transp", 0.1 );

free( rot_x );
free( rot_y );
free( rot_z );

All = list( Base, Plato );
view( All, 1);
save( "puzcubes", All );

