// Last edited on 2023-12-26 15:41:41 by stolfi

background{ color rgb < 0.90, 0.80, 0.85 > }
#declare tx_fosca_cinza = 
  texture{
    pigment{ color rgb < 0.3, 0.3, 0.3 > }
    finish{ diffuse 0.9 ambient 0.1 }
  }

#declare corpo =
    box {
        <-1, -2, -3>, <1, 2, 3> // <x, y, z> near lower left corner, <x, y, z> far upper right corner
    }
//mudar para o numero de parametros do robo
#declare NP = 20; 

#macro cena(tt)
  #local NQ = 5; //Número de quadros chave excusive o último
  #local TQ = array[NP+1] //tempos clock dos quadros chave
  #local PQ = array[NQ+1]; // Parametros dos quadro-chave 

  #local TQ[0] = 0;
  #local PQ[0] = empacota()
  //...
  #local TQ[1] = 0.2;
  #local PQ[1] = empacota()

  #local TQ[2] = 0.4;
  #local PQ[2] = empacota()

  #local TQ[3] = 0.6;
  #local PQ[3] = empacota()

  #local TQ[4] = 0.8;
  #local PQ[4] = empacota()

  #local TQ[5] = 1;
  #local PQ[5] = empacota()


  #local k = acha_quadro(tt);
  //zera as var dos angulos para satisfazer  pov-ray
  #local A0 = 0; #local A1 = 0; #local A2 = 0; #local A3 = 0; #local A4 = 0; #local A5 = 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, A13, A14, A15, A16, A17, A18, A19, A20)
  
  #local rob = object{robo(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20)}
  rob
#end

#macro empacota(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20)
  #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;

  P
#end

#macro acha_quadro(tt, NQ, TQ)
  #local k = 0;
  #while (TQ[k] >= tt & TQ[k+1]<tt)
    #local k = k + 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, A13, A14, A15, A16, A17, A18, A19, A20)
  #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]
#end

#macro pata()
  #local dedo1 = cylinder{<-1,-1,-8>, <-1,-3,-8>, 0.3}
  #local dedo2 = cylinder{<-1,-1,-8>, <-1,-5,-8>, 0.3}
  union {
    object{dedo1 texture{tx_fosca_cinza}}
    object{dedo2 texture{tx_fosca_cinza}}
  }
#end


#macro subPerna(p3,p4)
  #local quadriceps = cylinder {<-1,-1,-5>, <-1,-1,-8>, 0.5}
  #local sub = object{pata()}
  #local juntas = sphere {<-1,-1,-8>, 0.6}
  union {
    object{quadriceps texture{tx_fosca_cinza}}
    object{sub rotate p3*x translate<0,2,0>}
    object{juntas texture{tx_fosca_cinza}}
  }
#end

#macro perna(p1,p2,p3,p4)
  #local origem = cylinder {<-1,1,-3>, <-1,1,-5>, 0.5}
  #local sub = object{subPerna(p3,p4)}
  #local juntas = sphere {<-1,1,-5>, 0.6}
  union {
    object{origem texture{tx_fosca_cinza}}
    object{sub rotate p2*y translate<0,2,0>}
    object{juntas texture{tx_fosca_cinza}}
  }
#end

#macro dedos_braco()
  #local dedo1 = cylinder{<0,0,0>, <0,1.5,1>, 0.3}
  #local dedo2 = cylinder{<0,0,0>, <0,2,1>, 0.3}
  #local dedo3 = cylinder{<0,0,0>, <0,2.5,1>, 0.3}
  #local dedo4 = cylinder{<0,0,0>, <0,3,1>, 0.3}
  union {
    object{dedo1 texture{tx_fosca_cinza}}
    object{dedo2 texture{tx_fosca_cinza}}
    object{dedo3 texture{tx_fosca_cinza}}
    object{dedo4 texture{tx_fosca_cinza}}
  }
#end

#macro subbraco(p3,p4)
  #local triceps = cylinder {<1, 4, 2.5>, <1, 4, 0>, 0.5}
  #local sub = object{dedos_braco()}
  #local juntas = sphere {<1, 4, 0>, 0.6}
  union {
    object{triceps texture{tx_fosca_cinza}}
    object{sub rotate p3*x translate<1, 4, 0>}
    object{juntas texture{tx_fosca_cinza}}
  }
#end

#macro braco(p1,p2,p3,p4)
  #local origem = cylinder {<1, 2, 2.5>, <1, 6, 2.5>, 0.5}
  #local sub = object{subbraco(p3,p4)}
  #local juntas = sphere {<1, 6, 2.5>, 0.6}
  union {
    object{origem texture{tx_fosca_cinza}}
    object{sub rotate p2*x translate<0,2,0>}
    object{juntas texture{tx_fosca_cinza}}
  }
#end

#macro cranio()
  sphere { <0, 0, 0>, 1 }
#end

#macro subcabeca(c3,c4)
  #local pescoco2 = cylinder {<0, 0, 0>, <0,0,8>, 0.5}
  #local juntas = sphere {<0,0,8>, 0.6}
  #local k = object{cranio()}
  union {
    object{pescoco2 texture{tx_fosca_cinza}}
    object{juntas texture{tx_fosca_cinza}}
    object{k translate<0,0,8> texture{tx_fosca_cinza}}
  }
#end

#macro cabeca(c1,c2,c3,c4)
  #local pescoco = cylinder {<0, 0, 1.5>, <0, 0, 6>, 0.5}
  #local sub = object{subcabeca(c3,c4)}
  #local juntas = sphere {<0, 0, 6>, 0.6}
  union {
    object{pescoco texture{tx_fosca_cinza}}
    object{sub rotate c2*y translate<0, 0, 6>}
    object{juntas texture{tx_fosca_cinza}}
  }
#end

#macro robo(c1,c2,c3,c4, b1,b2,b3,b4,d1,d2,d3,d4, e1,e2,e3,e4, p1,p2,p3,p4)
  union {
    object{corpo}
    object{perna(p1,p2,p3,p4) rotate p1*z }
    object{perna(p1,p2,p3,p4) rotate p1*z scale<1,-1,1> }
    object{braco(b1,b2,b3,b4) rotate b1*z }
    object{braco(b1,b2,b3,b4) rotate b1*z scale<1,-1,1> }
    object{cabeca(c1,c2,c3,c4)}
  }
  
#end

union {
  
  #local c1 = 0;
  #local c2 = 45*sin(radians(45)*clock*8);
  #local c3 = 0;
  #local c4 = 0;
  #local b1 = 0;
  #local b2 = 0;
  #local b3 = 60*sin(radians(45)*clock*8);
  #local b4 = 0;
  #local d1 = 0;
  #local d2 = 0;
  #local d3 = 0;
  #local d4 = 0;
  #local e1 = 0;
  #local e2 = 0;
  #local e3 = 0;
  #local e4 = 0;
  #local p1 = 0;
  #local p2 = 0;
  #local p3 = 0;
  #local p4 = 0;
  object{robo(c1,c2,c3,c4, b1,b2,b3,b4,d1,d2,d3,d4, e1,e2,e3,e4, p1,p2,p3,p4) rotate -90*y}

}

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

#include "camlight.inc"
#declare centro_cena = < -1.00, 0.00, 2.00 >;
#declare raio_cena = 17.0;
#declare dir_camera = < 7, 5, 3 >;
#declare dist_camera = 5*raio_cena;
#declare intens_luz = 1.20;
camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)