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

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

#declare tx_tronco =
  texture{
    pigment{ color rgb < 0.85, 0.50, 0.30 > }
    finish{ diffuse 0.9 ambient 0.1 }
  }

#declare tx_certo =
  texture{
    pigment{ color rgb < 0.15, 0.40, 0.15 > }
    finish{ diffuse 0.9 ambient 0.8 }
  }

#declare tx_erro =
  texture{
    pigment{ color rgb < 0.60, 0.1, 0.1 >}
    finish{ diffuse 0.9 ambient 0.1 }
    scale 2.0
  }

#declare bits = 7;
#declare linhas = 5;
#declare valores = array[linhas];
#declare valores[0] = (1-clock)*13 + clock*19;
#declare valores[1] = (1-clock)*7 + clock*21;
#declare valores[2] = (1-clock)*2 + clock*5;
#declare valores[3] = (1-clock)*7 + clock*11;
#declare valores[4] = (1-clock)*1 + clock*3;

#declare semente = seed(19652472);
#declare raio_bol = 4;
#declare prob_erro = 0.2;

#macro bolinha(raio)
  sphere {
    <0, 0, 0>,
    raio
  }
#end

#macro cilindro(tamanho, raio)
  cylinder {
    <0, 0, 0>,
    <0, 0, tamanho>,
    raio
  }
#end

#macro bit(b, d) //posicao é um valor entre 0 e 1, sendo que a logica se inverte para com defeito
union {
  object { cilindro(22, 1) texture { tx_tronco } }

  #if (b*22 > 11.0)
      #local pos = b*22 - raio_bol;
  #else
      #local pos = b*22 + raio_bol;
  #end

  #if(d = 0)
    object { bolinha(raio_bol) translate <0,0, pos> texture { tx_certo } }
  #else
    object { bolinha(raio_bol) translate <0,0,pos>  texture { tx_erro } }
  #end
  translate <0, 0, -10>
  rotate <0, d * 180, 0>
}
#end

#macro fileira(bits, numero, prob)
union {
  object {
    box {
      <0, 0, 0>
      <2, 10 * bits, 2>
      texture { tx_tronco }
    }
    translate <0, 0, -12>
  }

  #local r = int(numero);
  #local f = numero - r;

  #local i = 0;

  #while (i < bits)

    #local s = rand(semente);
    #if (s < prob)
      #local d = 1;
    #else
      #local d = 0;
    #end

    #local vv = mod(r,2);

    #if (vv = 0)
      #local b = f;
      #local f = 0;
    #else
      #local b = 1-f;
    #end

    object { bit(b, d) translate <0, (i * 10) + 4, 0> }

    #local r = int(r/2);
    #local i = i + 1;

  #end
}
#end

#macro abaco(linhas, bits, valores, prob)
union {
  difference {
    object {
      box {
        <2, -2, -15>
        <-2, bits * 10 + 2, ((linhas - 1) * 22) + 13>
      }
    }
    object {
      box {
        <2.1, 0, -13>
        <-2.1, bits * 10, ((linhas - 1) * 22) + 11>
      }
    }
    texture { tx_tronco }
  }

  #local i = 0;

  #while (i < linhas)
    object { fileira(bits, valores[i], prob) translate <0, 0, i * 22> }
    #local i = i + 1;
  #end

}
#end

#include "eixos.inc"

union{
  object { eixos(3.0) }
  object { abaco(linhas, bits, valores, prob_erro) }
  }

#include "camlight.inc"
#declare centro_cena = < 0.00, 90.00, 60.00 >;
#declare raio_cena = 110.00;
#declare dir_camera = < (1-clock)*100.00 + (clock*(1800)), 200.00, 80.00 >;
#declare dist_camera = 130.00;
#declare intens_luz = 1.00;
camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)