// Exemplo de arquivo de descricao de cena para POV-ray
// Last edited on 2010-03-04 15:44:01 by stolfi

// ======================================================================
// CORES E TEXTURAS

#include "eixos.inc"
#include "camlight.inc"
#include "retalho.inc"
#include "textures.inc"

//background{ color rgb < 0.75, 0.80, 0.85 > }
sky_sphere{pigment{Blue_Sky} scale 0.2 }



#declare tx_plastico = 
  texture{
    pigment{ color rgb < 0.10, 0.80, 1.00 > }
    finish{ diffuse 0.8 ambient 0.2 specular 0.5 roughness 0.005 }
  }

#declare tx_verde = 
  texture{
    pigment{ color rgb < 0.10, 1.00, 0.10 > }
    finish{ diffuse 0.8 ambient 0.1 specular 0.5 roughness 0.005 }
  }

#declare tx_branco = 
  texture{
    pigment{ color rgb < 1.0, 1.0, 1.0 > }
    finish{ diffuse 0.2 ambient 0.6 }
  }

#declare tx_preto = 
  texture{
    pigment{ color rgb < 0.0, 0.00, 0.0 > }
    finish{ diffuse 0.9 ambient 0.1 }
  }


#declare tx_vermelho = 
  texture{
    pigment{ color rgb < 1.00, 0, 0 > }
    finish{ diffuse 0.8 ambient 0.1 specular 0.5 roughness 0.005 }
  }

#declare tx_fosca = 
  texture{
    pigment{ color rgb < 1.00, 0.80, 0.10 > }
    finish{ diffuse 0.9 ambient 0.1 }
  }

#declare tx_espelho = 
  texture{
    pigment{ color rgb < 1.00, 0.85, 0.30 > }
    finish{ diffuse 0.2 reflection 0.7*< 1.00, 0.85, 0.30 > ambient 0.1 }
  }

#declare tx_vidro = 
  texture{
    pigment{ color rgb < 0.85, 0.95, 1.00 > filter 0.70 }
    finish{ diffuse 0.03 reflection 0.25 ambient 0.02 specular 0.25 roughness 0.005 }
  }


#declare tx_xadrez =
  texture{
    pigment{ checker color rgb < 0.10, 0.32, 0.60 >, color rgb < 1.00, 0.97, 0.90 > }
    finish{ diffuse 0.9 ambient 0.1 }
    scale 1.0
  }

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


// Partes da cena:

#declare A = array[5][5];
#declare B = array[5][5];
#declare C = array[5][5];

#declare A[1][1] = <-2.5,0,0.8>;
#declare A[1][2] = <-2.5,0,0.8>;
#declare A[1][3] = <-2.5,0,0.8>;
#declare A[1][4] = <-2.5,0,0.8>;

#declare B[1][1] = <-2.5,0,0.8>;
#declare B[1][2] = <-2.5,0,0.8>;
#declare B[1][3] = <-2.5,0,0.8>;
#declare B[1][4] = <-2.5,0,0.8>;

#declare B[4][1] = <-2.5,0,0.8>;
#declare B[4][2] = <-2.5,0,0.8>;
#declare B[4][3] = <-2.5,0,0.8>;
#declare B[4][4] = <-2.5,0,0.8>;

#declare C[4][1] = <-2.5,0,0.8>;
#declare C[4][2] = <-2.5,0,0.8>;
#declare C[4][3] = <-2.5,0,0.8>;
#declare C[4][4] = <-2.5,0,0.8>;

//Pontos Retalho A
#declare A[2][1] = <-2.5,0,0.8>;
#declare A[2][2] = <-2.5,-0.5,0.75>;
#declare A[2][3] = <-2.5,-0.5,0.3>;
#declare A[2][4] = <-2.5,0,0>;

#declare A[3][1] = <-3,0,1.3>;
#declare A[3][2] = <-3,-0.5,1.25>;
#declare A[3][3] = <-3,-0.5,0.5>;
#declare A[3][4] = <-3,0,0>;

#declare A[4][1] = <-3.5,0,2>;
#declare A[4][2] = <-3.5,-0.5,1.9>;
#declare A[4][3] = <-3.5,-0.5,0.5>;
#declare A[4][4] = <-3.5,0,0>;

//Pontos Retalho B
#declare B[2][1] = <-1,0,1>;
#declare B[2][2] = <-1,-0.8,1>;
#declare B[2][3] = <-1,-0.8,0.4>;
#declare B[2][4] = <-1.5,0,0>;

#declare B[3][1] = <-2,0,0.8>;
#declare B[3][2] = <-2,-0.5,0.8>;
#declare B[3][3] = <-2,-0.5,0.3>;
#declare B[3][4] = <-2,0,0>;

//Pontos Retalho C
#declare C[1][1] = <3.5,0,0.1>;
#declare C[1][2] = <3.5,0,0.1>;
#declare C[1][3] = <3.5,0,0.05>;
#declare C[1][4] = <3.5,0,0>;

#declare C[2][1] = <3,0,0.8>;
#declare C[2][2] = <3,-0.25,0.8>;
#declare C[2][3] = <3,-0.25,0.5>;
#declare C[2][4] = <3,0,0>;

#declare C[3][1] = <2.5,0,1.2>;
#declare C[3][2] = <2.5,-0.5,1.2>;
#declare C[3][3] = <2.5,-0.5,0.6>;
#declare C[3][4] = <2.5,0,0>;

#declare raio=0.0001;



//Estica no eixo X
#macro estica(P)
  #local estic=-0.2;
//  #local cons = -estic*sin(pi*P.y);
  <P.x,
   P.y*estic,
   P.z>
  
#end

//Estica no eixo X
#macro entorta(P)
  #local estic=-0.2;
  #local cons = -estic*sin(pi*P.y);  
  
  <0,
   0,
  P.x*P.x>
  
    
#end



#macro retalho1(A) 
  union {
  object{retalho (
    A[1][1],A[1][2],A[1][3],A[1][4],
    A[2][1],A[2][2],A[2][3],A[2][4],
    A[3][1],A[3][2],A[3][3],A[3][4],
    A[4][1],A[4][2],A[4][3],A[4][4], 
    raio,tx_verde,tx_vermelho) 
    translate<0,0,0> }
}
#end


#macro retalho2(B)
  union {
  object{retalho (
    B[1][1],B[1][2],B[1][3],B[1][4],
    B[2][1],B[2][2],B[2][3],B[2][4],
    B[3][1],B[3][2],B[3][3],B[3][4],
    B[4][1],B[4][2],B[4][3],B[4][4], 
    raio,tx_verde,tx_plastico) 
    translate<0,0,0> }
}

#end
#macro retalho3(C) 
  union {
  object{retalho (
    C[1][1],C[1][2],C[1][3],C[1][4],
    C[2][1],C[2][2],C[2][3],C[2][4],
    C[3][1],C[3][2],C[3][3],C[3][4],
    C[4][1],C[4][2],C[4][3],C[4][4], 
    raio,tx_verde,tx_fosca) 
    translate<0,0,0> } 
} 
  
#end


#macro aviao(d1,d2)
  
  union{
    
    
    #declare P = array[5][5];
    #declare Q = array[5][5];
    #declare R = array[5][5];
      
    #declare P[2][1] = A[2][1]+estica(A[2][1])*d1 + entorta(A[2][1])*d2;
    #declare P[2][2] = A[2][2]+estica(A[2][2])*d1 + entorta(A[2][2])*d2;
    #declare P[2][3] = A[2][3]+estica(A[2][3])*d1 + entorta(A[2][3])*d2;
    #declare P[2][4] = A[2][4]+estica(A[2][4])*d1 + entorta(A[2][4])*d2;

    #declare P[3][1] = A[3][1]+estica(A[3][1])*d1 + entorta(A[3][1])*d2;
    #declare P[3][2] = A[3][2]+estica(A[3][2])*d1 + entorta(A[3][2])*d2;
    #declare P[3][3] = A[3][3]+estica(A[3][3])*d1 + entorta(A[3][3])*d2;
    #declare P[3][4] = A[3][4]+estica(A[3][4])*d1 + entorta(A[3][4])*d2;

    #declare P[4][1] = A[4][1]+estica(A[4][1])*d1 + entorta(A[4][1])*d2;
    #declare P[4][2] = A[4][2]+estica(A[4][2])*d1 + entorta(A[4][2])*d2;
    #declare P[4][3] = A[4][3]+estica(A[4][3])*d1 + entorta(A[4][3])*d2;
    #declare P[4][4] = A[4][4]+estica(A[4][4])*d1 + entorta(A[4][4])*d2;

//Pontos Retalho B
    #declare Q[2][1] = B[2][1]+estica(B[2][1])*d1 + entorta(B[2][1])*d2;
    #declare Q[2][2] = B[2][2]+estica(B[2][2])*d1 + entorta(B[2][2])*d2;
    #declare Q[2][3] = B[2][3]+estica(B[2][3])*d1 + entorta(B[2][3])*d2;
    #declare Q[2][4] = B[2][4]+estica(B[2][4])*d1 + entorta(B[2][4])*d2;
    
    #declare Q[3][1] = B[3][1]+estica(B[3][1])*d1 + entorta(B[3][1])*d2;
    #declare Q[3][2] = B[3][2]+estica(B[3][2])*d1 + entorta(B[3][2])*d2;
    #declare Q[3][3] = B[3][3]+estica(B[3][3])*d1 + entorta(B[3][3])*d2;
    #declare Q[3][4] = B[3][4]+estica(B[3][4])*d1 + entorta(B[3][4])*d2;
    
    //Pontos Retalho C
    #declare R[1][1] = C[1][1]+estica(C[1][1])*d1 + entorta(C[1][1])*d2;
    #declare R[1][2] = C[1][2]+estica(C[1][2])*d1 + entorta(C[1][2])*d2;
    #declare R[1][3] = C[1][3]+estica(C[1][3])*d1 + entorta(C[1][3])*d2;
    #declare R[1][4] = C[1][4]+estica(C[1][4])*d1 + entorta(C[1][4])*d2;
    
    #declare R[2][1] = C[2][1]+estica(C[2][1])*d1 + entorta(C[2][1])*d2;
    #declare R[2][2] = C[2][2]+estica(C[2][2])*d1 + entorta(C[2][2])*d2;
    #declare R[2][3] = C[2][3]+estica(C[2][3])*d1 + entorta(C[2][3])*d2;
    #declare R[2][4] = C[2][4]+estica(C[2][4])*d1 + entorta(C[2][4])*d2;
    
    #declare R[3][1] = C[3][1]+estica(C[3][1])*d1 + entorta(C[3][1])*d2;
    #declare R[3][2] = C[3][2]+estica(C[3][2])*d1 + entorta(C[3][2])*d2;
    #declare R[3][3] = C[3][3]+estica(C[3][3])*d1 + entorta(C[3][3])*d2;
    #declare R[3][4] = C[3][4]+estica(C[3][4])*d1 + entorta(C[3][4])*d2;
   
    
    //Pontos Calculados
    #declare Q[4][1] = (P[2][1]+B[3][1])/2;
    #declare P[1][1] = Q[4][1];
    #declare Q[4][2] = (P[2][2]+B[3][2])/2;
    #declare P[1][2] = Q[4][2];
    #declare Q[4][3] = (P[2][3]+B[3][3])/2;
    #declare P[1][3] = Q[4][3];
    #declare Q[4][4] = (P[2][4]+B[3][4])/2;
    #declare P[1][4] = Q[4][4];  
    #declare R[4][1] = (B[2][1]+C[3][1])/2;
    #declare Q[1][1] = R[4][1];
    #declare R[4][2] = (B[2][2]+C[3][2])/2;
    #declare Q[1][2] = R[4][2];
    #declare R[4][3] = (B[2][3]+C[3][3])/2;
    #declare Q[1][3] = R[4][3];
    #declare R[4][4] = (B[2][4]+C[3][4])/2;
    #declare Q[1][4] = R[4][4];
    

    box{<-0.5,-3,0.3>,<0.5,3,0.5> texture{tx_branco} translate<1,0,0>}
    
    object{retalho1(P) }
    object{retalho1(P) scale<1,-1,1>}
    object{retalho2(Q) }
    object{retalho2(Q) scale<1,-1,1>}
    object{retalho3(R) }
    object{retalho3(R) scale<1,-1,1>}
    
  }
#end


#macro interpola2(tA,A,tB,B,tt)
  #local r = (tt-tA)/(tB-tA);
  
  ((1-r)*A+r*B);
  
#end


#macro interpola4(tA,A,B,C,D,tD,tt)
  
  #local AB = interpola2(tA,A,tD,B,tt);
  #local BC = interpola2(tA,B,tD,C,tt);
  #local CD = interpola2(tA,C,tD,D,tt);
  
  #local ABC = interpola2(tA,AB,tD,BC,tt);
  #local BCD = interpola2(tA,BC,tD,CD,tt);
  
  #local ABCD = interpola2(tA,ABC,tD,BCD,tt);
  
  ABCD 
  
#end

//Parametros definidos

#declare A2 = <5,0,0>;
#declare A3 = <8,10,5>;

#declare B2 = <12,0,-10>;
#declare B3 = <2,-2,15>;

#declare C2 = <-2,5,0>; 
#declare C3 = <-10,-10,-20>;

#declare D2 = <6,5,-10>;
#declare D3 = <3,-2,-5>;

//Parametros calculados
#declare A1 = (A2+D3)/2;
#declare D4 = A1;

#declare A4 = (A3+B2)/2;
#declare B1 = A4;

#declare B4 = (B3+C2)/2;
#declare C1 = B4;

#declare C4 = (C3+D2)/2;
#declare D1 = C4;

#declare t1 = 0;
#declare t2 = 0.25;
#declare t3 = 0.5;
#declare t4 = 0.75;
#declare t5 = 1;

#declare angulo1 = 0;
#declare angulo2 = 45;
#declare angulo3 = 90;
#declare angulo4 = 45;
#declare angulo5 = 0;



#macro trajetoria()
  #if (clock >= t1 & clock <= t2 )
    #local X = interpola4(t1,A1,A2,A3,A4,t2,clock);
    #local Y = interpola2(t1,angulo1,t2,angulo2,clock);
  #end
  #if(clock > t2 & clock <= t3)
    #local X = interpola4(t2,B1,B2,B3,B4,t3,clock);
    #local Y = interpola2(t2,angulo2,t3,angulo3,clock);
  #end  
  #if(clock > t3 & clock <= t4)
    #local X = interpola4(t3,C1,C2,C3,C4,t4,clock);
    #local Y = interpola2(t3,angulo3,t4,angulo4,clock);
  #end  
    #if(clock > t4 & clock <= t5)
      #local X = interpola4(t4,D1,D2,D3,D4,t5,clock);
      #local Y = interpola2(t4,angulo4,t5,angulo5,clock);
  #end  
  
  object{aviao(0,0) translate X rotate Y}
  
#end



object{trajetoria()}

#declare centro_cena = < 15.00,20.00, 10.00 >;
#declare raio_cena = 30.0;
#declare dir_camera = < 10.00, 15.00, 10.00>;
#declare dist_camera = 40.0;
#declare intens_luz = 2.00;
camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)