#include "retalho.inc"
// ======================================================================
// CORES E TEXTURAS

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

#declare tx_tronco = 
  texture{
    pigment{ color rgb < 0.85, 0.50, 0.30 > }
    finish{ diffuse 0.9 ambient 0.1 }
  }

#declare tx_certo = 
  texture{
    pigment{ color rgb < 0.15, 0.40, 0.15 > }
    finish{ diffuse 0.9 ambient 0.8 }
  }

#declare tx_erro =
  texture{
    pigment{ color rgb < 0.60, 0.1, 0.1 >}
    finish{ diffuse 0.9 ambient 0.1 }
    scale 2.0
  }


//===============================================
// Declaracoes 

#declare raio = 0.1;
#declare rad = 0.1;

#declare ponto = 
  sphere {
    <0,0,0>,raio
    texture{tx_tronco}
  }


//Macro interpola========================================================

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


#macro interpola4 (t0, v0, v1, v2, v3, t3, tt)
  
  #local v01 = interpola(t0, v0, t3, v1, tt);
  #local v12 = interpola(t0, v1, t3, v2, tt);
  #local v23 = interpola(t0, v2, t3, v3, tt);

  #local v012 = interpola (t0, v01, t3, v12, tt);
  #local v123 = interpola (t0, v12, t3, v23, tt);

  #local v0123 = interpola(t0, v012, t3, v123, tt);

  v0123

#end

//Macro Grafico==========================================================

#macro grafico (x0, y0, y1, y2, y3, x3, n)
  
  #local q = 0;
  #local num = (x3-x0)/n;

union{
  #while (q < n)
    #local xx = x0 + (q*num);  
    #local yy = interpola4 (x0, y0, y1, y2, y3, x3, xx);
    object {ponto translate yy}
    #local q = q+1;
  #end
}

#end

//=======================================================================
#macro ponto_medio (v1, v2)

  #local p = (v2 + v1)/2;
  p
#end

//=======================================================================
#macro retalho2 (p11, p12, p13, p14, p21, p22, p23, p24, p31, p32, p33, p34, 
		 q21, q22, q23, q24, q31, q32, q33, q34, q41, q42, q43, q44, rad,tx_erro,tx_certo)

  #local p41 = ponto_medio(p31, q21);
  #local p42 = ponto_medio(p32, q22);
  #local p43 = ponto_medio(p33, q23);
  #local p44 = ponto_medio(p34, q24);
  
union{
  retalho(p11, p12, p13, p14, p21, p22, p23, p24, p31, p32, p33, p34, p41, p42, p43, p44, rad,tx_erro,tx_certo )
  retalho(p41, p42, p43, p44, q21, q22, q23, q24, q31, q32, q33, q34, q41, q42, q43, q44, rad,tx_tronco,tx_certo)
  }

#end   

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


#include "eixos.inc"


// Aqui está a cena, finalmente:

union{
  object { eixos(3.0) }
  

  object{retalho2 (<0,1,-3>, <0, 4, 1>, <0, 8, -2>, <0, 12, 2>, 
		  <4, 1, 2>, <4, 4, 0> , <4, 8, -1>, <4, 12, 2>, 
		  <5, 1, 3>, <6, 4, 2>, <5, 8, -3>, <4, 12, 3>, 
		  <8, 1, -2>, <8, 4, 1>, <8, 8, -1>, <8, 12, 4>,
		  <9, 1, -2>, <9, 4, 1>, <9, 8, -1>, <9, 12, 4>,
		  <10, 1, -2>, <10, 4, 1>, <10, 8, -1>, <10, 12, 4>, rad,tx_erro,tx_certo)}




   //object {grafico (0, 3, 5, -4, 10, 15, 20)}
  union{
  object {grafico (0, ponto_medio(<3, 3, 6>, <4,-5,6>), <4,-5,6>, <-2, 0, 1>, ponto_medio(<-2, 0, 1>, <3, -2, 0>), 5, 1000)}
  object {grafico (5, ponto_medio(<-2, 0, 1>, <3, -2, 0>), <3, -2, 0>, <5, 1, -4>, ponto_medio(<5, 1, -4>, <-4, 1, 4>), 10, 1000)}
  object {grafico (10, ponto_medio(<5, 1, -4>, <-4, 1, 4>), <-4, 1, 4>, <1, 0, 8>, ponto_medio(<1, 0, 8>, <4, 1, 3>), 15, 1000)}
  object {grafico (15, ponto_medio(<1, 0, 8>, <4, 1, 3>), <4, 1, 3>, <3, 3, 6>, ponto_medio(<3, 3, 6>, <4,-5,6>), 20, 1000)}
  translate -3*x}
}
 
#include "camlight.inc"
#declare centro_cena = < 0.00, 2.00, 0.00 >;
#declare raio_cena = 20.0;
#declare dir_camera = < 0.0, 5.0, 10.00 >;
#declare dist_camera = 30.0;
#declare intens_luz = 1.00;
camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)