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

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

#declare tx_fosca =
  texture{
    pigment{ color rgb < 1.00, 0.80, 0.10 > }
    finish{ diffuse 0.9 ambient 0.1 }
  }

#declare tx_blue =
  texture{
    pigment{ color rgb < 0.10, 0.80, 1.00 > }
    finish{ diffuse 0.9 ambient 0.1 }
  }

#declare tx_green =
  texture{
    pigment{ color rgb < 0.10, 1.00, 0.20 > }
    finish{ diffuse 0.9 ambient 0.1 }
  }

#declare tx_xadrez =
  texture{
    pigment{ checker color rgb < 0.10, 0.32, 0.60 >, color rgb < 1.00, 0.97, 0.90 > }
    finish{ diffuse 0.9 ambient 0.1 }
    scale 0.22
  }

#include "eixos.inc"
#include "math.inc"

#macro Interpola2(p0, p1, tt)
  ((1-tt)*p0 + tt*p1)
#end

#macro Interpola4(p0, p1, p2, p3, tt)
  #local p01 = Interpola2(p0, p1, tt);
  #local p12 = Interpola2(p1, p2, tt);
  #local p23 = Interpola2(p2, p3, tt);
  #local p012 = Interpola2(p01, p12, tt);
  #local p123 = Interpola2(p12, p23, tt);
  #local p0123 = Interpola2(p012, p123, tt);
  p0123
#end

#macro curva(a, r, n)
  union {
    #declare i = 0;
    #while (i <= n)
      sphere{ Interpola4(a[0], a[1], a[2], a[3], i / n),
              Interpola4(r[0], r[1], r[2], r[3], i / n) }
      #declare i = i+1;
    #end
  }
#end

#declare nq = 2; //numero de quadros-chave
#declare nt = 3; //numero de tentaculos
#declare np = 4; //numero de parametros por tentaculo

#declare d = array[nq+1] {0, 0.5, 1};
#declare q = array[nq+1][nt][np] {

  {
    {<0,0,0>, <1,-2,0>, <2,2,0>, <3,0,0>},
    {<0,0,0>, <1,-2,0>, <2,2,0>, <3,0,0>},
    {<0,0,0>, <1,0,-2>, <2,0,2>, <3,0,0>}
  },

  {
    {<0,0,0>, <1,0,-2>, <2,0,2>, <3,0,0>}
    {<0,0,0>, <1,2,0>, <2,-2,0>, <3,0,0>},
    {<0,0,0>, <1,0,2>, <2,0,-2>, <3,0,0>}
  },

  {
    {<0,0,0>, <1,2,-2>, <2,-2,2>, <3,0,0>}
    {<0,0,0>, <1,2,2>, <2,-2,2>, <3,0,0>},
    {<0,0,0>, <1,1,0>, <2,1,1>, <3,0,0>}
  }
};
#declare r = array[np] {0.1, 0.5, 0.3, 0.01};

#macro extrai_quadro(q, i, qi)
  #local tt = 0;
  #while (tt < nt)
    #local p = 0;
    #while (p < np)
      #declare qi[tt][p] = q[i][tt][p];
      #local p = p+1;
    #end
    #local tt = tt+1;
  #end
#end

#macro extrai_tentaculo(qi, tt, qit)
  #local p = 0;
  #while (p < np)
    #declare qit[p] = qi[tt][p];
    #local p = p+1;
  #end
#end

#declare n_points = 128;
#macro tentaculo(a, r, tx)
  object{ curva(a, r, n_points) texture{ tx } }
#end

#macro polvo_quadro(qi)
  union {
    #local tt = 0;
    #while (tt < nt)
      #local qit = array[np] {<0,0,0>, <1,-2,0>, <2,2,0>, <3,0,0>};
      extrai_tentaculo(qi, tt, qit)
      object{ tentaculo(qit, r, tx_green)
              rotate<0,0,(360/nt)*tt> }
      #local tt = tt+1;
    #end
  }
#end

#macro polvo_animado(tempo)
  #local qtempo = array[nt][np] {
    {<0,0,0>, <0,0,0>, <0,0,0>, <0,0,0>},
    {<0,0,0>, <0,0,0>, <0,0,0>, <0,0,0>},
    {<0,0,0>, <0,0,0>, <0,0,0>, <0,0,0>}
  }

  #local i = 0;
  #while (clock > d[i+1]) //linear search
    #local i = i+1;
  #end
  #local tloc = (tempo-d[i]) / (d[i+1]-d[i]);

  #local tt = 0;
  #while (tt < nt)
    #local p = 0;
    #while (p < np)
      #declare qtempo[tt][p] = Interpola2(q[i][tt][p], q[i+1][tt][p], tloc);
      #local p = p+1;
    #end
    #local tt = tt+1;
  #end

  object{ polvo_quadro(qtempo) }
#end

union{
  object{ eixos(3.00) }
  object{ polvo_animado(clock) }
}

#include "camlight.inc"
#declare centro_cena = < 1.00, -0.80, 1.00 >;
#declare raio_cena = 7;
#declare dir_camera = < 4.00, -1.00, 4.00 >;
#declare dist_camera = 16.0;
#declare intens_luz = 1.00;
camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)