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

#declare tx_robo = 
  texture{
    pigment{ color rgb < 0.25, 0.16, 0.16 > }
    finish{ diffuse 0.9 ambient 0.1 }
  }

#declare tx_membros = 
  texture{
    pigment{ color rgb < 0.10, 0.25, 0.16 > }
    finish{ diffuse 0.9 ambient 0.1 }
  }

#declare tx_submembros = 
  texture{
    pigment{ color rgb < 0.15, 0.15, 0.35 > }
    finish{ diffuse 0.9 ambient 0.1 }
  }


#declare tx_pata = 
  texture{
    pigment{ color rgb < 0.3, 0.3, 0.3 > }
    finish{ diffuse 0.9 ambient 0.1 }
  }

#declare tx_cabeca = 
  texture{
    pigment{ color rgb < 0.8, 0.2, 0.4 > }
    finish{ diffuse 0.9 ambient 0.1 }
  }

#declare tx_galho = 
  texture{
    pigment { color rgb <0.5, 0.2, 0.1>}
    finish{ diffuse 0.9 ambient 0.1 }
  }

// Objetos

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

// Macros

#macro dedos_mao(origem)
  union{
    cylinder {
      origem,
      origem + <0, 2, 0>,
      0.5
    }
    cylinder {
      origem,
      origem + <1, 2, 0>,
      0.5
    }
    cylinder {
      origem,
      origem + <-1, 2, 0>,
      0.5
    }
  }
#end

#macro pata(origem)
  union{
    sphere {
      origem + <0, 1, 0>,
      1
    }
    dedos_mao(origem+<0, 2, 0>)
  }
#end

#macro antebraco(origem, ang_3)
  union {
    cylinder {
      origem, origem + <0, 3, 0>,
      1
      texture {tx_submembros}
    }
    object{
      pata(<0, 0, 0>)
      rotate<0, 0, ang_3>
      translate origem+<0, 3, 0> // se a origem do antebraco = `origem`, entao origem da mao sera origem + 3 (fim do antebraco)
      texture {tx_pata}
    }
  }
#end

#macro braco(origem, ang_2, ang_3)
  union {
    cylinder {
      origem, origem + <0, 4, 0>,
      1
      texture {tx_membros}
    }
    object {
      antebraco(<0, 0, 0>, ang_3)
      rotate<ang_2, 0, 0>
      translate origem + <0, 4, 0>
    }
  }
#end

#macro cabeca(origem)
  union {
    sphere {
      origem + <0, 0, 2.5>,
      2.5
    }
    sphere {
      origem + <2.5, 0, 2.5>,
      0.5
    }
  }
#end

#macro subpescoco(origem, ang_3, ang_4)
  union {
    cylinder {
      origem, origem + <0, 0, 1>,
      1.5
      texture {tx_submembros}
    }
    object{
      cabeca(<0, 0, 0>)
      rotate<ang_3, 0, ang_4>
      translate origem+<0, 0, 1>
      texture {tx_cabeca}
    }
  }
#end

#macro pescoco(origem, ang_2, ang_3, ang_4)
  union {
    cylinder {
      origem, origem + <0, 0, 1>,
      1.5
      texture {tx_membros}
    }
    object {
      subpescoco(<0, 0, 0>, ang_3, ang_4)
      rotate<ang_2, 0, 0>
      translate origem + <0, 0, 1>
    }
  }
#end

#macro robo(E11, E12, E13, E14, D11, D12, D13, D14, E21, E22, E23, E24, D21, D22, D23, D24, P1, P2, P3, P4)
  union {
    cylinder {
      <0, 0, 0>, <0, 0, 12>,
      3
      texture {tx_robo}
    }
    object {
      braco(<0, 0, 0>, E13, E14)
      rotate<E11, 0, E12>
      translate<0, 3, 11>
    }
    object {
      braco(<0, 0, 0>, D13, D14)
      rotate<D11, 0, D12>
      translate<0, 3, 11>
      scale <1, -1, 1>
    }
    object {
      braco(<0, 0, 0>, E23, E24)
      rotate<E21, 0, E22>
      translate<0, 3, 0>
    }
    object {
      braco(<0, 0, 0>, D23, D24)
      rotate<D21, 0, D22>
      translate<0, 3, 0>
      scale <1, -1, 1>
    }
    object{
      pescoco(<0, 0, 0>, P2, P3, P4)
      rotate<0, P1, 0>
      translate<0, 0, 12>
    }
  }
#end

#declare NP = 21; // total parametros do robo

#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 = 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;
  P
#end

#macro acha_quadro(tt)
  #local ret = tt * 10;
  #if(tt >= 1.0)
    #local ret = 0;
  #end
  ret
#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 cena(tt)
  #local NQ = 10;           // total quadros-chave
  #local TQ = array[NQ+1];  // tempos (0.0, 0.1, 0.2, 0.3, ... , 1.0) de cada quadro chave
  #local PQ = array[NQ+1];  // parametros dos quadros-cahve

  #local TQ[0] = 0.000;
  #local PQ[0] = empacota(30, -75, 0, -75, 15, -75, 0, -75, -30, -75, 0, -75, -10, -75, 0, -75, 0, 0, 0, 0, 0)

  #local TQ[1] = 0.100;
  #local PQ[1] = empacota(30, -75, 0, -75, 15, -45, 0, 0, -30, -75, 0, -75, -10, -75, 0, -75, 0, 0, 0, 0, 0)

  #local TQ[2] = 0.200;
  #local PQ[2] = empacota(30, -75, 0, -75, 45, -45, 0, 0, -30, -75, 0, -75, -10, -75, 0, -75, 0, 0, 0, 0, 0)

  #local TQ[3] = 0.300;
  #local PQ[3] = empacota(30, -75, 0, -75, 45, -75, 0, -45, -30, -75, 0, -75, -10, -45, 0, 0, 0, 0, 0, 0, 0)

  #local TQ[4] = 0.400;
  #local PQ[4] = empacota(30, -75, 0, -75, 45, -75, 0, -45, -30, -75, 0, -75, 20, -45, 0, 0, 0, 0, 0, 0, 0)

  #local TQ[5] = 0.500;
  #local PQ[5] = empacota(30, -45, 0, 0, 45, -75, 0, -45, -30, -75, 0, -75, 20, -75, 0, -45, 0, 0, 0, 0, 0)

  #local TQ[6] = 0.600;
  #local PQ[6] = empacota(60, -45, 0, 0, 45, -75, 0, -45, -30, -75, 0, -75, 20, -75, 0, -45, 0, 0, 0, 0, 0)

  #local TQ[7] = 0.700;
  #local PQ[7] = empacota(60, -75, 0, -45, 45, -75, 0, -45, -30, -45, 0, 0, 20, -75, 0, -45, 0, 0, 0, 0, 0)

  #local TQ[8] = 0.800;
  #local PQ[8] = empacota(60, -75, 0, -45, 45, -75, 0, -45, 0, -45, 0, 0, 20, -75, 0, -45, 0, 0, 0, 0, 0)

  #local TQ[9] = 0.900;
  #local PQ[9] = empacota(60, -75, 0, -45, 45, -75, 0, -45, 0, -75, 0, -45, 20, -75, 0, -45, 0, 0, 0, 0, 5)

  #local TQ[NQ] = 1.000;
  #local PQ[NQ] = empacota(30, -75, 0, -75, 15, -75, 0, -75, -30, -75, 0, -75, -10, -75, 0, -75, 0, 0, 0, 0, 5)

  #local k = acha_quadro(tt);
  #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;
  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) 
    translate<0, 0, A20>
  }
  rob
#end


#include "eixos.inc"

// Cena

union{
  cylinder {
    <-100, 0, 6>, <100, 0, 6>, 1
    texture {tx_galho}
  }
  object {
      cena(clock)
      rotate<0, -90, 0>
    }
}

#include "camlight.inc"
#declare centro_cena = < 0.00, 0.00, 0.00 >;
#declare raio_cena = 30.0;
#declare dir_camera = < 0, 7.00, 3.00 >;
#declare dist_camera = 6*raio_cena;
#declare intens_luz = 1.20;
camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)