// MC930 - Laboratorio 7
// Douglas Gardim  RA: 008506 
//

// ======================================================================
// CÂMERA 

camera {
  location  < 110.00, 60.00, 200.00 >  // Posição do observador.
  //location  < 0.00, 160.00, 0.00 >  // Posição do observador.
  right     -1.00*x                 // Largura RELATIVA da imagem.
  up        0.50*y                 // Altura RELATIVA da imagem.      
  sky       y                      // Qual direção é "para cima"?
  look_at   <  0.00, 30.00, 0.00 >  // Para onde a câmera está apontando.
  angle 40
} 
// Nota: os parâmetros "right" e "up" devem ter a mesma proporção
// que os parâmetros ${WIDTH} e ${HEIGHT} no Makefile.

// ======================================================================
// FONTES DE LUZ

light_source {
  10 * < +15.0, +5.0, +5.0 >              // Posição da lâmpada.
  color rgb 1.2 * < 1.00, 1.00, 1.00 >   // Intensidade e corda luz.
} 

light_source {
  10 * < +50.0, +30.0, +50.0 >              // Posição da lâmpada.
  color rgb 1.2 * < 1.00, 1.00, 1.00 >   // Intensidade e corda luz.
} 

light_source {
  10 * < +50.0, -10.0, +10.0 >             // Posição da lâmpada.
  color rgb 0.8 * < 1.00, 1.00, 1.00 >   // Intensidade e corda luz.
} 

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

background{ color rgb < 0.25, 0.20, 0.85 > }

#declare textura1 = 
  texture {
    pigment {color rgb <0.5,0.5,0.5>}
    finish { 
      ambient 0.2 diffuse 0.8
      reflection 0.1
      specular 0.90 roughness 0.005
    }
  }

#declare textura2 = 
  texture {
    pigment {color rgb <0.8,0.5,0.5>}
    finish { 
      ambient 0.2 diffuse 0.8
      reflection 0.1
      specular 0.90 roughness 0.005
    }
  }

#declare textura3 = 
  texture {
    pigment {color rgb <0.8,0.5,0.5>}
    finish { 
      ambient 0.2 diffuse 0.8
      reflection 0.1
      specular 0.90 roughness 0.005
    }
  }

#declare raioArtic = 3;
#declare segBracoSize = 20;
#declare baseH = 5;

#declare T0 = 0;
#declare T1 = 0.3;
#declare T2 = 0.6;
#declare T3 = 1;

#declare a50 = 65;
#declare a51 = 25;
#declare a52 = 0;
#declare a53 = 0;

#declare a40 = -20;
#declare a41 = -90;
#declare a42 = -90;
#declare a43 = -50;

#declare a30 = -20;
#declare a31 = -40;
#declare a32 = -40;
#declare a33 = -40;

#declare a20 = -20;
#declare a21 = -40;
#declare a22 = -40;
#declare a23 = -40;

#declare a10 = 0;
#declare a11 = 35;
#declare a12 = 35;
#declare a13 = 15;

#declare b10 = 0;
#declare b11 = 0;
#declare b12 = 0;
#declare b13 = a43 - a42;

#if (clock < T1) 
  #declare a1 = a10 + (a11 - a10)/(T1 - T0)*(clock-T0);
  #declare a2 = a20 + (a21 - a20)/(T1 - T0)*(clock-T0);
  #declare a3 = a30 + (a31 - a30)/(T1 - T0)*(clock-T0);
  #declare a4 = a40 + (a41 - a40)/(T1 - T0)*(clock-T0);
  #declare a5 = a50 + (a51 - a50)/(T1 - T0)*(clock-T0);
  #declare b1 = b10 + (b11 - b10)/(T1 - T0)*(clock-T0);
#else
  #if (clock < T2) 
    #declare a1 = a11 + (a12 - a11)/(T2 - T1)*(clock-T1);
    #declare a2 = a21 + (a22 - a21)/(T2 - T1)*(clock-T1);
    #declare a3 = a31 + (a32 - a31)/(T2 - T1)*(clock-T1);
    #declare a4 = a41 + (a42 - a41)/(T2 - T1)*(clock-T1);
    #declare a5 = a51 + (a52 - a51)/(T2 - T1)*(clock-T1);
    #declare b1 = b11 + (b12 - b11)/(T2 - T1)*(clock-T1);
  #else
    #declare a1 = a12 + (a13 - a12)/(T3 - T2)*(clock-T2);
    #declare a2 = a22 + (a23 - a22)/(T3 - T2)*(clock-T2);
    #declare a3 = a32 + (a33 - a32)/(T3 - T2)*(clock-T2);
    #declare a4 = a42 + (a43 - a42)/(T3 - T2)*(clock-T2);
    #declare a5 = a52 + (a53 - a52)/(T3 - T2)*(clock-T2);
    #declare b1 = b12 + (b13 - b12)/(T3 - T2)*(clock-T2);
  #end
#end

#declare segBraco =
  union {
    cylinder {
      <0, 0, 0>, <segBracoSize, 0, 0>, 2
      texture {textura1}
    }
    sphere {
      <segBracoSize, 0, 0>, raioArtic
      texture {textura2}
    }
  }

#declare meiaGarra =
  object {
    difference {
      cone {
        <0, 0, 0>, 2, <0, 10, 0>, 0.5
      }
      box {
        <-10, -1, -10>, <0, 11, 10>
      }
    }
    rotate 90*z
    texture {textura1}
  }
  
#declare garra = 
  object {
    union {
      object {meiaGarra rotate -a1*z}
      object {meiaGarra rotate 180*x rotate a1*z}
    }
    rotate 180*y
  }

#declare braco1 = 
  union {
    object {segBraco}
    object {garra translate (raioArtic*0.6)*x rotate a2*z translate segBracoSize*x}
  }

#declare braco2 = 
  union {
    object {segBraco}
    object {braco1 rotate a3*z translate segBracoSize*x}
  }

#declare braco3 = 
  union {
    object {segBraco}
    object {braco2 rotate a4*z translate segBracoSize*x}
  }

#declare xBraco = -8;
  
#declare base = 
  union {
    box {
      <-15,0,-15>, <15, baseH, 15>
      texture {textura1}
    }
    object {braco3 rotate 90*z rotate a5*y translate <xBraco,baseH,-8>}
    object {braco3 rotate 90*z rotate a5*y scale <1,1,-1> translate <xBraco,baseH,8>}
  }

#declare xMeliante = 28;
#declare meliante =
  cylinder {
    <0,0,0>,<0,30,0>,6
    texture {textura3}
    #declare tY = segBracoSize + baseH;
    translate <xMeliante-xBraco,-tY,0>
    rotate b1*z
    translate <xBraco,tY,0>
  }
  
// Aqui está a cena, finalmente:
plane {y, 0
  texture {
    pigment{checker <0.2,0.2,0.2>,<0.3,0.3,0.3>}
    finish {ambient 0.2 diffuse 0.8 reflection 0.05}
    scale 30.0
  }
}

union {
  object {base}
  object {meliante}
  //rotate 45*y
}