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

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

#declare olho = union {
  sphere {
    <0, 0, 0>, 0.2
    pigment {
      color rgb <1, 1, 1>
    }
  }
  sphere {
    <0, 0.12, 0>, 0.1
    pigment {
      color rgb <0, 0, 0>
    }
  }
}

#declare orelha = difference {
  #local s = 0.55;
  sphere {
    <0, 0, s>, s
    scale <1, 0.3, 2>
  }

  sphere {
    <0, 0, s>, s
    scale <1, 0.3, 2>
    translate <0, s/4, 0>
  }
}

#declare pelo = cylinder {
  <0, 0, 0>, <1, 0, 0>, 0.01
}

#declare narina = union {
  sphere { <0, 0, 0>, 0.3 }
  object { pelo rotate <0, -10, 0> }
  object { pelo rotate <0,   0, 0> }
  object { pelo rotate <0, +10, 0> }
}

#declare cabeca = union {
  sphere {
    <0, 0, 0>, 1
    scale <1.1, 1, 1.2>
  }
  object { orelha translate <-0.8, 0, 0.6> }
  object { orelha translate < 0.8, 0, 0.6> }

  #local a = 40;
  object { olho rotate <-a, 0, -30> translate <0, 1, 0> rotate <+a, 0, +30> }
  object { olho rotate <-a, 0, +30> translate <0, 1, 0> rotate <+a, 0, -30> }

  sphere { narina rotate <10, 0, 30> scale <-1, 1, 1> translate <0, 1, 0> rotate <0, 0, +10> }
  sphere { narina rotate <10, 0, 30> translate <0, 1, 0> rotate <0, 0, -10> }
  pigment { color rgb <1, 1, 1> }

  translate <0, 0, 1.2>
}

#declare relogio = union {
  difference {
    cylinder { <0, 0, 0>, <0, 0.2, 0>, 0.4 }
    cylinder { <0, -0.1, 0>, <0, 0.3, 0>, 0.3 }
    pigment { color rgb <0.2, 0.2, 1> }
  }
  cylinder { <0, 0, 0>, <0, 0, 0.1>, 0.2 translate <0, 0.1, 0.35>
    pigment {color rgb <0.6, 0.6, 0.6> }
  }
}

#macro pata(c)
  union {

    sphere { <0, 0, 0>, 0.1 pigment { color rgb <1, 0, 0> } }
    difference {
      sphere { <0, 0, 0>, 0.4 scale <1, 1.3, 1> }
      box { <-1, -1, 0>, <1, 1, -1> }
      #local tr = 0.4 * sqrt(2)/2;
      translate <0, 1.3*tr, -tr>
    }

    rotate <c, 0, 0>
    pigment { color rgb <1, 1, 1> }
  }
#end

#macro ante(b, c, rel)
  union {
    cylinder { <0, 0, 0>, <0, 1, 0>, 0.3 pigment { color rgb <1, 1, 1> } }
    #if (rel = true)
      object { relogio translate <0, 0.7, 0> }
    #end
    sphere { <0, 1, 0>, 0.3 pigment { color rgb <1, 1, 1> } }
    object { pata(c) translate <0, 1.2, 0> }
    rotate <b, 0, 0>
  }
#end

#macro ante_ante(a, b, c, tilt, rel)
  union {
    sphere { <0, 0, 0>, 0.3 pigment { color rgb <1, 1, 1> } }
    cylinder { <0, 0, 0>, <0, 0, -1>, 0.3 pigment { color rgb <1, 1, 1> } }
    sphere { <0, 0, -1>, 0.3 pigment { color rgb <1, 1, 1> } }
    object { ante(b, c, rel) translate <0, 0, -1> }
    rotate <0, -tilt, 0>
    rotate <a, 0, 0>
  }
#end

#macro perna(a, b, c)
  object {
    ante_ante(a, b-90, c+90, 0, false)
  }
#end

#macro braco(a, b, c, rel)
  object {
    ante_ante(a, b-90, c, 15, rel)
  }
#end

#macro corpo(a1, b1, c1, a2, b2, c2,
             a3, b3, c3, a4, b4, c4)
  union {
    #local raio = 0.5;
    sphere { <0, 0, 0>, raio }
    cylinder { <0, 0, 0>, <0, 0, -1>, raio }
    sphere { <0, 0, -1>, raio }
    object { braco(a1, b1, c1, true)  translate <raio, 0, 0> }
    object { braco(a2, b2, c2, false) translate <raio, 0, 0> scale <-1, 1, 1> }
    object { perna(a3, b3, c3) rotate <0, 0, -30> translate <raio/2, 0, -1> }
    object { perna(a4, b4, c4) rotate <0, 0, -30> translate <raio/2, 0, -1> scale <-1, 1, 1> }
    object { rabo translate <0, -raio, -1> }
    pigment { color rgb <1, 1, 1> }
  }
#end

#declare rabo = sphere {
  <0, 0, 0>, 0.3
  pigment { color rgb <1, 1, 1> }
}

#macro coelho(a1, b1, c1, a2, b2, c2,
              a3, b3, c3, a4, b4, c4,
              cab)
  union {
    object { cabeca scale 0.8 rotate <0, 0, cab> translate <0, 0, 0.5> }
    object { corpo(a1, b1, c1, a2, b2, c2,
                   a3, b3, c3, a4, b4, c4) }
  }
#end

#declare chao = box {
  <-20, -20, 0>, <20, 20, 0>
  pigment {
    image_map { jpeg "grama.jpg" }
    scale <5, 5, 1>
  }
}

#declare NQ = 6;

#declare argA1 = array[NQ]; #declare argA2 = array[NQ];
#declare argA1[0] =   0.0;  #declare argA2[0] =   0.0;
#declare argA1[1] = 180.0;  #declare argA2[1] =   0.0;
#declare argA1[2] =   0.0;  #declare argA2[2] = 180.0;
#declare argA1[3] = 180.0;  #declare argA2[3] = 180.0;
#declare argA1[4] = 180.0;  #declare argA2[4] = 180.0;
#declare argA1[5] =   0.0;  #declare argA2[5] =   0.0;

#declare argA3 = array[NQ]; #declare argA4 = array[NQ];
#declare argA3[0] =   0.0;  #declare argA4[0] =   0.0;
#declare argA3[1] =   0.0;  #declare argA4[1] = 150.0;
#declare argA3[2] = 150.0;  #declare argA4[2] =   0.0;
#declare argA3[3] = 150.0;  #declare argA4[3] = 150.0;
#declare argA3[4] =   0.0;  #declare argA4[4] =   0.0;
#declare argA3[5] =   0.0;  #declare argA4[5] =   0.0;

#declare argB3 = array[NQ]; #declare argB4 = array[NQ];
#declare argB3[0] =    0.0; #declare argB4[0] =    0.0;
#declare argB3[1] =    0.0; #declare argB4[1] = -150.0;
#declare argB3[2] = -150.0; #declare argB4[2] =    0.0;
#declare argB3[3] = -150.0; #declare argB4[3] = -150.0;
#declare argB3[4] =    0.0; #declare argB4[4] =    0.0;
#declare argB3[5] =    0.0; #declare argB4[5] =    0.0;

#declare argZ = array[NQ];
#declare argZ[0] =  0.0;
#declare argZ[1] =  0.0;
#declare argZ[2] =  0.0;
#declare argZ[3] = -1.6;
#declare argZ[4] =  0.0;
#declare argZ[5] =  0.0;

#declare tempo = array[NQ];
#declare tempo[0] = 0.0;
#declare tempo[1] = 0.2;
#declare tempo[2] = 0.4;
#declare tempo[3] = 0.6;
#declare tempo[4] = 0.8;
#declare tempo[5] = 1.0;

#macro interpola(f0, v0, f1, v1, f)
  #local ss = (f-f0+0.0)/(f1-f0);
  #local rr = 1.0-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 boneco_dancando(fase)
  #local bb = quadro_anterior(fase);
  #local a1 = interpola(tempo[bb], argA1[bb], tempo[bb+1], argA1[bb+1], fase);
  #local a2 = interpola(tempo[bb], argA2[bb], tempo[bb+1], argA2[bb+1], fase);
  #local a3 = interpola(tempo[bb], argA3[bb], tempo[bb+1], argA3[bb+1], fase);
  #local a4 = interpola(tempo[bb], argA4[bb], tempo[bb+1], argA4[bb+1], fase);
  #local b3 = interpola(tempo[bb], argB3[bb], tempo[bb+1], argB3[bb+1], fase);
  #local b4 = interpola(tempo[bb], argB4[bb], tempo[bb+1], argB4[bb+1], fase);
  #local zz = interpola(tempo[bb], argZ[bb] , tempo[bb+1],  argZ[bb+1], fase);

  object {
    coelho(a1, 0.0, 0.0, a2, 0.0, 0.0, a3, b3, 0.0, a4, b4, 0.0, 0.0)
    translate <0.0, 0.0, zz>
  }
#end

object { boneco_dancando(clock) scale 0.8 translate <0, 0, 1> }

#include "camlight.inc"
#declare centro_cena = < 0.00, 0.00, 1.00 >;
#declare raio_cena = 6.0;
#declare dir_camera = < 0, 1, 0.5 >;
#declare dist_camera = 140.0;
#declare intens_luz = 1.00;
camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)