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

#declare maximo = 10;
#declare valores_abaco= array[maximo];
#declare valores_abaco[0] = 10.3;
#declare valores_abaco[1] = 0;
#declare valores_abaco[2] = 0;
#declare valores_abaco[3] = 15;
#declare valores_abaco[4] = 10;
#declare valores_abaco[5] = 6;
#declare valores_abaco[6] = 7;
#declare valores_abaco[7] = 8;
#declare valores_abaco[8] = 9;
#declare valores_abaco[9] = 10;

background{ color rgb < 0.00, 0.64, 0.00 > }

#declare tx_plastico =
  texture{
    pigment{ color rgb < 0.40, 0.80, 1.00 > }
    finish{ diffuse 0.8 ambient 0.1 specular 0.5 roughness 0.005 }
  }

#declare tx_metal =
  texture {
    pigment { color rgb <0.5,0.5,0.5  > }
    finish{ diffuse 0.8 ambient 0.1 specular 0.5 roughness 0.005 }
  }

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

#declare tx_espelho =
  texture{
    pigment{ color rgb < 1.00, 0.85, 0.30 > }
    finish{ diffuse 0.2 reflection 0.7*< 1.00, 0.85, 0.30 > ambient 0.1 }
  }

#declare tx_vidro =
  texture{
    pigment{ color rgb < 0, 0, 0 > filter 0.70 }
    finish{ diffuse 0.03 reflection 0.25 ambient 0.02 specular 0.25 roughness 0.005 }
  }

#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.5
  }

#declare roleta = seed(417);

#declare caixa =
  box {
   <-3,3,1>, 10
   texture { tx_plastico }
  }

#declare pe1 =
  box {
   <0,0,0>, 1
   texture { tx_plastico }
   }

#declare pe2 =
  box {
  <0,0,0>, 1
  texture { tx_plastico }
  }

#declare corpo =
  cylinder {
    < 0,0,1>
    <0,0,3>,
    0.4
    texture { tx_metal }
  }

#declare cinto =
  cylinder {
    < 0,0,0>
    <0,0,0.3>,
    0.45
    texture { tx_xadrez }
}

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

#macro caixaBits (m, n, proberro)
  union {
    #local i = 0;
    #while (i<m)                // valor [i] = (1-clock)[valorinicial] + clock*[valorfinal]
      object { fileiraBits(n, (1-clock)*valores_abaco[i]+clock*valores_abaco[i+1], proberro) translate i*2.5*z }
      #local i = i+1;
    #end
  }
#end

#macro fileiraBits (qtidade,decimal, proberro)
    union {
        #local i = qtidade-1;
        #local teste = 1.9;
        #local numero = int(decimal);
        #local fracao = decimal-numero;
        #while (i>=0)
            #local i = i-1;
            #local vv = mod(numero, 2);
            #if (vv=0)
                  #local valor = fracao;
                  #local fracao = 0;
            #else
                  #local valor = 1-fracao;
            #end
            object { criaBit(valor, proberro) translate i*2*x }
            #local numero = int(numero/2);
        #end
    }
#end

#macro criaBit(valor, proberro)
    #local def = (rand(roleta) < proberro);
    #local del = 1.1+valor*1.5;
    #if(def=1)
        union {
          object { corpo scale 0.1 }
        }
    #else
          union {
            object { corpo }
            object { cinto translate <0,0,del> }
          }
    #end
#end

#include "eixos.inc"

union {
  object { chao }
  object { eixos(10.00) }

  object { caixa scale 3*x scale 0.1*y scale 3*z scale 0.5}
  object { pe1 }
  object { pe2 translate 6*x}
  object { caixaBits(
          5,
      8,
         0)
    scale 0.75}
}

#include "camlight.inc"
#declare centro_cena = < 6.00, 0.00, 4.00 >;
#declare raio_cena = 12.0;
#declare dir_camera = <30-(60*clock), -30-(30*clock), 20 >;
#declare dist_camera = 12.0;
#declare intens_luz = 1.00;
camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)