// Last edited on 2023-12-27 04:46:08 by stolfi

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

#declare tx_rosa  = 
  texture{
    pigment{ color rgb < 0.90, 0.40, 0.70 > }
    finish{ diffuse 0.8 ambient 0.1 specular 0.5 roughness 0.005 }
  }

#macro subMembro(e13, e14, e15)

  #local tamanhoSubMembro = <0,0,5>;

  #local objSubMembro =  cylinder{ <0,0,0>, tamanhoSubMembro, 0.5 texture{ tx_rosa } }
  #local objDedo = cylinder{ <0,0,0>, <0,0,2>, 0.3 texture{ tx_rosa } }

  union{
    object{ objSubMembro }
    object{ objDedo rotate e13 * y translate tamanhoSubMembro }
    object{ objDedo rotate e14 * y translate tamanhoSubMembro }
    object{ objDedo rotate e15 * y translate tamanhoSubMembro }
  }

#end


#macro membro(e12, e13, e14, e15)

  #local tamanhoMembro = <0,0,7>;

  #local objMembro = cylinder{ <0,0,0>, tamanhoMembro, 0.5 texture{ tx_rosa } }
  #local objSubMembro = object{ subMembro(e13, e14, e15) }

  union{
    object{ objMembro }
    object{ objSubMembro rotate e12 * y translate tamanhoMembro }
  }

#end


#macro subPecoco(pk3)

  #local tamanhoSubPescoco = <0,0,-2>;

  #local objSubPecoco =  cylinder{ <0,0,0>, tamanhoSubPescoco, 0.5 texture{ tx_rosa } }
  #local objCabeca = sphere{ <0,0,0>, 2 }

  union{
    object{ objSubPecoco }
    object{ objCabeca rotate pk3 * y translate tamanhoSubPescoco texture{ tx_rosa } }
  }

#end

#macro pescoco(pk2, pk3)

  #local tamanhoPescoco = <0,0,-2>;

  #local objPecoco = cylinder{ <0,0,0>, tamanhoPescoco, 0.5 texture{ tx_rosa } }
  #local objSubPecoco = object{ subPecoco(pk3) }

  union{
    object{ objPecoco }
    object{ objSubPecoco rotate pk2 * y translate tamanhoPescoco }
  }

#end


#macro robo(
  posFim,
  e11, e12, e13, e14, e15,
  e21, e22, e23, e24, e25,
  d11, d12, d13, d14, d15,
  d21, d22, d23, d24, d25,
  pk1, pk2, pk3
)

  #local troncoPrincipal = cylinder{ <0,0,0>, posFim, 4 texture{ tx_rosa } }
  #local objPernaEsquerda = object{ membro(e12, e13, e14, e15) }
  #local objPernaDireita = object{ membro(d12, d13, d14, d15) }
  #local objMaoEsquerda = object{ membro(e22, e23, e24, e25) }
  #local objMaoDireita = object{ membro(d22, d23, d24, d25) }
  #local objPescoco = object{ pescoco(pk2, pk3) }

  union{
    object{ troncoPrincipal }
    object{ objPernaEsquerda rotate e11 * x translate posFim - <4.5,0,0> }
    object{ objPernaDireita rotate d11 * x translate posFim + <4.5,0,0> }
    object{ objMaoEsquerda rotate e21 * y translate <0,0,0> - <4.5,0,0> scale <+1,+1,-1> }
    object{ objMaoDireita rotate d21 * y translate <0,0,0> + <4.5,0,0> scale <+1,+1,-1> }
    object{ objPescoco rotate pk1 * y translate <0,0,-10> scale <+1,+1,-1> }
  }

#end



#declare posFim = <0,0,11>;
#declare NP = 23;

#macro empacota(
  A0,
  A1, A2, A3, A4, A5,
  A6, A7, A8, A9, A10,
  A11, A12, A13, A14, A15,
  A16, A17, A18, A19, A20,
  A21, A22
)

  #local P = array[NP];

  #local P[0] = A0;
  #local P[1] = A1;
  #local P[2] = A2;
  #local P[3] = A3;
  #local P[4] = A4;
  #local P[5] = A5;
  #local P[6] = A6;
  #local P[7] = A7;
  #local P[8] = A8;
  #local P[9] = A9;
  #local P[10] = A10;
  #local P[11] = A11;
  #local P[12] = A12;
  #local P[13] = A13;
  #local P[14] = A14;
  #local P[15] = A15;
  #local P[16] = A16;
  #local P[17] = A17;
  #local P[18] = A18;
  #local P[19] = A19;
  #local P[20] = A20;
  #local P[21] = A21;
  #local P[22] = A22;

  P
#end

#macro acha_quadro(tt, NQ, TQ)

  #local cont = 0;
  #local k = NQ - 1;
  #while(cont < NQ)
    #if(TQ[cont] >= tt)
      #local k = cont;
      #local cont = NQ + 1;
    #end
    #local cont = cont + 1;
  #end

  k
#end

#macro interpola_quadros(
  tt, ta, Pa, tb, Pb, 
  A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12,
  A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21, A22
)

  #local s = (tt - ta)/(tb - ta);
  
  #declare A0 = (1-s)*Pa[0] + s*Pb[0];
  #declare A1 = (1-s)*Pa[1] + s*Pb[1];
  #declare A2 = (1-s)*Pa[2] + s*Pb[2];
  #declare A3 = (1-s)*Pa[3] + s*Pb[3];
  #declare A4 = (1-s)*Pa[4] + s*Pb[4];
  #declare A5 = (1-s)*Pa[5] + s*Pb[5];
  #declare A6 = (1-s)*Pa[6] + s*Pb[6];
  #declare A7 = (1-s)*Pa[7] + s*Pb[7];
  #declare A8 = (1-s)*Pa[8] + s*Pb[8];
  #declare A9 = (1-s)*Pa[9] + s*Pb[9];
  #declare A10 = (1-s)*Pa[10] + s*Pb[10];
  #declare A11 = (1-s)*Pa[11] + s*Pb[11];
  #declare A12 = (1-s)*Pa[12] + s*Pb[12];
  #declare A13 = (1-s)*Pa[13] + s*Pb[13];
  #declare A14 = (1-s)*Pa[14] + s*Pb[14];
  #declare A15 = (1-s)*Pa[15] + s*Pb[15];
  #declare A16 = (1-s)*Pa[16] + s*Pb[16];
  #declare A17 = (1-s)*Pa[17] + s*Pb[17];
  #declare A18 = (1-s)*Pa[18] + s*Pb[18];
  #declare A19 = (1-s)*Pa[19] + s*Pb[19];
  #declare A20 = (1-s)*Pa[20] + s*Pb[20];
  #declare A21 = (1-s)*Pa[21] + s*Pb[21];
  #declare A22 = (1-s)*Pa[22] + s*Pb[22];
#end

#macro cena(tt)

  #local NQ = 6;
  #local TQ = array[NQ+1];
  #local PQ = array[NQ+1];

  #local TQ[0] = 0.0000;
  #local PQ[0] = empacota(
    0,90,20,-20,40,                
    -45,90,-45,45,-90,
    0,-90,-20,20,-40,              
    45,-90,45,-45,90,
    0,0,0
  );

  #local TQ[1] = 0.1666;
  #local PQ[1] = empacota(
    0,0,20,-20,40,
    -45,90,-45,45,-90,
    0,-90,-20,20,-40,
    45,-90,45,-45,90,
    0,0,0
  );

  #local TQ[2] = 0.3332;
  #local PQ[2] = empacota(
    -60,20,20,-20,40,
    -45,90,-45,45,-90,
    0,-90,-20,20,-40,
    45,-90,45,-45,90,
    0,0,0
  );

  #local TQ[3] = 0.4998;
  #local PQ[3] = empacota(
    -60,60,20,-20,40,
    -45,90,-45,45,-90,
    0,-90,-20,20,-40,
    45,-90,45,-45,90,
    0,0,0
  );

  #local TQ[4] = 0.6664;
  #local PQ[4] = empacota(
    -60,60,20,-20,40,
    -45,90,-45,45,-90,
    0,0,-20,20,-40,
    45,-90,45,-45,90,
    0,0,0
  );

  #local TQ[5] = 0.8330;
  #local PQ[5] = empacota(
    -60,60,20,-20,40,
    -45,90,-45,45,-90,
    -60,-20,-20,20,-40,
    45,-90,45,-45,90,
    0,0,0
  );

  #local TQ[6] = 1.0000;
  // #local PQ[6] = empacota(
  //   -60,60,20,-20,40,
  //   -45,90,-45,45,-90,
  //   -60,-60,-20,20,-40,
  //   45,-90,45,-45,90,
  //   0,0,0
  // );
  #local PQ[6] = PQ[0]; 

  #local k = acha_quadro(tt,NQ, TQ);

  #local A0 = 0;
  #local A1 = 0; #local A2 = 0; #local A3 = 0; #local A4 = 0; #local A5 = 0;
  #local A6 = 0; #local A7 = 0; #local A8 = 0; #local A9 = 0; #local A10 = 0;
  #local A11 = 0; #local A12 = 0; #local A13 = 0; #local A14 = 0; #local A15 = 0;
  #local A16 = 0; #local A17 = 0; #local A18 = 0; #local A19 = 0; #local A20 = 0;
  #local A21 = 0; #local A22 = 0;

  interpola_quadros(
    tt, TQ[k], PQ[k], TQ[k+1], PQ[k+1], 
    A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12,
    A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21, A22
  );

  #local rob = object{ robo(
    posFim,
    A0,
    A1, A2, A3, A4, A5,
    A6, A7, A8, A9, A10,
    A11, A12, A13, A14, A15,
    A16, A17, A18, A19, A20,
    A21, A22
  )}

  rob

#end

#include "eixos.inc"
// object{ eixos(10) }

object{ cena(clock) }

#include "galho.inc"
#local Lg = 14; // Deslocamento em 1 ciclo -- Prof
object{ galho( < 0, -Lg/2, 0>, < 0, +Lg/2, 0>, 1, clock) rotate -12*x translate +16.5*z}

// cylinder{ <0,-30,23>, <0,30,10>, 1 texture{ tx_rosa } }

#include "camlight.inc"
#declare centro_cena = < 0.00, 0.00, 5.00 >;
#declare raio_cena = 27.0;
#declare dir_camera = < 7, 4, 3 >;
#declare dist_camera = 5*raio_cena;
#declare intens_luz = 1.20;
camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)