// Luciano Ludka Cordeiro - ra992077 
// 6.o laboratório de computação gráfica

//deve-se setar a quantidade de nós disponíveis na rede (nNodes x nNodes)
#declare nNodes=12;

//e aqui deve-se setar a probabilidade de ocorrer aresta
#declare prob=0.58;

// ======================================================================
// CÂMERA 

camera {
  location  <(nNodes/2),(nNodes/2), 3*(nNodes/2)>  // Posição do observador.
  right     -0.75*x                // Largura RELATIVA da imagem.
  up        1.00*y                 // Altura RELATIVA da imagem.      
  sky       z                      // Qual direção é "para cima"?
  look_at   <(nNodes/2),(nNodes/2), 00.00 >  // Para onde a câmera está apontando.
} 
// Nota: os parâmetros "right" e "up" devem ter a mesma proporção
// que os parâmetros ${WIDTH} e ${HEIGHT} no Makefile.

// ======================================================================
// FONTES DE LUZ

light_source {
  <(nNodes/2),(nNodes/2), 3*(nNodes/2)>           // Posição da lâmpada.
  color rgb 1.3 * < 1.00, 1.00, 1.00 >   // Intensidade e corda luz.
} 



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

background{ color rgb < 0.10, 0.40, 0.80 > }

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

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

#declare vermelho = 
  texture {
    pigment { color rgb < 1.00, 0.00, 0.00 > }
  }
#declare verde = 
  texture {
    pigment { color rgb < 0.00, 1.00, 0.00 > }
  }
#declare azul = 
  texture {
    pigment { color rgb < 0.00, 0.00, 1.00 > }
  }
#declare amarelo = 
  texture {
    pigment { color rgb < 1.00, 1.00, 0.00 > }
  }
#declare branco = 
  texture {
    pigment { color rgb < 1.00, 1.00, 1.00 > }
  }
  
#declare cor_espelho = < 0.7, 0.7, 0.7 >;
#declare tx_espelho =
  texture{
    pigment{ rgb cor_espelho }
    finish{
      ambient 0.05 diffuse 0.05
      reflection cor_espelho
      specular 0.02 roughness 0.05
    }
  }

#declare bola =
  sphere {
    < 0.00, 0.00, 0.00 >, 0.20 
    texture {vermelho}
  }

#declare nodes_aux =
   union{
      #declare j=0;
      #while(j < nNodes)
         object{bola translate <j, 0, 0>}
         #declare j=j+1;
      #end
}
#declare nodes =
   union{
      #declare j=0;
      #while(j < nNodes)
         object{nodes_aux translate <0, j, 0>}
         #declare j=j+1;
      #end
}

#declare fonte = seed(75136982);
#declare linha_v =
  cylinder {
    < 0.00, 0.00, 0.00 >,
    < 0.00, 1.00, 0.00 >,
    0.10
    texture { tinta_B }
  }

#declare linhas_v = 
union{
   #declare i=0;
   #while(i<nNodes)
       #declare j = 0;
       #while(j<(nNodes-1))
          #if(rand(fonte)<prob)  
             object{linha_v translate <i,j,0>}
          #end
          #declare j=j+1;
       #end
       #declare i=i+1;
   #end
}

#declare linha_h =
   object{linha_v rotate<0,0,270>}

//esta parte do código precisou realmente ser reescrita, pois uma 
//repetição não geraria uma nova cadeia de elementos
#declare linhas_h = 
union{
   #declare i=0;
   #while(i<(nNodes-1))
       #declare j = 0;
       #while(j<nNodes)
          #if(rand(fonte)<prob)  
             object{linha_h translate <i,j,0>}
          #end
          #declare j=j+1;
       #end
       #declare i=i+1;
   #end
}
  
// Aqui está a cena, finalmente:
union{
 object{ nodes }
 object{bola}
 object{linhas_v}
 object{linhas_h}
}