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

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

#declare tx_bola =
  texture{
    pigment{ color rgb < 0, 0.5, 0 > }
    finish{ diffuse 0.8 ambient 0.4 }
  }

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

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

#declare tx_moldura =
  pigment {
    wood
    turbulence 0.05
    scale <0.2, 0.2, 1>
    color_map {
      [0.1 rgb <0.42, 0.26, 0.15>]
      [0.9 rgb <0.52, 0.37, 0.26>]
    }
  }

#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 1.0
  }

#declare valores = array[10]
#declare valores[0] = (1 - clock)*1+clock*15;
#declare valores[1] = (1 - clock)*7+clock*8;
#declare valores[2] = (1 - clock)*1023+clock*1024;
#declare valores[3] = (1 - clock)*508+clock*512;
#declare valores[4] = (1 - clock)*7+clock*12;
#declare valores[5] = (1 - clock)*62+clock*65;
#declare valores[6] = (1 - clock)*125+clock*128;
#declare valores[7] = (1 - clock)*30+clock*34;
#declare valores[8] = (1 - clock)*4+clock*8;
#declare valores[9] = (1 - clock)*1+clock*2;

#declare roleta = seed(115);

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

#declare moldura_ext=
  box{
    < 0, -13, -21 >,
    < 1, 20, 11>
    texture{ tx_moldura }
  }

#declare moldura_int=
  box{
    < -1, -12, -20 >,
    < 2, 19, 10>
    texture{ tx_moldura }
  }

#macro bit(valor,defeito)

  #if (defeito = 0)

    union{
      sphere{
        < -0.4, -9.5, 8+valor >,
        0.9
        texture{ tx_bola }
      }
      box{
        < 0, -9.1, 7.1 >,
        < 0, -9.9, 9.9 >
        texture{ tx_box }
      }
    }

  #else
    union{
      box{
        < 0, -9.1, 7.1 >,
        < 0, -9.9, 9.9 >
        texture{ tx_boxdefeito }
      }
    }
  #end
#end

#macro fileira(n,valor, prob)
  #local i=0;
  #local bit_atual = valor;
  #local r = int(valor);
  #local f = valor - r;

  #if(f > 0)
    #local round_sup = valor+1;
  #else
    #local round_sup = valor;
  #end

  union{
    #while(i < n)
      #local def = (rand(roleta) < prob);
      #if ( mod(round_sup,2) = 1)

        #if (mod(bit_atual,2) != mod(round_sup,2))

          object{bit(1-f,def) translate <0, i*3, 0>}
        #else
          object{bit(1,def) translate <0, i*3, 0>}
        #end

      #else

        #if (mod(bit_atual,2) != mod(round_sup,2))

          object{bit(f,def) translate <0, i*3, 0>}
        #else
          object{bit(0,def) translate <0, i*3, 0>}
        #end

      #end

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

    #end
  }
#end

#macro abaco(m, n, valores, prob)
  #local i = 0;
  union{
    #while(i < m)

      object{fileira(n,valores[i], prob) translate<0,0,-i*3>}
      #local i = i + 1;
    #end

    difference{
      box{
        < 0, -12, 11 >,
        < 1, -10+3*n, 9-3*m>
        texture{ tx_moldura }
      }

      box{
        < -1, -11, 10 >,
        < 2, -11+3*n, 10-3*m>
        texture{ tx_moldura }
      }
    }

  }

#end

#include "eixos.inc"

union{
  object{ abaco(10,10,valores, 0) }
  object{ chao translate<10, 10, -25> texture{ tx_xadrez }  }

}

#include "camlight.inc"
#declare centro_cena = < 0.00, 7.00, -4.00 >;

#declare raio_cena = (1-clock)*60+clock*30;

#declare dir_camera = < 21.00, (1-clock)*40+clock*0, 0.00 >;

#declare dist_camera = (1-clock)*30+clock*10;

#declare intens_luz = 2.00;
camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)