//Tp06 by Carlos Robson
// ======================================================================
#include "pontos.inc"

background{ color rgb < 0.75, 0.80, 0.85 > }

#declare Yellow = rgb<255, 255, 0>;
#declare Black =  rgb < 0.4, 0.4, 0.4 >;

#declare tx_plastico = 
  texture{
    pigment{ color rgb < 0.10, 0.80, 1.00 > }
    finish{ diffuse 0.8 ambient 0.1 specular 0.5 roughness 0.005 }
  }
  
#declare esfera =
	sphere {
		< 0, 0,  0>, 0.25 // Near lower left corner
		 texture{ tx_plastico }
	}
	
  
// ======================================================================
// DESCRIÇÃO DA CENA 

#include "eixos.inc"

object{ eixos(3.00) }


//Função que interpola 2 pontos(to,vo) e (t1,v1) decolvendo a coordenada vv a partir de um tt
#macro interpola(to, vo, t1, v1, tt )
	#local r = (tt-to)/(t1-to);
	#local s = 1-r;
	#local vv= s*vo+r*v1;
	vv
#end

//
#macro arcobezier(to, t1, a, b, c, d, tt )
	#local ab = interpola(to, a, t1, b, tt );
	#local bc = interpola(to, b, t1, c, tt );
	#local cd = interpola(to, c, t1, d, tt );
	#local abc = interpola(to, ab, t1, bc, tt );
	#local bcd = interpola(to, bc, t1, cd, tt );
	#local abcd = interpola(to, abc, t1, bcd, tt );
	abcd
#end

// N = num de lados, PO = Matriz 1, QO = segunda matriz, CO = parametro inicial para a matriz 1
// CI parametro final referente a matriz2 
#macro interpolamatriz(PO, QO, N, CO, CI, cc, R)
	#local i = 0;
	#while(i < N)
		#local k = 0;
		#while(k<3)
			#declare R[i][k] = interpola(CO,PO[i][k], CI, QO[i][k], cc );
			#local  k = k+1;
		#end
			#local i = i+1;
	#end
#end

#macro arco(a0, a1, a2, a3, t0, t1, n)
	union{
	#declare passo = 1/n;
	#declare j = t0;
	#while (j <= t1)
		object { esfera translate arcobezier(t0,t1, a0, a1, a2, a3, j)}
		#declare j=j+passo;
	#end
	}
#end

//Po = matrix, n = num de arcos, m = num de bolas por arco
#macro noh(Po, n, m)
		union{
			#declare lado = m/n;
			#local i = 0;
			#while(i < n)
				object {arco (Po[i][0], Po[i][1], Po[i][2], Po[i][3], i*lado, (i+1)*lado, m) }
			#local i = i+1;
			#end
		}
#end

//Suaviza 2 junções
#macro suaviza(Po, i)
	#local j =  mod(i+1, 4);
	#local vv = (Po[j][1]-Po[i][2])/2;
	#declare Po[i][2]= Po[i][3]-vv;
	#declare Po[j][1]= Po[j][0]+vv;
#end

//Po= matriz, n numero de arcos
#macro suavizamatriz(Po, n)
	#local i = 0;
		#while(i < n )
			suaviza(Po, i)
			#local i = i+1;
		#end
#end
#declare nk= 6;
#declare na = 4;
#declare tk = array[nk];
#declare tk[0]= 0.1667;
#declare tk[1]= 0.3334;
#declare tk[2]= 0.5001;
#declare tk[3]= 0.6668;
#declare tk[4]= 0.833;
#declare tk[5]= 1.0;

//Q0 = quadro 0
#macro interpolaAnima(PO N, Q0, Q1, cc, R)
	#local i = 0;
	#while(i < N)
		#local k = 0;
		#while(k<3)
			#declare R[i][k] = interpola(Q0,PO[Q0][i][k], Q1, PO[Q1][i][k], cc );
			#local  k = k+1;
		#end
			#local i = i+1;
	#end
#end

#macro busca_tempo(clk, nk, tk)
		#local res = 0;
		#for(k, 0, nk-2)
			#if((clk >= tk[k]) & (clk < tk[k+1]))
				#local res = k;
			#end
		#end
		res
#end
#macro makegif(P, clk, R)
	#local k = 0;
	#local k = busca_tempo(clk, nk, tk);
	interpolaAnima(P, 4, k, k+1, clk, R)
	object{noh(R, na, 50)}
#end
makegif(P, clock, R)


#include "camlight.inc"
#declare centro_cena = < 0.00, 0.00, 1.00 >;
#declare raio_cena = 7.0;
#declare dir_camera = < 14.00, 7.00, 4.00 >;
#declare dist_camera = 5*raio_cena;
#declare intens_luz = 1.20;
camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)