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

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

#declare tx_plastico =
  texture{
    pigment{ color rgb < 0.10, 0.80, 1.00 > }
    finish{ diffuse 0.8 ambient 0.1 specular 0.5 roughness 0.005 }
  }

#declare tx_espelho =
  texture{
    pigment{ color rgb < 1.00, 0.85, 0.30 > }
    finish{ diffuse 0.2 reflection 0.7*< 1.00, 0.85, 0.30 > ambient 0.1 }
  }

#declare raio = 2.000;

#declare olho =
  sphere{ <0,0,0>, 0.3 texture{ tx_espelho } }

#declare orelha =
  box{ < -0.1 , -0.5 , 0 >, < 0.1, 0.5 ,3 > texture { tx_plastico } }

#declare cabeca =
  sphere{ <0,0,0>, 2 texture { tx_plastico } }

#declare tronco =
  cylinder{ <0,0,0>, <0,0,5>, 2 texture { tx_plastico } }

#declare musculo =
  cylinder{ <0,0,0>, <0,0,2>, 0.5 texture { tx_plastico } }

#declare articulacao =
  sphere{ <0,0,0>, 0.3 texture { tx_plastico } }

#declare apendice =
  box{ <0,-0.25,0>, <1,0.25,0.5> texture { tx_plastico } }

#declare NQ = 9;
#declare tempo = array[NQ];
#declare timer_A2 = array[NQ];
#declare timer_A3 = array[NQ];
#declare timer_B2 = array[NQ];
#declare timer_B3 = array[NQ];
#declare timer_C1 = array[NQ];
#declare timer_D1 = array[NQ];

#declare tempo[0] = 0.0;
#declare tempo[1] = 0.125;
#declare tempo[2] = 0.250;
#declare tempo[3] = 0.375;
#declare tempo[4] = 0.5;
#declare tempo[5] = 0.625;
#declare tempo[6] = 0.75;
#declare tempo[7] = 0.875;
#declare tempo[8] = 1.0;

#declare timer_A2[0] = -90;
#declare timer_A2[1] = -180;
#declare timer_A2[2] = -90;
#declare timer_A2[3] = 0;
#declare timer_A2[4] = -90;
#declare timer_A2[5] = -180;
#declare timer_A2[6] = -90;
#declare timer_A2[7] = 0;
#declare timer_A2[8] = -90;

#declare timer_A3[0] = -90;
#declare timer_A3[1] = 0;
#declare timer_A3[2] = -90;
#declare timer_A3[3] = 0;
#declare timer_A3[4] = -90;
#declare timer_A3[5] = 0;
#declare timer_A3[6] = -90;
#declare timer_A3[7] = 0;
#declare timer_A3[8] = -90;

#declare timer_B2[0] = -90;
#declare timer_B2[1] = 0;
#declare timer_B2[2] = -90;
#declare timer_B2[3] = -180;
#declare timer_B2[4] = -90;
#declare timer_B2[5] = 0;
#declare timer_B2[6] = -90;
#declare timer_B2[7] = -180;
#declare timer_B2[8] = -90;

#declare timer_B3[0] = -90;
#declare timer_B3[1] = 0;
#declare timer_B3[2] = -90;
#declare timer_B3[3] = 0;
#declare timer_B3[4] = -90;
#declare timer_B3[5] = 0;
#declare timer_B3[6] = -90;
#declare timer_B3[7] = 0;
#declare timer_B3[8] = -90;

#declare timer_C1[0] = 0;
#declare timer_C1[1] = 0;
#declare timer_C1[2] = 0;
#declare timer_C1[3] = 0;
#declare timer_C1[4] = 0;
#declare timer_C1[5] = 45;
#declare timer_C1[6] = 0;
#declare timer_C1[7] = 0;
#declare timer_C1[8] = 0;

#declare timer_D1[0] = 0;
#declare timer_D1[1] = 0;
#declare timer_D1[2] = 0;
#declare timer_D1[3] = 0;
#declare timer_D1[4] = 0;
#declare timer_D1[5] = 0;
#declare timer_D1[6] = 0;
#declare timer_D1[7] = -45;
#declare timer_D1[8] = 0;

#macro head()
  union{
    object{ cabeca }
    object{ orelha rotate <-30,0,0> translate < 0, 0.5, 1.5 > }
    object{ orelha rotate < 30,0,0> translate < 0, -0.5, 1.5 > }
    object{ olho translate < 2, 0.5, 0.5 > }
    object{ olho translate < 2, -0.5, 0.5 > }
}
#end

#macro mao(M)
  union{
    object{ articulacao }
    object{ apendice translate <0,0,-0.8> rotate <0,M,0> texture{ tx_espelho } }
  }
#end

#macro antebraco(N,M)
  union{
    object{ articulacao }
    object{ musculo translate <0,0,-2.3> rotate <0,N,0> }
    object{ mao(M) translate <0,0,-2.6> rotate <0,N,0> }
  }
#end

#macro braco(X,Y,N,M)
  union{
    object{ articulacao }
    object{ musculo translate <0,0,-2.3> rotate <X,Y,0> }
    object{ antebraco(N,M) translate <0,0,-2.6> rotate <X,Y,0> }
  }
#end

#macro pe(P)
  union{
    object{ articulacao }
    object{ apendice translate <0,0,-0.8> rotate <0,P,0> texture{ tx_espelho } }
  }
#end

#macro canela(C,P)
  union{
    object{ articulacao }
    object{ musculo translate <0,0,-2.3> rotate <0,C,0> }
    object{ pe(P) translate <0,0,-2.6> rotate <0,C,0> }
  }
#end

#macro perna(X,Y,C,P)
  union{
    object{ articulacao }
    object{ musculo translate <0,0,-2.3> rotate <X,Y,0> }
    object{ canela(C,P) translate <0,0,-2.6> rotate <X,Y,0> }
  }
#end

#macro rabbit(A1,A2,A3,A4, B1,B2,B3,B4, C1,C2,C3,C4, D1,D2,D3,D4)
  union{
    object{ head() translate <0,0,7> }
    object{ tronco }
    object{ braco(A1,A2,A3,A4) translate <0,2,4> }
    object{ braco(B1,B2,B3,B4) translate <0,-2,4> }
    object{ perna(C1,C2,C3,C4) translate <0, 1.5,0> }
    object{ perna(D1,D2,D3,D4) translate <0,-1.5,0> }
  }
#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 k = 0;
  #while ((k < NQ-1) & (tempo[k+1] < fase))
    #local k = k+1;
  #end
  k
#end

#macro coelho_dancando(fase)
  #local i = quadro_anterior(fase);
  #local A2 = interpola( tempo[i], timer_A2[i], tempo[i+1], timer_A2[i+1], fase);
  #local A3 = interpola( tempo[i], timer_A3[i], tempo[i+1], timer_A3[i+1], fase);
  #local B2 = interpola( tempo[i], timer_B2[i], tempo[i+1], timer_B2[i+1], fase);
  #local B3 = interpola( tempo[i], timer_B3[i], tempo[i+1], timer_B3[i+1], fase);
  #local C1 = interpola( tempo[i], timer_C1[i], tempo[i+1], timer_C1[i+1], fase);
  #local D1 = interpola( tempo[i], timer_D1[i], tempo[i+1], timer_D1[i+1], fase);

  object { rabbit(0,A2,A3,30, 0,B2,B3,30, C1,0,0,0, D1,0,0,0) }
#end

#include "eixos.inc"

union{
  object{ eixos(1.00) }
  object{ coelho_dancando(clock) }
}

#include "camlight.inc"
#declare centro_cena = < 0.00, 0.00, 5.00 >;
#declare raio_cena = 15.0;
#declare dir_camera = < 14.00, 7.00, 8.00 >;
#declare dist_camera = 20.0;
#declare intens_luz = 1.00;
camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)