// Last edited on 2023-12-25 13:02:39 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,4>;

  #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,4>;

  #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,3>;

  #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,3>;

  #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, 5 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 * y translate posFim - <4.5,0,0> }
    object{ objPernaDireita rotate d11 * y 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,0> scale <+1,+1,-1> }
  }

#end

#macro cena(tt)

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

  #declare art1Ang = 225;
  #declare art2Ang = -180;

  #if(tt <= 0.5)
    #declare e11 = -45 - (tt * art1Ang);
    #declare d11 = 45 + (tt * art1Ang);
    #declare e21 = -45 - (tt * art1Ang);
    #declare d21 = 45 + (tt * art1Ang);
  #else
    #declare e11 = (-45 - 0.5 * art1Ang) + ((tt - 0.5) * art1Ang);
    #declare d11 = (45 + 0.5 * art1Ang) - ((tt - 0.5) * art1Ang);
    #declare e21 = (-45 - 0.5 * art1Ang) + ((tt - 0.5) * art1Ang);
    #declare d21 = (45 + 0.5 * art1Ang) - ((tt - 0.5) * art1Ang);
  #end

  #if(tt <= 0.5)
    #declare e12 = 90 - (tt * art2Ang);
    #declare d12 = -90 + (tt * art2Ang);
    #declare e22 = 90 - (tt * art2Ang);
    #declare d22 = -90 + (tt * art2Ang);
  #else
    #declare e12 = (90 - 0.5 * art2Ang) + ((tt - 0.5) * art2Ang);
    #declare d12 = (-90 + 0.5 * art2Ang) - ((tt - 0.5) * art2Ang);
    #declare e22 = (90 - 0.5 * art2Ang) + ((tt - 0.5) * art2Ang);
    #declare d22 = (-90 + 0.5 * art2Ang) - ((tt - 0.5) * art2Ang);
  #end

  #declare e13 = 45;
  #declare e14 = -45;
  #declare e15 = 90;

  #declare e23 = -45;
  #declare e24 = 45;
  #declare e25 = -90;

  #declare d13 = -45;
  #declare d14 = 45;
  #declare d15 = -90;

  #declare d23 = 45;
  #declare d24 = -45;
  #declare d25 = 90;

  #declare pk1 = 0;
  #declare pk2 = 0;
  #declare pk3 = -180;

  union {
    object{ 
      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
      ) 
    }
  }
#end


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

object{ cena(clock) }

#include "camlight.inc"
#declare centro_cena = < 0, 0, 6 >;
#declare raio_cena = 21.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)