// Trabalho prático 03
// ======================================================================
// CORES E TEXTURAS

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

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

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

#include "eixos.inc"
// ======================================================================
// macro mina
#macro mina(n,m)
  union{
    #declare roleta = seed(3);
    //Objetos só podem ter centro dentro desse cubo de area_criacao^3
    #declare area_criacao = 100;
    #declare tam_max = 10;

    //escolher a posição das camaras e colocar num vetor
    #declare centro = array[n];
    #declare i = 0;
    #while (i < n) //Cria N camaras
      #declare xc = int(rand(roleta)*area_criacao);
      #declare yc = int(rand(roleta)*area_criacao);
      #declare zc = int(rand(roleta)*area_criacao/2);
      #declare centro[i] = <xc,yc,zc>;
      //cria camara com centro[i] 
      #declare w = 1+int(rand(roleta)*tam_max);
      #declare d = 1+int(rand(roleta)*tam_max);
      #declare h = 1+int(rand(roleta)*tam_max);
      object{ camara(centro[i],w,d,h)}
      #declare i = i +1;
    #end
    
    #declare i = 0;
    #while (i < m) //Cria M tuneis
      #declare i1 = int(rand(roleta)*n);
      #declare i2 = int(rand(roleta)*n);
      #while (i2 = i1) //encontra um indice diferente de i1
        #declare i2 = int(rand(roleta)*n);
      #end
      
      #declare c1 = centro[i1];
      #declare c2 = centro[i2];
      object{cylinder{c1,c2, 0.3 texture{ tx_fosca }}}
      #declare i = i +1;
    #end
    
  }
#end

// ======================================================================
// Desenha camara com centro em <centro> largura (w) e profundidade (d), a altura (h)
#macro camara(centro,w,d,h)
  union{
    object{
      box{ 
        <centro.x-(w/2),centro.y-(d/2),centro.z-h/2>, 
        <centro.x+(w/2),centro.y+(d/2),centro.z+h/2>  
        texture{ tx_fosca } 
      }
    }
  }
#end

// Aqui está a cena, finalmente:

union{
  object{mina(30,29)}
  object{ eixos(3.00) translate < 0,0,0 > }
}

// Detalhes de iluminação e camera
#include "camlight.inc"
#declare centro_cena = < 50.00, 50.00, 1.00 >;
#declare raio_cena = 90.0;
#declare dir_camera = < 14.00, 7.00, 4.00 >;
#declare dist_camera = 10*raio_cena;
#declare intens_luz = 1.20;
camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)