// ======================================================================
// CORES E TEXTURAS
#include "textures.inc"
#include "eixos.inc"
#include "transforms.inc"
#include "shapes.inc"
background{ color rgb < 0.75, 0.80, 0.85 > }

#declare tx_vidro = 
  texture{
    pigment{ color rgb < 0.85, 0.95, 1.00 > filter 0.70 }
    finish{ diffuse 0.03 reflection 0.35 ambient 0.02 specular 0.25 roughness 0.005 ior 1.5}
  }
#declare tx_xadrez =
  texture{
    pigment{ checker color rgb < 0.90, 0.90, 1.00 >, color rgb < 0.90, 1.00, 0.90> }
    finish{ diffuse 0.9 ambient 0.1 }
    scale 15.0
  }
#declare tx_strip =
  texture{
    pigment{ color rgb < 1.00, 0.40, 0.40 >}
  }
#declare random_seed = seed (1516);
#macro random() 
  rand(random_seed) 
#end
#macro srandom() 
  1-2*random()
#end
#macro vrandom() 
  vnormalize(< 1-2*random(), 1-2*random(), 1-2*random() >)
#end
plane {  <0,0,1>, -100 texture {  tx_xadrez  }  }
plane {  <0,1,0>, -100 texture {  tx_xadrez  }  }
plane {  <1,0,0>, -100 texture {  tx_xadrez  }  }

// ======================================================================
// DESCRIÇÃO DA CENA 

//Definição Algébrica
#macro interpola4(q, v1, v2, v3, v4)
  1*(1-q)*(1-q)*(1-q)*v1 + 
  3*(1-q)*(1-q)*(  q)*v2 + 
  3*(1-q)*(  q)*(  q)*v3 + 
  1*(  q)*(  q)*(  q)*v4
#end

//Definição Algébrica
#macro interpola4_derivada(q, v1, v2, v3, v4)
  -3*((q-1)*(q-1)*v1 + (-1 + 4*q - 3*q*q)*v2 + q*(-2*v3 + 3*q*v3 - q*v4))
#end

#macro interpola4_derivada2(q, v1, v2, v3, v4)
  -6*((-1 + q)*v1 + (2 - 3*q)*v2 - v3 + 3*q*v3 - q*v4)
#end

#macro bezier_tangentes(curve, n_curves, v1, v2, v3, v4, Norm1, Norm3, N)
  #local i=0;
  #declare Norm2 = vnormalize( interpola4_derivada2(0.5,P1,P2,P3,P4) );
  #while (i<=N)
    #local q=i/N;
    #local qq=100+q-clock;
    #local qq=qq - int(qq);

    #local V0=              interpola4(q, v1,v2,v3,v4);
    #local V1 = vnormalize( interpola4_derivada (q, v1,v2,v3,v4) );
    #local V2 = vnormalize( (1-q)*(1-q)*Norm1 + 2*(1-q)*q*Norm2 + q*q*Norm3);
//     #local V2 = vnormalize( (1-q)*Norm1 + q*Norm3);
    #local V2 = vaxis_rotate(V2, V1, 90*(1-qq)*sin((5*q+clock)*2*pi) );

  #local L1=10*qq;
  #local L2=10*qq;
    #if (i>0)
	#local D = -vlength(V0-V0_Prev)/3;
	#local H = 2;
        bicubic_patch{
	type 1 u_steps 3 v_steps 3
	
	V0 + L1*V2,    V0 + D*V1 + L1*V2,    V0_Prev - D*V1_Prev + L1_Prev*V2_Prev,    V0_Prev + L1_Prev*V2_Prev
	V0        ,    V0 + D*V1        ,    V0_Prev - D*V1_Prev                  ,    V0_Prev
	V0        ,    V0 + D*V1        ,    V0_Prev - D*V1_Prev                  ,    V0_Prev
	V0 - L2*V2,    V0 + D*V1 - L2*V2,    V0_Prev - D*V1_Prev - L2_Prev*V2_Prev,    V0_Prev - L2_Prev*V2_Prev
	texture {tx_strip}
      } 
    #end

    #local i=i+1;
    #local V0_Prev = V0;
    #local V1_Prev = V1;
    #local V2_Prev = V2;
    #local L1_Prev = L1;
    #local L2_Prev = L2;
//     #local V3_Prev = V3;
  #end
#end


#declare NSEGS = 4;
#declare P    = array[NSEGS];
#declare TG   = array[NSEGS];
#declare NORM = array[NSEGS];

#declare i=0;
#while (i<NSEGS)
  #declare P   [i] = 30*vrandom();
  #declare TG  [i] =    vrandom();
  #declare NORM[i] =    <0,0,0>;
  #declare i=i+1;
#end
#declare i=0;
#while (i<NSEGS)
  #local i_plus_1 = mod(i+1, NSEGS);
  #declare tg_size = vlength(P[i]-P[i_plus_1]);
  #declare P1 = P[i       ];
  #declare P2 = P[i       ] + tg_size*TG[i       ];
  #declare P3 = P[i_plus_1] - tg_size*TG[i_plus_1];
  #declare P4 = P[i_plus_1];

  #declare NORM[i]        = NORM[i]        + vnormalize( interpola4_derivada2(0.2,P1,P2,P3,P4) );
  #declare NORM[i_plus_1] = NORM[i_plus_1] + vnormalize( interpola4_derivada2(0.8,P1,P2,P3,P4) );
  #declare i=i+1;
#end


union {
  #declare i=0;
  #while (i<NSEGS)
    #local i_plus_1 = mod(i+1, NSEGS);
    #declare tg_size = vlength(P[i]-P[i_plus_1])*2;
    #declare P1 = P[i       ];
    #declare P2 = P[i       ] + tg_size*TG[i       ];
    #declare P3 = P[i_plus_1] - tg_size*TG[i_plus_1];
    #declare P4 = P[i_plus_1];
    #declare N1 = vnormalize(NORM[i       ]);
    #declare N2 = vnormalize(NORM[i_plus_1]);

//     sphere{ P1, 10 texture{tx_vidro} }
    bezier_tangentes(i, NSEGS, P1,P2,P3,P4,N1,N2, 50)
    #declare i=i+1;
  #end
}


#include "camlight.inc" 
#declare centro_cena = <0,0,0>;
#declare raio_cena = 80;
#declare dir_camera = <5,5,5>; 
#declare dist_camera = 100;
#declare intens_luz = 1.00;
camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)