// Last edited on 2013-12-11 11:26:17 by stolfilocal
// Processed by remove-cam-lights

background{ color rgb < 0.08, 0.03, 0.02 > }

#declare tx_polvo = texture {
  pigment {
    color rgb < 0.35, 0.20, 0.12 >
  }
  finish {
    diffuse 0.8 ambient 0.1 specular 0.0 roughness 0.05
  }
}

#declare tx_olho = texture {
  pigment {
    color rgb < 0.00, 0.00, 0.00 >
  }
  finish {
    diffuse 0.8 ambient 0.1 specular 0.0 roughness 0.05
  }
}

#declare num_bolas = 40;

#declare nq = 6;
#declare nt = 8;
#declare np = 5;
#declare d = array[nq+1];
#declare q = array[nq+1][nt][np*2];

#macro preencher_q()
  #local i = 0;
  #local aleatorio = seed(278346);
  #local total = 0;
  #while (i < nq - 1)
    #declare total = total + 1 + rand(aleatorio);
    #declare d[i] = total;
    #local j = 0;
    #while (j < nt)
      #declare q[i][j][0] = < 0, 1, rand(aleatorio) * 2 - 1 >;
      #declare q[i][j][1] = < 0, 1 + rand(aleatorio) * 2, 0 >;
      #declare q[i][j][2] = < 0, 1, rand(aleatorio) * 2 - 1 >;
      #declare q[i][j][3] = < 0, 5, - rand(aleatorio) >;
      #declare q[i][j][4] = < 0, 1, rand(aleatorio) * 2 - 1 >;
      #local j = j + 1;
    #end
    #local i = i + 1;
  #end
  #declare d[nq-1] = 1;
  #local j = 0;
  #while (j < nt)
    #declare q[nq-1][j][0] = q[0][j][0];
    #declare q[nq-1][j][1] = q[0][j][1];
    #declare q[nq-1][j][2] = q[0][j][2];
    #declare q[nq-1][j][3] = q[0][j][3];
    #declare q[nq-1][j][4] = q[0][j][4];
    #local j = j + 1;
  #end
  #local i = nq - 2;
  #while (i >= 0)
    #declare d[i] = (d[i] - d[0]) / (total);
    #if (i > 0)
      #local j = 0;
      #while (j < nt)
        #declare q[i][j][5] = (q[i+1][j][0] - q[i-1][j][0]) / 2;
        #declare q[i][j][6] = (q[i+1][j][1] - q[i-1][j][1]) / 2;
        #declare q[i][j][7] = (q[i+1][j][2] - q[i-1][j][2]) / 2;
        #declare q[i][j][8] = (q[i+1][j][3] - q[i-1][j][3]) / 2;
        #declare q[i][j][9] = (q[i+1][j][4] - q[i-1][j][4]) / 2;
        #local j = j + 1;
      #end
    #end
    #local i = i - 1;
  #end
  #local j = 0;
  #while (j < nt)
    #declare q[0][j][5] = (q[1][j][0] - q[nq-2][j][0]) / 4;
    #declare q[0][j][6] = (q[1][j][1] - q[nq-2][j][1]) / 4;
    #declare q[0][j][7] = (q[1][j][2] - q[nq-2][j][2]) / 4;
    #declare q[0][j][8] = (q[1][j][3] - q[nq-2][j][3]) / 4;
    #declare q[0][j][9] = (q[1][j][4] - q[nq-2][j][4]) / 4;
    #declare q[nq-1][j][5] = q[0][j][5];
    #declare q[nq-1][j][6] = q[0][j][5];
    #declare q[nq-1][j][7] = q[0][j][5];
    #declare q[nq-1][j][8] = q[0][j][5];
    #declare q[nq-1][j][9] = q[0][j][5];
    #local j = j + 1;
  #end
#end
preencher_q()

#declare bola = sphere {
  < 0, 0, 0 >
  1
  texture { tx_polvo }
}

#declare olho = sphere {
  < 0, 0, 0 >
  1
  texture { tx_olho }
}

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

#macro bezier(p0, dp0, p3, dp3, tt)
  #local p01=interpolar(p0, p0+dp0, tt);
  #local p12=interpolar(p0+dp0, p3-dp3, tt);
  #local p23=interpolar(p3-dp3, p3, tt);
  #local p012=interpolar(p01, p12, tt);
  #local p123=interpolar(p12, p23, tt);
  interpolar(p012, p123, tt)
#end

#macro tentaculo(base, d_base, meio, d_meio, ponta, d_ponta, raio_base, raio_ponta)
  union {
    #local tt=0;
    #while (tt<=1)
      object {
        bola scale bezier(raio_base, 0, raio_ponta, 0, tt/2) translate bezier(base, d_base, meio, d_meio, tt)
      }
      #local tt=tt+1/(num_bolas-1);
    #end
    #local tt=0;
    #while (tt<=1)
      object {
        bola scale bezier(raio_base, 0, raio_ponta, 0, 0.5+tt/2) translate bezier(meio, d_meio, ponta, d_ponta, tt)
      }
      #local tt=tt+1/(num_bolas-1);
    #end
  }
#end

#macro tentaculo_vetor(j, raio_base, raio_ponta)
  #local i = 1;
  #while (clock > d[i])
    #local i = i + 1;
  #end
  #local tempo = (clock - d[i-1]) / (d[i] - d[i-1]);
  tentaculo(< 0, 0, 0 >,
            bezier(q[i-1][j][0], q[i-1][j][5], q[i][j][0], q[i][j][5], tempo),
            bezier(q[i-1][j][1], q[i-1][j][6], q[i][j][1], q[i][j][6], tempo),
            bezier(q[i-1][j][2], q[i-1][j][7], q[i][j][2], q[i][j][7], tempo),
            bezier(q[i-1][j][3], q[i-1][j][8], q[i][j][3], q[i][j][8], tempo),
            bezier(q[i-1][j][4], q[i-1][j][9], q[i][j][4], q[i][j][9], tempo),
            raio_base,
            raio_ponta)
#end

#macro polvo()
  union {
    object {
      tentaculo(< 0, 0, 0 >,
                < 0, 0, 0.1 >,
                < 0, 0, 0.2 >,
                < 0, 0, 0.5 >,
                < 0, 0, 1.2 >,
                < 0, 0, 0.1 >,
                5/nt,
                7/nt)
    }
    #local i = 1;
    #while (i <= nt)
      object {
        tentaculo_vetor(i-1,
                        pi/(nt),
                        pi/(2*nt)) translate < 0, 0.8, 0 > rotate < 0, 0, i * 360 / nt >
      }
      #local i = i + 1;
    #end
    object {
      olho scale < 0.1, 0.1, 0.1 > translate < -3/nt, -5.3/nt, 0.7 >
    }
    object {
      olho scale < 0.1, 0.1, 0.1 > translate < 3/nt, -5.3/nt, 0.7 >
    }
  }
#end

#declare pos_polvo = < 0, 0, 0 >;

union{
  object {
    polvo() translate pos_polvo
  }
}

#include "camlight.inc"
#declare centro_cena = pos_polvo;
#declare raio_cena = 8;
#declare dir_camera = < 0.2, -1, 0.3 >;
#declare dist_camera = 100.0;
#declare intens_luz = 1.00;
camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)