// Exemplo de arquivo de descricao de cena para POV-ray
// Last edited on 2010-03-04 15:44:01 by stolfi

// ======================================================================
// CORES E TEXTURAS


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


//background{ color rgb < 0.75, 0.80, 0.85 > }
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
  }

// ======================================================================
// DESCRIÇÃO DA CENA 

// Partes da cena:
/*
#declare dinheiro = 
  box { < 0,0,0 >, 0.5
  texture { tx_fosca } }

#declare bola_grande =
  sphere{
    < 0, 1.50, 2.50 >, 0.8
    texture{ tx_xadrez } }*/

#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 = m;
    #while (i>0)
      object { fileiraBits(n, valores_abaco[i], proberro) translate i*2.5*z }
      #local i = i-1;
    #end
  }
#end

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

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

/*
#macro intpol(f0, vo, f1, v1, f)
  #local ss = (f-f0)/(f1-f0);
  #local rr = 1-ss;
  (rr*vo+ss*v1);
#end

#macro quadro_anterior (fase)
    #local i=0;
    #while ((i<NQ-1) & (fg[i+1] < fase))
      #local i = i+1;
    #end
    i
#end
        
#macro boneco (a1,b1,c1,d1,e1,a2,b2,c2,d2,e2, ca)
    union { 
      object { cabeca rotate ca*z }
      object { corpo }
      object { cinto }
      object { mombro(a1,b1) translate <0,0.7,8> }
      object { mombro(a2,b2) translate <0,0.7,8> scale <-1,0,0> }
      object{ mperna(c1,d1,e1) translate <0.4,0,5>}
      object{ mperna(c2,d2,e2) translate <0.4,0,5> scale <-1,0,0>}
    }
#end*/


#include "eixos.inc"


// #macro boneco_dancando (delT)
//     #local i = quadro_anterior(delT);
//     #local be = intpol(fg[i], arg_be[i], fg[i+1], arg_be[i+1], delT);
//     #local bd = intpol(fg[i], arg_bd[i], fg[i+1], arg_bd[i+1], delT);
//     #local pe = intpol(fg[i], arg_pe[i], fg[i+1], arg_pe[i+1], delT);
//     #local pd = intpol(fg[i], arg_pd[i], fg[i+1], arg_pd[i+1], delT);
//     #local ca = intpol(fg[i], arg_ca[i], fg[i+1], arg_ca[i+1], delT);
//     object { boneco
// 	  (
//       /* braco esquerdo */	-30+be,
//       /* pulso esquerdo */	-60,
//       /* perna esquerdo */	0-pe,
//       /* canela esquerdo */	0,
//       /* pe esquerdo */		0,
//       /* braco direito */	-30+bd,
//       /* pulso direito */	-60,
//       /* perna direito */	0-pd,
//       /* canela direito */	0,
//       /* pe direito */		0,
//       /* cabeca */		90+ca
// 	   )
//       }
// #end

union {
  object { chao }
  object { eixos(10.00) }
  //object { boneco_dancando(clock) }
  object { caixa scale 3*x scale 0.1*y scale 3*z scale 0.4}
  object { pe1 } 
  object { pe2 translate 6*x}
  object { caixaBits(4,5,0.4) scale 0.6}
}

#include "camlight.inc"
#declare centro_cena = < 0.00, 0.00, 1.00 >;
#declare raio_cena = 18.0;
#declare dir_camera = <0, -100, 50 >;
#declare dist_camera = 16.0;
#declare intens_luz = 1.00;
camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)