// Trabalho de MC930 - 08/05/03
// Continuação de "O Primeiro Passo"
// Amandio Pereira de Sena Júnior  -  RA 007998

#include "colors.inc"

#declare tempo = 2*clock;

// estas variáveis são usadas para estudo do movimento
// quando iguais a zero, a animação ocorre de verdade
#declare parado = 0;
#declare mostrar_eixos = 0;
#declare camera_simples = 0;
  // 0=movimento normal;
  // 1=parada em perspectiva;
  // 2=parada com perfil do tornozelo;
  // 3=parada em perfil;

background{ color rgb < 0.00, 0.03, 0.15 > }

light_source {
  < 0, 10.00, -20.00 >
  color rgb < 1.00, 1.00, 1.00 >
}
light_source {
  < 10, 10.00, -15.00 >
  color rgb < 1.00, 1.00, 1.00 >
}
light_source {
  < -10, 10.00, -15.00 >
  color rgb < 1.00, 1.00, 1.00 >
}
light_source {
  < 10, 10.00, 15.00 >
  color rgb < 1.00, 1.00, 1.00 >
}
light_source {
  < -10, 10.00, 15.00 >
  color rgb < 1.00, 1.00, 1.00 >
}

#switch (camera_simples)  //perfil
  #case (3)
  camera {
      location <-20, -5, 0>
      look_at  <0, -3, 0>
      sky       <  0.00, 1.00, 0.00 >
      right <1,0,0>
      up <0,1,0>
   }
  #break
  #case (2)  //perfil do peh
  camera {
      location <-8, -8, 0>
      look_at  <0, -8, 0>
      sky       <  0.00, 1.00, 0.00 >
      right <1,0,0>
      up <0,1,0>
   }
  #break
  #case (1) //camera parada
  camera {
      location <-20, 1, -10>
      look_at  <0, -3, 0>
      sky       <  0.00, 1.00, 0.00 >
      right <1,0,0>
      up <0,1,0>
   }
  #break
  #else //camera se movimentando
  camera {
      location <-20, 1, -10>
      look_at  <0, -3, -tempo*5>
      sky       <  0.00, 1.00, 0.00 >
      right <1,0,0>
      up <0,1,0>
   }
#end

#declare tinta_A = 
  texture {
    pigment { color rgb < 0.10, 0.80, 1.00 > }
    finish { diffuse 0.5 specular 0.5 roughness 0.005 ambient 0.1 }
  }

#declare tinta_B = 
  texture {
    pigment { color rgb < 1.00, 0.80, 0.10 > }
    finish { diffuse 0.5 specular 0.5 roughness 0.005 ambient 0.1 }
  }

#declare tinta_C = //marrom
  texture {
    pigment { color rgb < 1, 0.70, 0.40 > }
    finish { diffuse 0.5 specular 0.5 roughness 0.005 ambient 0.1 }
  }

#declare tinta_D = //vermelho
  texture {
    pigment { color rgb < 1.00, 0.10, 0.10 > }
    finish { diffuse 0.5 specular 0.5 roughness 0.005 ambient 0.1 }
  }
  
#declare plano =
  plane { <0, 1, 0>, 0
   pigment {
     checker color Red, color Blue
   }
 }

#declare eixos =
union {
  cylinder {
    <0,0,0>,
    <0,50,0>,
    .1
    texture { tinta_A }
  }
  cylinder {
    <0,0,50>,
    <0,0,-50>,
    .1
    texture { tinta_A }
  }
  cylinder {
    <0,5,50>,
    <0,5,-50>,
    .1
    texture { tinta_A }
  }
}

// AQUI COMEÇA O QUE INTERESSA

//corpo consiste de caixa simples centrada na origem - ainda deve ser transladada para cima
#declare corpo =
  box {
    <-1.2,-3,1>,  // Near lower left corner
    <1.2,3,-1>  // Far upper right corner
    texture { tinta_A }
    translate y*3.5
  }

#declare cintura =
union {
  cylinder {
    <-1.5,0,0>,
    <1.5,0,0>,
    .4
    texture { tinta_A }
  }
}

#declare l1=5;//comprimento da coxa
#declare l2=5;//comprimento da canela
#declare Hmax=9.3;//altura da cintura ao plano

//coxa direita com o ponto 0,0,0 na origem do cilindro.
//dessa forma as rotacoes da coxa sao triviais
//ela eh declarada na rotacao inicial (macaco parado)
#declare coxad =
union {
  cylinder {
    <0,0,0>,
    <0,-4,-3>,
    .4
    texture { tinta_A }
  }
}

//analogo a coxad
#declare canelad =
union {
  cylinder {
    <0,0,0>,
    <0,-4,3>,
    .3
    texture { tinta_B }
  }
}

#declare ped =
union {
  box {
    <-.6,-.2,0.4>,  // Near lower left corner
    <.6,.2,-1.6>  // Far upper right corner
    texture { tinta_A }
    rotate x*180*sin(90*tempo)/(pi*5)
    rotate x*-15
  }
}

#declare pernad0 =
union {
  object { canelad }
  object { ped translate <0,-4,3> }
  #declare tetapernad0 = 60*abs(sin(tempo*3.14159));
  rotate x*tetapernad0
}

#declare pernad =
union {
  object { coxad }
  object { pernad0 translate <0,-4,-3> }
  #declare tetapernad = 30*sin(tempo*3.14159);
  rotate x*tetapernad
}

#declare coxae =
union {
  cylinder {
    <0,0,0>,
    <0,-4,-3>,
    .4
    texture { tinta_A }
  }
}

//analogo a coxae
#declare canelae =
union {
  cylinder {
    <0,0,0>,
    <0,-4,3>,
    .3
    texture { tinta_B }
  }
}

#declare pee =
union {
  box {
    <-.6,-.2,0.4>,  // Near lower left corner
    <.6,.2,-1.6>  // Far upper right corner
    texture { tinta_A }
    rotate x*180*cos(90*tempo)/(pi*5)
    rotate x*-15
  }
}

#declare pernae0 =
union {
  object { canelad }
  object { pee translate <0,-4,3> }
  #declare tetapernae0 = 60*abs(cos(tempo*3.14159));
  rotate x*tetapernae0
}

#declare pernae =
union {
  object { coxae }
  object { pernae0 translate <0,-4,-3> }
  #declare tetapernae = 30*cos(tempo*3.14159);
  rotate x*tetapernae
}

#declare macaco =
union {
  object { corpo }
  object { cintura }
  object { pernad translate x*-2}
  object { pernae translate x*2}
  #if (parado = 0)
    translate z*(-tempo*5)
  #end

  #declare H = (l1*cos((tetapernad+60)*pi/180) + l2*sin((tetapernad0+30)*pi/180));
  #if (H>Hmax)
    translate (H-Hmax+.3)*y
  #end
  #declare H = (l1*cos((tetapernae+60)*pi/180) + l2*sin((tetapernae0+30)*pi/180));
  #if (H>Hmax)
    translate (H-Hmax+.3)*y
  #end
}

union {
  object { macaco }
  object { plano translate -10*y}
  #if (mostrar_eixos = 1)
    object { eixos }
  #end
}