// Last edited on DATE TIME by USER
// Processed by remove-cam-lights

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

background{ color Turquoise }

#declare chassi =
union{
  object{box{<0,0,0>, <4,7,2>} pigment {color Yellow} }
  object{box{<0,2,2>, <4,7,3.5>} pigment {color Green}}
}

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

#macro projecao(A)
  (<0, A.y, A.z>)
#end

#macro deforma(p)
  #local cons = -0.5+sin(pi*p.y);
  #if(p.y < 8)
    #local pd = <p.x * cons, -3 + p.y*0.5, p.z * cons>;
  #else
    #local pd = <0, -3 + p.y*0.5, p.z *(1 + cons)>;
  #end
  (p + pd)
#end

#macro deforma2(p)
  #local cons = sin(pi*p.y/4);
  #local pd = <p.x * cons, 0, 0>;
  (p + pd)
#end

#macro lataria(
  A01, A02,
  A11, A12, A21, A22,
  B11, B12, B21, B22,
  C11, C12, C21, C22,
  C31, C32
)

  #local A00 = projecao(A01);//<0,0,0.75>;
  #local A03 = projecao(A02);//<0,0,3>;
  #local A10 = projecao(A11); //<0,2,0.25>;
  #local A13 = projecao(A12); //<0,2,3.75>;
  #local A20 = projecao(A21);//<0,4,0>;
  #local A23 = projecao(A22);//<0,4,6>;

  #local B10 = projecao(B11);//<0,8,0>;
  #local B13 = projecao(B12);//<0,8,6.5>;
  #local B20 = projecao(B21);//<0,10,0.25>;
  #local B23 = projecao(B22);//<0,10,5.4>;

  #local C10 = projecao(C11);//<0,14,0.25>;
  #local C13 = projecao(C12);//<0,14,4>;
  #local C20 = projecao(C21);//<0,15,0>;
  #local C23 = projecao(C22);//<0,15,5.4>;
  #local C30 = projecao(C31);//<0,16,0>;
  #local C33 = projecao(C32);//<0,16,5.4>;

  #local AB0 = (A20+B10)/2;
  #local AB1 = (A21+B11)/2;
  #local AB2 = (A22+B12)/2;
  #local AB3 = (A23+B13)/2;
  #local BC0 = (B20+C10)/2;
  #local BC1 = (B21+C11)/2;
  #local BC2 = (B22+C12)/2;
  #local BC3 = (B23+C13)/2;

  #local rg = 0.0;

  union{
    object{
      retalho(
        A00,A01,A02,A03,
        A10,A11,A12,A13,
        A20,A21,A22,A23,
        AB0,AB1,AB2,AB3,
        rg,
        pigment{color Blue}, pigment{ color Yellow }
      )
    }

    object{
      retalho(
        AB0,AB1,AB2,AB3,
        B10,B11,B12,B13,
        B20,B21,B22,B23,
        BC0,BC1,BC2,BC3,
        rg,
        pigment{color Blue}, pigment{ color Green }
      )
    }

    object{
      retalho(
        BC0,BC1,BC2,BC3,
        C10,C11,C12,C13,
        C20,C21,C22,C23,
        C30,C31,C32,C33,
        rg,
        pigment{color Blue}, pigment{ color Blue }
      )
    }
  }
#end

#declare A01 = <3,0,0.75>;
#declare A02 = <3,0,3>;
#declare A11 = <3,2,0.25>;
#declare A12 = <3,2,3.75>;
#declare A21 = <3,4,0>;
#declare A22 = <3,4,6>;

#declare B21 = <3,10,0.25>;
#declare B22 = <3,10,5.4>;
#declare B11 = <3,8,0>;
#declare B12 = <3,8,6.5>;

#declare C11 = <3,14,0.25>;
#declare C12 = <3,14,4>;
#declare C21 = <3,15,0>;
#declare C22 = <3,15,5.4>;
#declare C31 = <3,16,0>;
#declare C32 = <3,16,5.4>;

#macro lataria_deformada(d1, d2)
  #local Ad01 = deforma(A01)*d1 + deforma2(A01)*d2;
  #local Ad02 = deforma(A02)*d1 + deforma2(A02)*d2;
  #local Ad11 = deforma(A11)*d1 + deforma2(A11)*d2;
  #local Ad12 = deforma(A12)*d1 + deforma2(A12)*d2;
  #local Ad21 = deforma(A21)*d1 + deforma2(A21)*d2;
  #local Ad22 = deforma(A22)*d1 + deforma2(A22)*d2;

  #local Cd11 = deforma(C11)*d1 + deforma2(C11)*d2;
  #local Cd12 = deforma(C12)*d1 + deforma2(C12)*d2;
  #local Cd21 = deforma(C21)*d1 + deforma2(C21)*d2;
  #local Cd22 = deforma(C22)*d1 + deforma2(C22)*d2;
  #local Cd31 = deforma(C31)*d1 + deforma2(C31)*d2;
  #local Cd32 = deforma(C32)*d1 + deforma2(C32)*d2;

  lataria(
    Ad01, Ad02,
    Ad11, Ad12, Ad21, Ad22,
    B11, B12, B21, B22,
    Cd11, Cd12, Cd21, Cd22,
    Cd31, Cd32
  )
#end

#macro lado(d1,d2)
  union{
    object{
      lataria_deformada(d1,d2)
    }

    object{
      box { <0,0,0>, <5,5,0.5> }
      translate <2.5,5,3>
      pigment{ color Gray }
    }
  }
#end

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

#macro interp4(tA, A, B, C, D, tD, tt)
        #local AB = interp2(tA, A, tD, B, tt);
        #local BC = interp2(tA, B, tD, C, tt);
        #local CD = interp2(tA, C, tD, D, tt);

        #local ABC = interp2(tA, AB, tD, BC, tt);
        #local BCD = interp2(tA, BC, tD, CD, tt);

        #local ABCD = interp2(tA, ABC, tD, BCD, tt);

        (ABCD)
#end

#macro aviao(d1, d2)
  union{
    object{lado(d1,d2)}
    object{lado(d1,d2) scale <-1,1,1>}
  }
#end

#macro quadro(tt)

        #local t0 = 0;
        #local t1 = 0.25;
        #local t2 = 0.50;
        #local t3 = 0.75;
        #local t4 = 1;

        #local tr0 = 0;
        #local tr1 = 0.20;
        #local tr2 = 0.30;
        #local tr3 = 0.70;
        #local tr4 = 0.80;

        #local p12 = <0, 20, 2>;
        #local p13 = <0, 20, 10>;
        #local p22 = <0, -20, 12>;
        #local p23 = <0, -20, 20>;
        #local p32 = <0, 20, 20>;
        #local p33 = <0, 20, 12>;
        #local p42 = <0, -20, 10>;
        #local p43 = <0, -20, 2>;

        #local p14 = (p13+p22)/2;
        #local p24 = (p23+p32)/2;
        #local p34 = (p33+p42)/2;
        #local p44 = (p43+p12)/2;

        #declare px = p44;
        #declare aoa = 0;
        #declare rol = 0;

        #if(tt >= t0 & tt < t1)
                #declare px = interp4(t0, p44, p12, p13, p14, t1, tt);
                #declare aoa = interp4(t0, 0, 45, 135, 180, t1, tt);
                #declare rol = interp4(t0, 0, 5, 20, 180, t1, tt);
        #end
        #if(tt >= t1 & tt < t2)
                #declare px = interp4(t1, p14, p22, p23, p24, t2, tt);
                #declare aoa = interp4(t1, 180, 225, 315, 360, t2, tt);
                #declare rol = interp4(t1, 180, 180, 180, 180, t2, tt);
        #end
        #if(tt >= t2 & tt < t3)
                #declare px = interp4(t2, p24, p32, p33, p34, t3, tt);
                #declare aoa = interp4(t2, 360, 405, 495, 540, t3, tt);
                #declare rol = interp4(t2, 180, 180, 180, 180, t3, tt);
        #end
        #if(tt >= t3 & tt <= t4)
                #declare px = interp4(t3, p34, p42, p43, p44, t4, tt);
                #declare aoa = interp4(t3, 540, 585, 675, 720, t4, tt);
                #declare rol = interp4(t3, 180, 20, 5, 0, t4, tt);
        #end

        object{ aviao(1, 0) rotate < -aoa, rol, 180> scale <0.3, 0.3, 0.3> translate px}
        object{ aviao(1, 0) rotate < aoa, -rol, 180> scale <0.3, 0.3, 0.3> translate px*<1,1,-1>}
#end

quadro(clock)

#include "camlight.inc"
#declare centro_cena = < 0.00, 0.00, 5.00 >;
#declare raio_cena = 30.0;
#declare dir_camera = < 5, -3, 2 >;
#declare dist_camera = 1000.0;
#declare intens_luz = 1.00;
camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)