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

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

#declare tx_plastico =
  texture{
    pigment{ color rgb < 0.10, 0.80, 1.00 > }
    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 < 0.3, 0.3, 1.00 > }
    finish{ diffuse 0.2 reflection 0.7*< 1.00, 0.85, 0.30 > ambient 0.1 }
  }

#declare tx_vidro =
  texture{
    pigment{ color rgb < 0.85, 0.95, 1.00 > 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 2.0
  }

#include "eixos.inc"
#include "retalho.inc"

#local time = clock;

#declare chao =
  box{ <-20,-20,-1>, <+20,+20,0> }

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

#macro interpola_complicado (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);

  interpola(t0,v012,t3,v123,tt);
#end

#macro grafico(x0, y0, y1, y2, y3, x3, N)
  #local intervaloX = (x3-x0)/N;
  #local X=x0;
  #while(X<=x3)
    #local Y = interpola_complicado(x0, y0, y1, y2, y3, x3, X);
    #local X = X + intervaloX;
    object{sphere {Y 0.1} texture{tx_espelho}}
  #end
#end

#macro grafico_mexe(x0, y0, y1, y2, y3, x3, N)
  #local Y = interpola_complicado(x0, y0, y1, y2, y3, x3, N);
  object{sphere {Y 0.4} texture{tx_espelho}}
#end

#macro grafico4_mexe(x0, y_inicial, y10, y11, y20, y21, y30, y31, y40, y41, y_final, x3, N)

  #local y_inicial1 = (y11+y20)/2;
  #local y_inicial2 = (y21+y30)/2;
  #local y_inicial3 = (y31+y40)/2;

  #if(N<0.25)
    grafico_mexe(x0,y_inicial,y10,y11,y_inicial1,x3/4,N)
  #else
    #if(N<0.5)
      grafico_mexe(x3/4,y_inicial1,y20,y21,y_inicial2,x3/2,N)
    #else
      #if(N<0.75)
        grafico_mexe(x3/2,y_inicial2,y30,y31,y_inicial3,3*x3/4,N)
      #else
        grafico_mexe(3*x3/4,y_inicial3,y40,y41,y_inicial,x3,N)
      #end
    #end
  #end

#end

#macro grafico4(x0, y_inicial, y10, y11, y20, y21, y30, y31, y40, y41, y_final, x3, N)

  #local y_inicial1 = (y11+y20)/2;
  #local y_inicial2 = (y21+y30)/2;
  #local y_inicial3 = (y31+y40)/2;

union{
  grafico(x0,y_inicial,y10,y11,y_inicial1,x3/4,N)
  grafico(x3/4,y_inicial1,y20,y21,y_inicial2,x3/2,N)
  grafico(x3/2,y_inicial2,y30,y31,y_inicial3,3*x3/4,N)
  grafico(3*x3/4,y_inicial3,y40,y41,y_inicial,x3,N)
}

#end

#macro junta_retalho()

  #local p21 = <0,-5,0>;
  #local p22 = <0,-3,3>;
  #local p23 = <0,-1,4>;
  #local p24 = <0,1,-3>;
  #local p31 = <-2,-5,0>;
  #local p32 = <-2,-3,3>;
  #local p33 = <-2,-1,2>;
  #local p34 = <-2,1,5>;

  #local q21 = <2,-5,0>;
  #local q22 = <2,-3,3>;
  #local q23 = <2,-1,4>;
  #local q24 = <2,1,2>;
  #local q31 = <1,-5,0>;
  #local q32 = <1,-3,3>;
  #local q33 = <1,-1,2>;
  #local q34 = <1,1,2>;
  #local q11 = <5,-5,4>;
  #local q12 = <5,-3,3>;
  #local q13 = <5,-1,2>;
  #local q14 = <5,1,1>;

  #local r21 = <-4,-5,0>;
  #local r22 = <-4,-3,3>;
  #local r23 = <-4,-1,4>;
  #local r24 = <-4,1,2>;
  #local r31 = <-3,-5,0>;
  #local r32 = <-3,-3,3>;
  #local r33 = <-3,-1,2>;
  #local r34 = <-3,1,2>;
  #local r11 = <-7,-5,4>;
  #local r12 = <-7,-3,3>;
  #local r13 = <-7,-1,2>;
  #local r14 = <-7,1,1>;

  #local p11 = (p21+q31)/2;
  #local p12 = (p22+q32)/2;
  #local p13 = (p23+q33)/2;
  #local p14 = (p24+q34)/2;

  #local q41 = (p21+q31)/2;
  #local q42 = (p22+q32)/2;
  #local q43 = (p23+q33)/2;
  #local q44 = (p24+q34)/2;

  #local r41 = (p31+r31)/2;
  #local r42 = (p32+r32)/2;
  #local r43 = (p33+r33)/2;
  #local r44 = (p34+r34)/2;

  #local p41 = (p31+r31)/2;
  #local p42 = (p32+r32)/2;
  #local p43 = (p33+r33)/2;
  #local p44 = (p34+r34)/2;

  union{
    retalho(p11, p12, p13, p14, p21, p22, p23, p24, p31, p32, p33, p34, p41, p42, p43, p44, 0.0, tx_espelho, tx_fosca)
    retalho(q11, q12, q13, q14, q21, q22, q23, q24, q31, q32, q33, q34, q41, q42, q43, q44, 0.0, tx_xadrez, tx_plastico)
    retalho(r11, r12, r13, r14, r21, r22, r23, r24, r31, r32, r33, r34, r41, r42, r43, r44, 0.0, tx_xadrez, tx_xadrez)
  }

#end

junta_retalho()
object{grafico4(-4, <-4,-5,0>, <0,-2,0>, <5,0,2>, <0,0,4>, <6,0,4>, <6,-1,5>, <3,-8,2>, <0,-4,2>, <3,0,2>, <0,1,2>, 10, 100)
       translate<0,8,0>}

object{grafico4_mexe(0, <-4,-5,0>, <0,-2,0>, <5,0,2>, <0,0,4>, <6,0,4>, <6,-1,5>, <3,-8,2>, <0,-4,2>, <3,0,2>, <0,1,2>, 1, clock)
       translate<0,8,0>}

object{ eixos(3.00) }

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