// Last edited on 2005-01-05 22:57:54 by stolfi
// Processed by remove-cam-lights

#include "colors.inc"

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

#declare raio = 2.000;

#declare tinta_cinza =
  texture {
    pigment { color rgb < 0.85, 0.85, 0.85 > }
    finish { diffuse 0.8 specular 0.2 roughness 0.05 ambient 0.1 }
  }

#declare Glass =
  texture {
    pigment { White filter 1 }
    finish {
 diffuse 0.25
 specular 0.2
 roughness 0.001
 ambient 0.1
 reflection 0.25
 }
  }

#declare DarkGlass =
  texture {
    pigment { White filter 0.5 }
    finish {
 diffuse 0.25
 specular 0.2
 roughness 0.001
 ambient 0.1
 reflection 0.25
 }
  }
#declare ferro =
  texture {
    pigment { color rgbf < 0.40, 0.40, 0.40, 0.1 > }
    finish { diffuse 0.8 specular 0.2 roughness 0.005 ambient 0.1 }
  }

#declare madeira =
  texture {
    pigment { color Brown }
    finish { diffuse 0.25 specular 0.5 roughness 0.005 ambient 0.1 }
  }

#declare curva_trilho_int =
difference {
 torus {
  5, 0.1
  rotate x*-90
  texture{ ferro }
 }
 box {
  <-6,-6,-6>,
  <0,6,6>
  texture{ ferro }
 }
}

#declare trilho_int =
union {
 object {
  curva_trilho_int
  translate 5*x
 }
 object {
  curva_trilho_int
  rotate 180*z
  translate -5*x
 }
 cylinder {
 <-5, 5, 0>,
 < 5, 5, 0>,
 0.1
 open
 texture { ferro }
 }
 cylinder {
 <-5, -5, 0>,
 < 5, -5, 0>,
 0.1
 open
 texture { ferro }
 }
}

#declare curva_trilho_ext =
difference {
 torus {
  6, 0.1
  rotate x*-90
  texture{ ferro }
 }
 box {
  <-7,-7,-7>,
  < 0, 7, 7>
  texture{ ferro }
 }
}

#declare trilho_ext =
union {
 object {
  curva_trilho_ext
  translate 5*x
 }
 object {
  curva_trilho_ext
  rotate 180*z
  translate -5*x
 }
 cylinder {
 <-5, 6, 0>,
 < 5, 6, 0>,
 0.1
 open
 texture { ferro }
 }
 cylinder {
 <-5, -6, 0>,
 < 5, -6, 0>,
 0.1
 open
 texture { ferro }
 }
}

#declare placa_madeira =
box {
  <-0.15, -6, -0.03>,
  < 0.15, -5,  0.03>
 texture { madeira }
}

#declare placas =
union {
  #declare j=-5;
  #while (j <= 5)
 object { placa_madeira
  translate j*x
  }
 object { placa_madeira
  translate j*x
  translate 11*y
  }
    #declare j = j + 1;
  #end
  #declare j=0;
  #while (j <= 180)
 object { placa_madeira
  rotate j*z
  translate 5*x
  }
 object { placa_madeira
  rotate -j*z
  translate -5*x
  }
    #declare j = j + 18;
  #end
}

#declare trilho =
union {
 object { trilho_int }
 object { trilho_ext }
 object { placas }
}

#declare roda =
union {
 torus {
  0.3, 0.08
  texture{ ferro }
 }
 #declare i = 0;
 #while (i<360)
  cylinder {
   <-0.3, 0, 0>,
   < 0.3, 0, 0>,
   0.04
   texture { madeira }
   rotate i*y
  }
 #declare i = i + 45;
 #end
}

#declare gerador = seed(696969);

#declare vagao1 =
union {
 box {
  <-0.5, 0.15, 0>,
  <2.2, 1.15, 1>
   texture {
     pigment { color rgb <rand(gerador), rand(gerador), rand(gerador)> }
     finish { diffuse 0.8 specular 0.2 roughness 0.005 ambient 0.1 }
  }
 }
 #declare i = 0;
 #while (i<2.2)
  object { roda
    translate i*x
  }
  object { roda
    translate i*x
    translate 1.5*y
  }
 #declare i = i+0.8;
 #end
}

#declare barra =
  cylinder {
 <-0.5, 0.65, 0.2>,
 <-2.5, 0.65, 0.2>,
 0.1
 texture { ferro }
  }

#declare vagao2 =
union {
 box {
  <-0.5, 0.15, 0>,
  <2.2, 1.15, 1>
   texture {
     pigment { color rgb <rand(gerador), rand(gerador), rand(gerador)> }
     finish { diffuse 0.8 specular 0.2 roughness 0.005 ambient 0.1 }
  }
 }
 #declare i = 0;
 #while (i<2.2)
  object { roda
    translate i*x
  }
  object { roda
    translate i*x
    translate 1.5*y
  }
 #declare i = i+0.8;
 #end
}

#declare locomotiva =
union {
 box {
  <-0.5, 0.15, 0>,
  <1.1, 1.15, 1>
   texture {
     pigment { color rgb <rand(gerador), rand(gerador), rand(gerador)> }
     finish { diffuse 0.8 specular 0.2 roughness 0.005 ambient 0.1 }
  }
 }

 difference {
  cylinder {
 <1.0, 0.65, 0>,
 <2.1, 0.65, 0>,
 0.5
        texture {
          pigment { color rgb <rand(gerador), rand(gerador), rand(gerador)> }
          finish { diffuse 0.8 specular 0.2 roughness 0.005 ambient 0.1 }
        }
  }
  box {
 <1, 0, 0>,
 <2, 2, -2>
  }
 }

 cylinder {
   <1.6, 0.65, 0.5>,
   <1.6, 0.65, 1.5>,
   0.15
 }

 #declare i = 0;
 #while (i<1.9)
  object { roda
    translate i*x
  }
  object { roda
    translate i*x
    translate 1.5*y
  }
 #declare i = i+0.8;
 #end
 #if (j>-5)
  cylinder {
 <-0.5, 0.65, 0.2>,
 <-2.5, 0.65, 0.2>,
 0.1
 texture { ferro }
  }
 #end
}

#declare trem =
union {
 object { locomotiva
 translate 0.38*z
 #switch (clock)
 #range (0.0000, 0.2001)
  translate -6*y
  translate 125*clock*clock*x
 #break
 #range (0.2001, 0.3900)
  rotate 10*x
  rotate (clock-0.2)*10*90*z
  translate (clock-0.3)*10*7.8*y
  translate (11 - abs(clock-0.3)*10*3.7)*x
 #break
 #range (0.4000, 0.6001)
  rotate 180*z
  translate 6*y
  translate (0.5 - clock)*10*5*x
 #break
 #range (0.6001, 0.7900)
  rotate (180 + (clock-0.6)*10*90)*z
  translate -(clock-0.7)*10*7.8*y
  translate -(11 - abs(clock-0.7)*10*3.7)*x
 #break
 #range (0.8000, 1.0000)
  translate -6*y
  translate -(clock-1)*(clock-1)*125*x
 #break
 #end
 }

 object {
 vagao1
 translate 0.38*z
 #switch (clock)
 #range (0.0000, 0.2500)
  translate -6*y
  translate (125*clock*clock - 3.0)*x
 #break
 #range (0.2501, 0.4400)
  rotate 10*x
  rotate (clock-0.25)*10*90*z
  translate (clock-0.35)*10*7.8*y
  translate (11 - abs(clock-0.35)*10*3.7)*x
 #break
 #range (0.4401, 0.6500)
  rotate 180*z
  translate 6*y
  translate ((0.55 - clock)*10*5 + 0.5)*x
 #break
 #range (0.6501, 0.8400)
  rotate (180 + (clock-0.65)*10*90)*z
  translate -(clock-0.75)*10*7.8*y
  translate -(11 - abs(clock-0.75)*10*3.7)*x
 #break
 #range (0.8401, 1.0000)
  translate -6*y
  translate -((clock-1)*(clock-1)*125 + 3)*x
 #break
 #end
 }

 object {
 barra
 translate 0.38*z
 #switch (clock)
 #range (0.0000, 0.2500)
  translate -6*y
  translate (125*clock*clock - 3.0)*x
 #break
 #range (0.2501, 0.4400)
  rotate 10*x
  rotate (clock-0.25)*10*90*z
  translate (clock-0.35)*10*7.8*y
  translate (11 - abs(clock-0.35)*10*3.7)*x
 #break
 #range (0.4401, 0.6500)
  rotate 180*z
  translate 6*y
  translate ((0.55 - clock)*10*5 + 0.5)*x
 #break
 #range (0.6501, 0.8400)
  rotate (180 + (clock-0.65)*10*90)*z
  translate -(clock-0.75)*10*7.8*y
  translate -(11 - abs(clock-0.75)*10*3.7)*x
 #break
 #range (0.8401, 0.8900)
  translate 3*x
  rotate (180 + (clock-0.7)*10*90)*z
  translate -(clock-0.8)*10*7.8*y
  translate -(11 - abs(clock-0.8)*10*3.7)*x
 #break
 #range (0.8901, 1.0000)
  translate -6*y
  translate -((clock-1)*(clock-1)*125 + 3)*x
 #break
 #end
 }

 object {
 vagao2
 translate 0.38*z
 #switch (clock)
 #range (0.0000, 0.3001)
  translate -6*y
  translate (125*clock*clock - 3 - 3)*x
 #break
 #range (0.3001, 0.4900)
  rotate 10*x
  rotate (clock-0.3)*10*90*z
  translate (clock-0.4)*10*7.8*y
  translate (11 - abs(clock-0.4)*10*3.7)*x
 #break
 #range (0.4901, 0.7000)
  rotate 180*z
  translate 6*y
  translate ((0.6 - clock)*10*5 + 1.0 )*x
 #break
 #range (0.7001, 0.8900)
  rotate (180 + (clock-0.7)*10*90)*z
  translate -(clock-0.8)*10*7.8*y
  translate -(11 - abs(clock-0.8)*10*3.7)*x
 #break
 #range (0.8901, 1.0000)
  translate -6*y
  translate -((clock-1)*(clock-1)*125 + 3 + 3)*x
 #break
 #end
 }
}

union {
 object{ trilho }
 object{ trem }
}

#include "camlight.inc"
camlight(<0,0,5>,<4,-25,7>,1.00,z,1.0)