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

#include "colors.inc"

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

#declare bola =
  sphere {
    <0,0,0>, 0.6
    pigment { color Green }
  }

#declare bastao =
  cylinder {
    <0,0,0>, <0,0,0.5>, 0.25
    pigment { color Red }
  }

#declare pino =
  union{
    object { bola }
    object { bastao translate <0,0,0.4> rotate 180*x}
  }

#declare roleta = seed(417);

#macro bit(valor, def)
  #if(def=1)
    object { pino rotate -90*x}
  #else
    object { pino rotate valor*180*x}
  #end
#end

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

  union {
    #while(i < n)
      #local def = ( rand(roleta) < prob );
      #local vv = mod(r,2);
      #if(vv=0)
          object { bit(f, def) translate <(2*i)-2,0,0> }
          #local f = 0;
      #else
          object { bit(1-f, def) translate <(2*i)-2,0,0> }
      #end
      #local r = int(r/2);
      #local i = i+1;
    #end
  }
#end

#macro moldura(m, n, j, c)
  box {
      <-n, -j,-m>, <n,j,m>
      pigment { color c }
  }
#end

#macro suporte(n)
  cylinder {
    <-n,0,0>, <n,0,0>, 0.25
    pigment { color  Black }
  }
#end

#macro abaco(m, n, valores, prob)
  #local i = 0;

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

    difference {
      object { moldura(m+1.5,n+1.5,1, Black) }
      object { moldura(m+1,n+1,2, Grey) }
    }
  }

#end

#declare vetor = array[3];
#declare vetor[0] = (1-clock)*11+clock*12;
#declare vetor[1] = (1-clock)*1+clock*9;
#declare vetor[2] = (1-clock)*5+clock*15;

#declare teta = 360*clock;
#declare phi = 10;
#declare raio = 15;
object { abaco(3, 4, vetor, 0) }

#include "camlight.inc"
#declare centro_cena = < 0.00, 0.00, 1.00 >;
#declare raio_cena = 2*(1-clock)+clock*20;
#declare dir_camera = <raio*cos(phi),raio*cos(teta)*sin(phi),raio*sin(teta)*sin(phi)>;
#declare dist_camera = 50.0;
#declare intens_luz = 1.00;
camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)