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

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

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

#declare tx_branco =
 texture{
    pigment{ color rgb < 1, 1, 1 > }
  }

#declare tx_preto =
 texture{
    pigment{ color rgb < 0, 0, 0 > }
  }

#declare tx_azul =
 texture{
    pigment{ color rgb < 0, 0, 1 > }
  }

#declare tx_verde =
  texture{
    pigment{ color rgb < 0.10, 0.62, 0.10 >}
    finish{ diffuse 0.9 ambient 0.5 }
  }

#declare N_Esferas = 50;
#declare altura = 2;

#declare roleta = seed(123);

#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, t1, tt)
  #local v01 = interpola(t0, v0, t1, v1, tt);
  #local v12 = interpola(t0, v1, t1, v2, tt);
  #local v23 = interpola(t0, v2, t1, v3, tt);

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

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

  v0123
#end

#macro grafico (x0, y0, y1, y2, y3, x3, N)
  #if (x0 < x3)
    #local xmin = x0;
    #local xmax = x3;
  #else
    #local xmin = x3;
    #local xmax = x0;
  #end

  #local var = xmin;
  #local intervalo = (xmax-xmin)/N;

  union {
    #while (var < xmax)
      #local yt = interpola4 (xmin, y0, y1, y2, y3, xmax, var);
      object { sphere{ yt, 0.1 } }
      #local var = var + intervalo;
    #end
  }
#end

#macro graficos_create4 ()
  #declare y1a = <rand(roleta)*10,rand(roleta)*10,rand(roleta)*10>;
  #declare y2a = <rand(roleta)*10,rand(roleta)*10,rand(roleta)*10>;

  #declare y1b = <rand(roleta)*10,rand(roleta)*10,rand(roleta)*10>;
  #declare y2b = <rand(roleta)*10,rand(roleta)*10,rand(roleta)*10>;

  #declare y1c = <rand(roleta)*10,rand(roleta)*10,rand(roleta)*10>;
  #declare y2c = <rand(roleta)*10,rand(roleta)*10,rand(roleta)*10>;

  #declare y1d = <rand(roleta)*10,rand(roleta)*10,rand(roleta)*10>;
  #declare y2d = <rand(roleta)*10,rand(roleta)*10,rand(roleta)*10>;

    union {
      object {grafico(0, (y2d+y1a)/2,   y1a, y2a, (y2a+y1b)/2,  1, N_Esferas) texture {tx_azul}}
      object {grafico(1, (y2a+y1b)/2,   y1b, y2b, (y2b+y1c)/2,  2, N_Esferas) texture {tx_branco}}
      object {grafico(2, (y2b+y1c)/2,   y1c, y2c, (y2c+y1d)/2,  3, N_Esferas) texture {tx_preto}}
      object {grafico(3, (y2c+y1d)/2,   y1d, y2d, (y2d+y1a)/2,  4, N_Esferas) texture {tx_verde}}
    }
#end

#macro gera_pontos_curva()
  #declare y1a = <rand(roleta)*10,rand(roleta)*10,rand(roleta)*10>;
  #declare y2a = <rand(roleta)*10,rand(roleta)*10,rand(roleta)*10>;

  #declare y1b = <rand(roleta)*10,rand(roleta)*10,rand(roleta)*10>;
  #declare y2b = <rand(roleta)*10,rand(roleta)*10,rand(roleta)*10>;

  #declare y1c = <rand(roleta)*10,rand(roleta)*10,rand(roleta)*10>;
  #declare y2c = <rand(roleta)*10,rand(roleta)*10,rand(roleta)*10>;

  #declare y1d = <rand(roleta)*10,rand(roleta)*10,rand(roleta)*10>;
  #declare y2d = <rand(roleta)*10,rand(roleta)*10,rand(roleta)*10>;

#end

#macro ponto_grafico (x0, y0, y1, y2, y3, x3, clk)
  #if (x0 < x3)
    #local xmin = x0;
    #local xmax = x3;
  #else
    #local xmin = x3;
    #local xmax = x0;
  #end

  #local var = xmin*(1-clk) + xmax*clk;

  interpola4 (xmin, y0, y1, y2, y3, xmax, var)

#end

#macro planos ()

    #local p11 = <0,0,(rand(roleta)-1)*altura>;
    #local p12 = <1,0,(rand(roleta)-1)*altura>;
    #local p13 = <2,0,(rand(roleta)-1)*altura>;
    #local p14 = <3,0,(rand(roleta)-1)*altura>;

    #local p21 = <0,1,(rand(roleta)-1)*altura>;
    #local p22 = <1,1,(rand(roleta)-1)*altura>;
    #local p23 = <2,1,(rand(roleta)-1)*altura>;
    #local p24 = <3,1,(rand(roleta)-1)*altura>;

    #local p31 = <0,2,(rand(roleta)-1)*altura>;
    #local p32 = <1,2,(rand(roleta)-1)*altura>;
    #local p33 = <2,2,(rand(roleta)-1)*altura>;
    #local p34 = <3,2,(rand(roleta)-1)*altura>;

    #local p11_2 = <0,4,(rand(roleta)-1)*altura>;
    #local p12_2 = <1,4,(rand(roleta)-1)*altura>;
    #local p13_2 = <2,4,(rand(roleta)-1)*altura>;
    #local p14_2 = <3,4,(rand(roleta)-1)*altura>;

    #local p21_2 = <0,5,(rand(roleta)-1)*altura>;
    #local p22_2 = <1,5,(rand(roleta)-1)*altura>;
    #local p23_2 = <2,5,(rand(roleta)-1)*altura>;
    #local p24_2 = <3,5,(rand(roleta)-1)*altura>;

    #local p31_2 = <0,6,(rand(roleta)-1)*altura>;
    #local p32_2 = <1,6,(rand(roleta)-1)*altura>;
    #local p33_2 = <2,6,(rand(roleta)-1)*altura>;
    #local p34_2 = <3,6,(rand(roleta)-1)*altura>;

    #local p1 = (p31+p11_2)/2;
    #local p2 = (p32+p12_2)/2;
    #local p3 = (p33+p13_2)/2;
    #local p4 = (p34+p14_2)/2;

    #local rad = 0.01;

    union {
      object {retalho (p11,p12,p13,p14,p21,p22,p23,p24,p31,p32,p33,p34,p1,p2,p3,p4,rad,tx_branco,tx_verde) }
      object {retalho (p1,p2,p3,p4,p11_2,p12_2,p13_2,p14_2,p21_2,p22_2,p23_2,p24_2,p31_2,p32_2,p33_2,p34_2,
            rad,tx_preto,tx_azul) }
    }
#end

#macro planos_seguem_grafico(clk, dt)

    #local p11 = posicao(clk);
    #local p12 = posicao(clk) + <1,0,0>;
    #local p13 = posicao(clk) + <2,0,0>;
    #local p14 = posicao(clk) + <3,0,0>;

    #local p21 = posicao(clk-dt);
    #local p22 = posicao(clk-dt) + <1,0,0>;
    #local p23 = posicao(clk-dt) + <2,0,0>;
    #local p24 = posicao(clk-dt) + <3,0,0>;

    #local p31 = posicao(clk-2*dt);
    #local p32 = posicao(clk-2*dt) + <1,0,0>;
    #local p33 = posicao(clk-2*dt) + <2,0,0>;
    #local p34 = posicao(clk-2*dt) + <3,0,0>;

    #local p11_2 = posicao(clk-4*dt);
    #local p12_2 = posicao(clk-4*dt) + <1,0,0>;
    #local p13_2 = posicao(clk-4*dt) + <2,0,0>;
    #local p14_2 = posicao(clk-4*dt) + <3,0,0>;

    #local p21_2 = posicao(clk-5*dt);
    #local p22_2 = posicao(clk-5*dt) + <1,0,0>;
    #local p23_2 = posicao(clk-5*dt) + <2,0,0>;
    #local p24_2 = posicao(clk-5*dt) + <3,0,0>;

    #local p31_2 = posicao(clk-6*dt) + <0,0,0>;
    #local p32_2 = posicao(clk-6*dt) + <1,0,0>;
    #local p33_2 = posicao(clk-6*dt) + <2,0,0>;
    #local p34_2 = posicao(clk-6*dt) + <3,0,0>;

    #local p1 = (p31+p11_2)/2;
    #local p2 = (p32+p12_2)/2;
    #local p3 = (p33+p13_2)/2;
    #local p4 = (p34+p14_2)/2;

    #local rad = 0.01;

   union {
      object {retalho (p11,p12,p13,p14,p21,p22,p23,p24,p31,p32,p33,p34,p1,p2,p3,p4,rad,tx_branco,tx_verde) }
      object {retalho (p1,p2,p3,p4,p11_2,p12_2,p13_2,p14_2,p21_2,p22_2,p23_2,p24_2,p31_2,p32_2,p33_2,p34_2,
            rad,tx_preto,tx_azul) }
    }
#end

#macro posicao(tempo)
  #if (tempo < 0)
    #local tempo2 = tempo + 1;
  #else
    #local tempo2 = tempo;
  #end
  #if (tempo2 >= 0 & tempo2 < 0.25)
      ponto_grafico(0, (y2d+y1a)/2,     y1a, y2a, (y2a+y1b)/2,  1, tempo2*4)
  #end
  #if (tempo2 >= 0.25 & tempo2 < 0.5)
      ponto_grafico(1, (y2a+y1b)/2,     y1b, y2b, (y2b+y1c)/2,  2, (tempo2-0.25)*4)
  #end
  #if (tempo2 >= 0.5 & tempo2 < 0.75)
      #local assq = tempo;
      #local assq2 = tempo;
      #local r1 = ponto_grafico(2, (y2b+y1c)/2,         y1c, y2c, (y2c+y1d)/2,  3, (tempo2-0.5)*4);
      r1
  #end
  #if (tempo2 >= 0.75 & tempo2 <= 1)
      ponto_grafico(3, (y2c+y1d)/2,     y1d, y2d, (y2d+y1a)/2,  4, (tempo2-0.75)*4)
  #end
#end

 union {
    object { eixos (5)}

    object {graficos_create4()}
    object { sphere { posicao(clock), 0.3 } }

}

#declare centro_cena = < 2.00, 3.00, 2.00 >;
#declare raio_cena = 10.0;
#declare dir_camera = < 1000.001, 0000.001, 000.00 >;
#declare dist_camera = 160.0;
#declare intens_luz = 1.00;
camlight(centro_cena, raio_cena, dir_camera, dist_camera , y, intens_luz)