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

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

#declare marrom =
  texture{
    pigment{ color rgb < 1, 0.51, 0.23 > }
    finish{ diffuse 0.9 ambient 0.1 }
  }

#declare verde =
  texture{
    pigment{ color rgb < 0, 1, 0 > }
    finish{ diffuse 0.9 ambient 0.1 }
  }

#declare solo =
  texture{
    pigment{ color rgb < 0, 0.8, 0 > }
    finish{ diffuse 0.9 ambient 0.1 }
  }

#declare cones =
  cone {
    < 0, 0, -0.6 >,
                0.2,
    < 0, 0, 0.6 >,
    0.3
  }

#declare cabeca =
  cone {
    < 0, 0, -0.8 >,
                0.4,
    < 0, 0, 0.8 >,
    0.7
  }

#declare pescoco =
  cone {
    < 0, 0, -0.3 >,
                0.4,
    < 0, 0, 0.3 >,
    0.6
  }

#declare tronco =
  cone {
    < 0, 0, -1.5 >,
                0.55,
    < 0, 0, 1.5 >,
    0.55
  }

#declare bolas =
  sphere {
    < 0, 0, 0 >,
    0.3
  }

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

#declare NQ = 6;

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

#declare aC = array[NQ];
#declare aC[0] = -20;
#declare aC[1] = -20;
#declare aC[2] = -20;
#declare aC[3] = -65;
#declare aC[4] = -65;
#declare aC[5] = -65;

#declare aB = array[NQ];
#declare aB[0] = -120;
#declare aB[1] = -120;
#declare aB[2] = -120;
#declare aB[3] = -40;
#declare aB[4] = -40;
#declare aB[5] = -40;

#declare aA = array[NQ];
#declare aA[0] = 110;
#declare aA[1] = 110;
#declare aA[2] = 110;
#declare aA[3] = 90;
#declare aA[4] = 90;
#declare aA[5] = 90;

#declare aF = array[NQ];
#declare aF[0] = -10;
#declare aF[1] = -50;
#declare aF[2] = -110;
#declare aF[3] = -100;
#declare aF[4] = -100;
#declare aF[5] = -100;

#declare aE = array[NQ];
#declare aE[0] = 0;
#declare aE[1] = 0;
#declare aE[2] = 10;
#declare aE[3] = 25;
#declare aE[4] = 25;
#declare aE[5] = 25;

#declare aD = array[NQ];
#declare aD[0] = 0;
#declare aD[1] = 0;
#declare aD[2] = 0;
#declare aD[3] = 30;
#declare aD[4] = 30;
#declare aD[5] = 30;

#declare aCorpo = array[NQ];
#declare aCorpo[0] = 30;
#declare aCorpo[1] = 30;
#declare aCorpo[2] = 30;
#declare aCorpo[3] = 0;
#declare aCorpo[4] = 0;
#declare aCorpo[5] = 0;

#declare aPos = array[NQ];
#declare aPos[0] = 0;
#declare aPos[1] = 0;
#declare aPos[2] = 0;
#declare aPos[3] = 2;
#declare aPos[4] = 2;
#declare aPos[5] = 2;

#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(local_fase)
 #local i = 0;
 #while (i < NQ - 1)
   #if((fase[i] <= local_fase) & (fase[i+1] >= local_fase))
     #local resp = i;
   #end
        #local i = i + 1;
 #end
 resp
#end

object{ chao  translate < 0,0,-5 > texture{ solo } }

#macro pe()
        union
        {
                object { bolas texture { marrom } }
                object { cones rotate 90 *x translate < 0, 0.8, 0> texture { marrom } }
        }
#end

#macro subperna(A)
        union {
                object{ pe() rotate A *x scale < 0.8, 0.8, 0.8 > translate < 0, 1.6, 0 >}
                object{ pe() }
        }
#end

#macro perna(A, B)
        union {
                object{ subperna(A) rotate B *x scale < 0.8, 0.8, 0.8 > translate < 0, 1.6, 0> }
                object{ pe() }
        }
#end

#macro membros(A1, B1, C1, A2, B2, C2, A3, B3, C3, A4, B4, C4)
        union {
                object { perna(A1, B1) rotate C1 *x translate < 0.8, 0, 1 > }
                object { perna(A2, B2) rotate C2 *x translate < -0.8, 0, 1 > }
                object { perna(A3, B3) rotate C3 *x scale < 0.8, 0.8, 0.8 > translate < 0.8, 3, 0.8 > }
                object { perna(A4, B4) rotate C4 *x scale < 0.8, 0.8, 0.8 > translate <-0.8, 3, 0.8 > }
        }
#end

#macro corpo(A1, B1, C1, A2, B2, C2, A3, B3, C3, A4, B4, C4)
        union{
                object { membros(A1, B1, C1, A2, B2, C2, A3, B3, C3, A4, B4, C4) }
                object { pescoco rotate 175 *x translate < 0, 3.1, 1.6 > texture { marrom } }
                object { cabeca rotate 70 *x translate < 0, 3.6, 2.3 > texture { marrom } }
                object { tronco rotate 88 *x scale < 1.5, 1.5, 1.5 > translate < 0, 1.5, 0.8  > texture { marrom } }
        }
#end

#macro animal(A1, B1, C1, A1, B2, C2, A3, B3, C3, A4, B4, C4, D, E)
        object { corpo(A1, B1, C1, A1, B2, C2, A3, B3, C3, A4, B4, C4) rotate D *x translate < 0, 0, -4.5 + E > }
#end

#macro danca(local_fase)
        union {
                #local i = quadro_anterior(local_fase);

                object {
                        animal(

                                interpola(fase[i], aA[i], fase[i+1], aA[i+1], local_fase),
                                interpola(fase[i], aB[i], fase[i+1], aB[i+1], local_fase),
                                interpola(fase[i], aC[i], fase[i+1], aC[i+1], local_fase),
                                interpola(fase[i], aA[i], fase[i+1], aA[i+1], local_fase),
                                interpola(fase[i], aB[i], fase[i+1], aB[i+1], local_fase),
                                interpola(fase[i], aC[i], fase[i+1], aC[i+1], local_fase),
                                interpola(fase[i], aD[i], fase[i+1], aD[i+1], local_fase),
                                interpola(fase[i], aE[i], fase[i+1], aE[i+1], local_fase),
                                interpola(fase[i], aF[i], fase[i+1], aF[i+1], local_fase),
                                interpola(fase[i], aD[i], fase[i+1], aD[i+1], local_fase),
                                interpola(fase[i], aE[i], fase[i+1], aE[i+1], local_fase),
                                interpola(fase[i], aF[i], fase[i+1], aF[i+1], local_fase),
                                interpola(fase[i], aCorpo[i], fase[i+1], aCorpo[i+1], local_fase),
                                interpola(fase[i], aPos[i], fase[i+1], aPos[i+1], local_fase)
                        )
                }
        }
#end

object { danca(clock) }

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