// Exemplo de arquivo de descricao de cena para POV-ray
// Last edited on 2010-03-04 15:44:01 by stolfi

// ======================================================================
// CORES E TEXTURAS

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

#declare tx_plastico = 
  texture{
    pigment{ color rgb < 0.90, 0.90, 0.90 > }
    finish{ diffuse 0.8 ambient 0.4 specular 0.5 roughness 0.005 }
  }

#declare tx_casca = 
  texture{
    pigment{ color rgb < 0, 0.7, 0.00 > }
    finish{ diffuse 0.5 ambient 0.3 specular 0.1 roughness 0.005 }
  }

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

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

#declare tx_fosca_amarela = 
  texture{
    pigment{ color rgb < 1.0, 0.8, 0.1 > }
    finish{ diffuse 0.9 ambient 0.1 }
  }

#declare tx_fosca_dark = 
  texture{
    pigment{ color rgb < 0.2, 0.2, 0.2 > }
    finish{ diffuse 0.9 ambient 0.1 }
  }

#declare tx_espelho = 
  texture{
    pigment{ color rgb < 0.5, 0.5, 0.5 > }
    finish{ diffuse 0.5 reflection 0.7*< 1.0, 1.0, 1.0 > ambient 0.3 }
  }

#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
  }

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

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

#macro interpola2(p0, p1, tt)
  ((1-tt)*p0 + tt*p1)
#end

#macro claw(L, G)
  union {
    box { <-0.5, +0.0, -0.3>, <+0.5, +2.0, +0.3> }
    cylinder { <+0.0, +1.5, +0.0>, <+0.0, +1.5, -1*L>, 0.1 texture { tx_fosca_dark } }
    union {
      cylinder { <+0.0, +0.0, +0.0>, <+0.0, +0.0, -0.2>, 0.3 }
      #local i = 0;
      #while (i < 360)
        union {
          box { <-0.1, +0.0, +0.0>, <+0.1, +1.0, -0.2> }
          box { <-0.1, +0.8, +0.0>, <+0.1, +1.0, -1.0> }
          rotate -45*G*x translate 0.3*y rotate i*z
        }
      #local i = i + 360/3;
      #end
      translate <+0.0, +1.5, -1*L>
	  texture { tx_fosca_amarela }
    }
  }
#end

#macro arm(A, L, G)
  union {
    box { <-0.5, +0.0, -0.3>, 
      <+0.5, +10.0, +0.3> 
      rotate <A, 0, 0>

    }
    union { 
      cylinder { -0.6*x, +0.6*x, 0.4 texture { tx_fosca_amarela } }
      claw(L, G) 
      translate vrotate(<0, +10, 0>, <A, 0, 0>) 
    }
  }
#end

#macro crane(R, B, A, L, G)
  union {
    box { <-1, -1, -0.5>, 
      <+1, +1, 0> 
  	  texture { tx_fosca_amarela }
    }
    cylinder { 
      -0.6*x, +0.6*x, 0.4 
      texture { tx_fosca_amarela } 
    }
    box { <-0.5, +0.0, -0.3>, 
      <+0.5, +10.0, +0.3> 
      rotate <B, 0, 0>
    }
    union { 
      cylinder { -0.6*x, +0.6*x, 0.4 texture { tx_fosca_amarela } }
      arm(A, L, G) 
      translate vrotate(<0, +10, 0>, <B, 0, 0>) 
    }
  rotate R*z
  translate +0.5*z
	texture {tx_fosca_prata}
  }
#end

#macro params2pos(R, B, A, L, G)
  vrotate(<+0.0, +1.5, +0.5-1*L-(sqrt(2)/2.0)> + vrotate(<0, +10, 0>, <A, 0, 0>) + vrotate(<0, +10, 0>, <B, 0, 0>), R*z)
#end

#macro ball_pos(A, B, tt)
  #local s0 = A;
  #local s1 = s0+0.7*(B-s0);
  #local s2 = s1+0.3*(B-s0);

  #if (tt < 0.5)
    #local X = 2*tt;
    < interpola2(s0.x, s1.x, X), 
      interpola2(s0.y, s1.y, X),
      -20*X*(X-1.0)+0.5>
  #else
    #local X = 2*tt-1;
    < interpola2(s1.x, s2.x, X), 
      interpola2(s1.y, s2.y, X),
      -10*X*(X-1.0)+0.5>
  #end
#end

#macro ind(T, tt)
  #local i = 0;
  #while (T[i+1] < tt)
    #local i = i+1;
  #end
  i
#end

#macro frame(tt)
  #local T_t = array[11]{0.0, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, .85, 0.9, 1.0 }
  #local R_t = array[11]{ 90,  90, -10, -10, -10, -10, -90, -90, -90, -90,  90 }
  #local B_t = array[11]{130, 130,  70,  70,  70,  70, 100, 100, 100, 100, 130 }
  #local A_t = array[11]{-30, -30,  10,  10,  10,  10, -10, -10, -10, -10, -30 }
  #local L_t = array[11]{  1,   1,   1,  10,  10,   1,   1,   7,   7,   1,   1 }
  #local G_t = array[11]{  0,   0,   0,   0,   1,   1,   1,   1,   0,   0,   0 }

  #local i = ind(T_t, tt);
  #local F = (tt-T_t[i])/(T_t[i+1]-T_t[i]);

  #local L_t[7] = +0.5+params2pos(R_t[6], B_t[6], A_t[6], L_t[6], 0).z;
  #local L_t[8] = L_t[7];
  #local L_t[3] = +0.5+params2pos(R_t[2], B_t[2], A_t[2], L_t[2], 0).z;
  #local L_t[4] = L_t[3];

  #local R = interpola2(R_t[i], R_t[i+1], F);
  #local B = interpola2(B_t[i], B_t[i+1], F);
  #local A = interpola2(A_t[i], A_t[i+1], F);
  #local L = interpola2(L_t[i], L_t[i+1], F);
  #local G = interpola2(G_t[i], G_t[i+1], F);


  union {
    union {
      #if (i = 0)
        sphere{ ball_pos(params2pos(R_t[7], B_t[7], A_t[7], L_t[7], 0), 
                         params2pos(R_t[3], B_t[3], A_t[3], L_t[3], 0), F), 0.5 }
      #else
        #if ( ( i > 0) & (i < 4) )
          sphere{ params2pos(R_t[3], B_t[3], A_t[3], L_t[3], 0), 0.5 }
        #else
          #if (i < 8)
            sphere{ params2pos(R, B, A, L, 0), 0.5 }
          #else
            sphere{ params2pos(R_t[7], B_t[7], A_t[7], L_t[7], 0), 0.5 }
          #end
        #end
      #end
      texture { tx_espelho }
    }
    object { crane(R, B, A, L, G) texture{tx_fosca} }
  }
#end

union{
  object{ chao  translate < 0,0,0 > texture{ tx_xadrez } }
  
  union {
    frame(clock)
    translate -10*y
  }
}

#include "camlight.inc"
#declare centro_cena = < 0.00, -5.0, 2.00 >;
#declare raio_cena = 20.0;
#declare dir_camera = < 14.00, 7.00, 4.00 >;
#declare dist_camera = 100.0;
#declare intens_luz = 1.00;
camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)
