//MC930 
//Turma: A
//Nome:	Rodolfo Udo Labsch
//RA:	086015

// ======================================================================
// Includes

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

// ======================================================================
// Variáveis para uso na cena

#declare chao = 
  box{ <-20,-20,-1>, <+20,+20,0> }

#declare asa = box{<0,0,0>, <1,5,.25> texture{tx_fosca}
	rotate<0,0,30> translate<1,0,1>}




#local A23= <4,1,1.5>;

#local A32= <4.5,.25,1>;
#local A33= <4,1,.5>;

#local B22= <1,1.5,2>;
#local B23= <2,1.5,2>;

#local B32= <1,2,0>;
#local B33= <2,2,0>;



#local C22= <-.5,1.5,2>;
#local C23= <-1,1,2>;
#local C24= <-1.5,.5,2>;


#local C32= <-.5,1.5,.25>;
#local C33= <-1,1,.5>;
#local C34= <-1.5,.5,1.5>;

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

#macro interpola4(ta,A,B,C,D,td,tt)
  #local AB=interpola(ta,A,td,B,tt);
  #local BC=interpola(ta,B,td,C,tt);
  #local CD=interpola(ta,C,td,D,tt);

  #local ABC=interpola(ta,AB,td,BC,tt)
  #local BCD=interpola(ta,BC,td,CD,tt);

  #local ABCD=interpola(ta,ABC,td,BCD,tt);
  ABCD
#end

//////////////////////////////----macro aviao
#macro aviao(A23,A32,A33,
	     B22,B23,B32,B33,
	     C22,C23,C24,C32,C33,C34)

#local A31= <A32.x,0,1>;
#local A21= A31;
#local A22= A32;
#local A42= <A32.x,0,A32.z>;
#local A43= <A33.x,0,A33.z>;

#local A12= <A22.x,0,A22.z>;
#local A13= <A23.x,0,A23.z>;

#local B42= <B32.x,0,B32.z>;
#local B43= <B33.x,0,B33.z>;

#local B12= <B22.x,0,B22.z>;
#local B13= <B23.x,0,B23.z>;


#local C42= <C32.x,0,C32.z>;
#local C43= <C33.x,0,C33.z>;
#local C44= <C33.x,0,C33.z>;

#local C12= <C22.x,0,C22.z>;
#local C13= <C23.x,0,C23.z>;
#local C14= <C24.x,0,C24.z>;
//junção entre C e B
#local B11= (B12+C12)/2;
#local C11= B11;

#local B21= (B22+C22)/2;
#local C21= B21;

#local B31= (B32+C32)/2;
#local C31= B31;

#local B41= (B42+C42)/2;
#local C41= B41;

//junção entre B e A
#local B14= (B13+A13)/2;
#local A14= B14;

#local B24= (B23+A23)/2;
#local A24= B24;

#local B34=(B33+A33)/2;
#local A34= B34;

#local B44=(B43+A43)/2;
#local A44= B44;


//bico
#local A11= (A12+A21)/2;
#local A41= (A31+A42)/2;


#declare parteB =  //corpo
retalho(B11,B12,B13,B14,
	B21,B22,B23,B24,
	B31,B32,B33,B34,
	B41,B42,B43,B44,
	0.000001,tx_fosca,tx_fosca
	)

#declare parteC = //cauda
retalho(C11,C12,C13,C14,
	C21,C22,C23,C24,
	C31,C32,C33,C34,
	C41,C42,C43,C44,
	0.000001,tx_fosca,tx_fosca
	)

#declare parteA = //bico
retalho(A11,A12,A13,A14,
	A21,A22,A23,A24,
	A31,A32,A33,A34,
	A41,A42,A43,A44,
	0.0000002,tx_fosca,tx_fosca
	)

object{parteB}
object{parteC}
object{parteA}

object{parteB scale<1,-1,1>}
object{parteC scale<1,-1,1>}
object{parteA scale<1,-1,1>}
object{asa}
object{asa scale<1,-1,1>}

#end
//////////////////////////////////----- fim macro aviao


#macro aviao_deformado(A23,A32,A33,
	     B22,B23,B32,B33,
	     C22,C23,C24,C32,C33,C34,
	     d1,d2)

#local DA23=A23+deform1(A23)*d1+deform2(A23)*d2;
#local DA32=A32+deform1(A32)*d1+deform2(A32)*d2;
#local DA33=A33+deform1(A33)*d1+deform2(A33)*d2;
#local DB22=B22+deform1(B22)*d1+deform2(B22)*d2;
#local DB23=B23+deform1(B23)*d1+deform2(B23)*d2;
#local DB32=B32+deform1(B32)*d1+deform2(B32)*d2;
#local DB33=B33+deform1(B33)*d1+deform2(B33)*d2;
#local DC22=C22+deform1(C22)*d1+deform2(C22)*d2;
#local DC23=C23+deform1(C23)*d1+deform2(C23)*d2;
#local DC24=C24+deform1(C24)*d1+deform2(C24)*d2;
#local DC32=C32+deform1(C32)*d1+deform2(C32)*d2;
#local DC33=C33+deform1(C33)*d1+deform2(C33)*d2;
#local DC34=C34+deform1(C34)*d1+deform2(C34)*d2;

aviao(DA23,DA32,DA33,
	     DB22,DB23,DB32,DB33,
	     DC22,DC23,DC24,DC32,DC33,DC34)
#end

#macro deform1(p)  
  <p.x,
   0,
   0>
#end

#macro deform2(p)  
  #local cons1=0;
  #local cons2=0;
  #if(p.x<0)
    #local cons1=-2*p.x+(1-p.z);
    #local cons2=-(1-p.z);
  #end
  <cons2,
   0,
   cons1>
#end

#macro interpola(ta, va, tb, vb, tt)
  #local s=(tt-ta)/(tb-ta);
  ((1-s)*va+s*vb);
#end

/////////////////////////////////////////////////////////////////
// Trajetória do avião

#local A2=<0,1,1>;
#local A3=<-1,2,2>;

#local B2=<-3,2,3>;
#local B3=<-4,1,3>;

#local C2=<-4,-1,2>;
#local C3=<-3,-2,1>;

#local D2=<-1,-2,0>;
#local D3=<0,-1,0>;


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

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

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

#local D4=(D3+A2)/2;
#local A1=D4;

////////////////////////////////////////////////////////////////
//Angulo

#local alfa2=<0,0,30>;
#local alfa3=<0,0,60>;

#local beta2=<0,0,120>;
#local beta3=<0,0,150>;

#local gama2=<0,0,210>;
#local gama3=<0,0,240>;

#local delta2=<0,0,300>;
#local delta3=<0,0,330>;


#local alfa4=(alfa3+beta2)/2;
#local beta1=alfa4;

#local beta4=(beta3+gama2)/2;
#local gama1=beta4;

#local gama4=(gama3+delta2)/2;
#local delta1=gama4;

#local delta4=<0,0,(delta3.z+alfa2.z+360)/2>;
#local alfa1=<0,0,delta4.z-360>;

///////////////////////////////////////////////////////////////
//Predio/////

// ======================================================================
// Variáveis para uso na cena
#local p11= <0,0,3>;
#local p12= <2,2,3>;
#local p13= <-2,2,3>;
#local p14= <-1,4,3>;

#local p21= <0,0,2>;
#local p22= <2,2,2>;
#local p23= <-2,2,2>;
#local p24= <-1,4,2>;

#local p31= <0,0,1>;
#local p32= <2,2,1>;
#local p33= <-2,2,1>;
#local p34= <-1,4,1>;

#local p41= <0,0,0>;
#local p42= <2,2,0>;
#local p43= <-2,2,0>;
#local p44= <-1,4,0>;

#declare tx_bandeira = texture{ uv_mapping
	pigment{ image_map{jpeg "flag.jpg" }}
}

#declare tecido =
retalho(p11,p12,p13,p14,
	p21,p22,p23,p24,
	p31,p32,p33,p34,
	p41,p42,p43,p44,
	0.00001,tx_fosca,tx_bandeira
	)

#declare predio =
	box{ <0,0,0>, <5,5,7>}

#declare imagem = pigment{
	image_map{
		jpeg "outdoor.jpg"
	}
	scale<2.6,1.1,1.1>
	rotate<0,90,0>
	rotate<90,0,0>
}
#declare imagem2 = pigment{
	image_map{
		png "cartaz2.png"
	}
	scale<2.6,1.1,1.1>
	rotate<0,90,0>
	rotate<90,0,0>
}

#declare outdoor =
	box{<0,0,0>, <.5,3,1> texture{imagem} translate<-.5,0,0>}

#declare outdoor2 =
	box{<0,0,0>, <.5,3,1> texture{imagem2} translate<-.5,0,0>}

#declare mastro =
	cylinder{<0,0,0>, <0,0,8>, .2 texture{branco} }

#macro pred(cor,cartaz)
object{ eixos(3.00) }

union{
	object{tecido translate<0,0,5>}
	object{mastro}
	scale<.5,.5,.5>
	translate<0,0,7>
}

object{ predio texture{cor}}

#if(cartaz = 1)
  object{ outdoor translate<5.02,1,5>}
#else
  object{ outdoor2 translate<5.02,1,5>}
#end

#end

#declare rua = 
  box{<-1,-10,0> <1,10,.5>
  texture{preto} };
  

// ======================================================================
// Objetos na cena

object{ chao  texture{ tx_xadrez } }
object{ eixos(3.00) }

#macro quadro(tempo)

#declare i=-10;
#while (i<10)
  union{
  #if (mod(i,4) = 0)
    pred(branco,1)
    scale<.2,.2,.2>
  #else
    pred(verde,0)
    scale<.3,.3,.1>
  #end
    translate<-5,i,0>
    }
  
  #declare i=i+2;
#end

object{rua}

#declare i=-10;
#while (i<10)
  union{
  #if (mod(i,4) = 0 )
    pred(branco,0)
    scale<.2,.2,.2>
  #else
    pred(vermelho,1)
    scale<.1,.3,.5>
  #end
    rotate<0,0,180>
    translate<5,i,0>
    }
  #declare i=i+2;
#end




#local t0=0.00;
#local t1=0.25;
#local t2=0.50;
#local t3=0.75;
#local t4=1.00;



union{
aviao_deformado(A23,A32,A33,
	     B22,B23,B32,B33,
	     C22,C23,C24,C32,C33,C34,
	     0,0)
scale<.5,.5,.5>
rotate<0,0,90>

#if((tempo>=t0)&(tempo<t1))
  rotate interpola4(t0,alfa1,alfa2,alfa3,alfa4,t1,tempo)
  translate interpola4(t0,A1,A2,A3,A4,t1,tempo)
#end
#if((tempo>=t1)&(tempo<t2))
  rotate interpola4(t1,beta1,beta2,beta3,beta4,t2,tempo)
  translate interpola4(t1,B1,B2,B3,B4,t2,tempo)  
#end
#if((tempo>=t2)&(tempo<t3))
  rotate interpola4(t2,gama1,gama2,gama3,gama4,t3,tempo)
  translate interpola4(t2,C1,C2,C3,C4,t3,tempo)  
#end
#if((tempo>=t3)&(tempo<=t4))
  rotate interpola4(t3,delta1,delta2,delta3,delta4,t4,tempo)
  translate interpola4(t3,D1,D2,D3,D4,t4,tempo)
#end
}

#end
// ======================================================================
//Instruções de camera
#declare centro_cena = < 0.00, 0.00, 1.00 >;
#declare raio_cena = 10.0;
#declare dir_camera = < -7, 0, 2.00 >;
#declare dist_camera = 10;
#declare intens_luz = 1.00;
camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)



quadro(clock)