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

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

#declare tx_branco =
 texture{
    pigment{ color rgb < 1, 1, 1 > }
  }

#declare tx_fosca_marrom =
 texture{
    pigment{ color rgb < 0.361, 0.2, 0.09 > }
  }

#declare tx_olhos =
  texture{
    pigment{ color rgb < 0.10, 0.62, 0.10 >}
    finish{ diffuse 0.9 ambient 0.5 }
  }

#declare tamanho_corpo = 20;
#declare tamanho_cabeca = 10;
#declare NQ = 7;

#declare bracoD = array[NQ];
#declare bracoD[0] = -90;
#declare bracoD[1] = 0;
#declare bracoD[2] = 90;
#declare bracoD[3] = 0;
#declare bracoD[4] = -90;
#declare bracoD[5] = -90;
#declare bracoD[6] = -90;

#declare bracoE = array[NQ];
#declare bracoE[0] = -90;
#declare bracoE[1] = 0;
#declare bracoE[2] = 90;
#declare bracoE[3] = 90;
#declare bracoE[4] = 90;
#declare bracoE[5] = 0;
#declare bracoE[6] = -90;

#declare CotD = array[NQ];
#declare CotD[0] = 0;
#declare CotD[1] = 0;
#declare CotD[2] = 0;
#declare CotD[3] = 90;
#declare CotD[4] = 0;
#declare CotD[5] = 0;
#declare CotD[6] = 0;

#declare CotE = array[NQ];
#declare CotE[0] = 0;
#declare CotE[1] = 0;
#declare CotE[2] = 0;
#declare CotE[3] = 0;
#declare CotE[4] = 0;
#declare CotE[5] = 90;
#declare CotE[6] = 0;

#declare dancaCabeca = array[NQ];
#declare dancaCabeca[0] = 0;
#declare dancaCabeca[1] = 0;
#declare dancaCabeca[2] = 0;
#declare dancaCabeca[3] = -90;
#declare dancaCabeca[4] = 0;
#declare dancaCabeca[5] = 90;
#declare dancaCabeca[6] = 0;

#declare faseQuadro = array[NQ];
#declare faseQuadro[0] = 0;
#declare faseQuadro[1] = 1/6;
#declare faseQuadro[2] = 2/6;
#declare faseQuadro[3] = 3/6;
#declare faseQuadro[4] = 4/6;
#declare faseQuadro[5] = 5/6;
#declare faseQuadro[6] = 1;

#macro coelhoDancante (fase)
  #local i = quadro_anterior(fase);
  #local CotEVar = interpola(faseQuadro[i], CotE[i], faseQuadro[i+1], CotE[i+1], fase);
  #local CotDVar = interpola(faseQuadro[i], CotD[i], faseQuadro[i+1], CotD[i+1], fase);
  #local bracoDVar = interpola(faseQuadro[i], bracoD[i], faseQuadro[i+1], bracoD[i+1], fase);
  #local bracoEVar = interpola(faseQuadro[i], bracoE[i], faseQuadro[i+1], bracoE[i+1], fase);
  #local dancaCabecaVar = interpola(faseQuadro[i], dancaCabeca[i], faseQuadro[i+1], dancaCabeca[i+1], fase);

  object { coelho (bracoDVar, CotDVar, 0, 0, 0,
                      bracoEVar, CotEVar, 0, 0, 0
                          ,dancaCabecaVar)}
#end

#macro interpola (f0, v0, f1, v1, f)
  #local ss = (f-f0)/(f1-f0);
  #local rr = 1-ss;
  (rr*v0 + ss*v1)
#end

#macro quadro_anterior(fase)
#local i=0;
#while (i < NQ - 1)
  #if ((faseQuadro[i] <= fase) & (faseQuadro[i+1] >= fase))
    #local resp = i;
  #end
  #local i = i+1;
#end
resp
#end

#macro coelho (ang_bracoD, ang_antebracoD, ang_coxaD, ang_canelaD, ang_peD,
                      ang_bracoE, ang_antebracoE, ang_coxaE, ang_canelaE, ang_peE
                          ,viraCabeca)
  union {
    object {cabeca() rotate <0,0,viraCabeca> translate <0,0,tamanho_corpo+tamanho_cabeca-2>}
    object {corpo()}
    object {braco(ang_antebracoE) rotate <ang_bracoE,0,0> translate <-tamanho_corpo,0,5>}
    object {braco(ang_antebracoD) rotate <ang_bracoD,0,0> translate <tamanho_corpo,0,5>}
    object {perna(ang_canelaD, ang_peD) rotate <ang_coxaD,0,0> translate <5, 0, -tamanho_corpo+5>}
    object {perna(ang_canelaE, ang_peE) rotate <ang_coxaE,0,0> translate <-5, 0, -tamanho_corpo+5>}
}
#end

#macro cabeca ()
  union{
    object { sphere{ <0,0,0>, tamanho_cabeca texture{tx_branco} } }
    object { sphere{ <0.4*tamanho_cabeca,0.5*tamanho_cabeca,0.4*tamanho_cabeca>, 3 texture{tx_olhos} } }
    object { sphere{ <-0.4*tamanho_cabeca,0.5*tamanho_cabeca,0.4*tamanho_cabeca>, 3 texture{tx_olhos} } }
    object { sphere{ <0,0,tamanho_cabeca/2>, 5 texture{tx_branco} } scale <1,0.3,2> rotate <0,7,0> translate <4,0,0>}
    object { sphere{ <0,0,tamanho_cabeca/2>, 5 texture{tx_branco} } scale <1,0.3,2> rotate <0,-7,0> translate <-4,0,0>}
    object { box { <-1,-0.3,-2>, <1,0.3,2> texture{tx_branco}} rotate <15,0,0> translate <0.2*tamanho_cabeca,0.9*tamanho_cabeca,-0.4*tamanho_cabeca> }
    object { box { <-1,-0.3,-2>, <1,0.3,2> texture{tx_branco}} rotate <15,0,0> translate <-0.2*tamanho_cabeca,0.9*tamanho_cabeca,-0.4*tamanho_cabeca> }
}
#end

#macro corpo ()
  union{
    object { sphere{ <0,0,0>, tamanho_corpo texture{tx_branco}} }
    object { sphere{ <0,-0.9*tamanho_corpo,-0.7*tamanho_corpo>, 6 texture{tx_branco}} }
}
#end

#macro braco (ang_antebraco)
  union {
    object {sphere{ <0,0,0>, 3 texture{tx_branco}} }
    object {ombro()}
    object {antebraco() rotate <ang_antebraco, 0, 0> translate <0,10,0>}
}
#end

#macro perna (ang_canela, ang_pe)
  union {
    object {coxa()}
    object {canela(ang_pe) rotate <ang_canela,0,0> translate <0,0,-10>}
}
#end

#macro ombro ()
  union {
    object {cylinder {<0,0,0>, <0,10,0>, 3 texture{tx_branco}}}
    object {sphere{ <0,10,0>, 3 texture{tx_branco}} }
}
#end

#macro antebraco ()
  union {
    object {cylinder {<0,0,0>, <0,10,0>, 3 texture{tx_branco}}}
    object {sphere{ <0,10,0>, 4 texture{tx_branco}} }
}
#end

#macro coxa ()
  union {
    object {cylinder {<0,0,0>, <0,0,-10>, 3 texture{tx_branco}}}
    object {sphere{ <0,0,-10>, 3 texture{tx_branco}} }
}
#end

#macro canela (ang_pe)
  union {
    object {cylinder {<0,0,0>, <0,0,-10>, 3 texture{tx_branco}}}
    object {cylinder {<0,0,-3>, <0,0,-10>, 4 texture{tx_fosca_marrom}}}
    object {pe() translate <0,4,0> rotate <ang_pe,0,0> translate <0,0,-9.9>}
}
#end

#macro pe ()
   union{
    object {sphere{ <0,-4,0>, 4 texture{tx_fosca_marrom}} }
    object {box {<-4,-8,-4>, <4,8,2> texture{tx_fosca_marrom}} }
}
#end

#include "eixos.inc"

 union {
    object {coelhoDancante(clock)}
}

#include "camlight.inc"
#declare centro_cena = < 0.00, 0.00, 0.00 >;
#declare raio_cena = 100.0;
#declare dir_camera = < 0.00, 1.00, 0.00 >;
#declare dist_camera = 160.0;
#declare intens_luz = 1.00;
camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)