// Exemplo de arquivo de descricao de cena para POV-ray
// Last edited on 2023-12-25 09:19:11 by stolfi

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

//#include "textures.inc"

background{ color rgb < 240/255, 243/255, 246/255 > }

#declare tx_preto =
  texture{
    pigment{ color rgb 4*< 0.17, 0.17, 0.17 > }
    finish{ diffuse 0.9 ambient 0.1 }
  }

#declare tx_vermelho =
  texture{
    pigment{ color rgb < 0.80, 0.0, 0.17 > }
    finish{ diffuse 0.9 ambient 0.4 }
  }

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

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

#declare tx_grau3 =
  texture{
    pigment{ color rgb < 0.10, 1.00, 0.17 > }
    finish{ diffuse 0.9 ambient 0.1 }
  }

#declare tx_grau4 =
  texture{
    pigment{ color rgb < 1.00, 0.17, 0.10 > }
    finish{ diffuse 0.9 ambient 0.1 }
  }

#declare tx_tubo =
  texture{
    pigment{ color rgb < 0.20, 0.07, 0.90 > }
    finish{ diffuse 0.9 ambient 0.1 }
    scale 1.0
  }

#macro corpo(centro, raio)
  sphere{ 
    centro, raio
    texture{ tx_preto }
  }
#end

//--------------------------------------------------------------

#macro cabeca()
  union{
    cylinder{ 
        <0,0,0>, <3, 0, 0>, 0.35
        texture{ tx_grau4 }
    }
    sphere{
        <3, 0, 0>, 1.2
        texture{ tx_grau4 }
    }
  }
#end

#macro pescoco2(angulos)
  union{
    cylinder{ 
        <0, 0, 0>, <3, 0, 0>, 0.35
        texture{ tx_grau3 }
    }
      object{ cabeca() 
      rotate angulos[4]*y
      rotate angulos[5]*z
      translate <3, 0, 0>
    }
  }
#end

#macro pescoco1(angulos)

  union{
    cylinder{ 
        <0,0,0>, <2, 0, 0>, 0.35
        texture{ tx_grau2 }
    }

    object{ pescoco2(angulos) 
      rotate angulos[2]*y
      rotate angulos[3]*z
      translate <2, 0, 0>
    }
  }
#end

//--------------------------------------------------------------

#macro extremidade()
  cylinder{ 
      <0,0,0>, <3, 0, 0>, 0.35
      texture{ tx_grau4 }
  }
#end

#macro sub_membro(angulos)
  union{
    cylinder{ 
        <0, 0, 0>, <3, 0, 0>, 0.35
        texture{ tx_grau1 }
    }
    object{ extremidade() 
      rotate angulos[4]*y
      rotate angulos[5]*z
      translate <3, 0, 0>
    }
  }
#end

#macro membro(angulos)

  union{
    cylinder{ 
        <0,0,0>, <5, 0, 0>, 0.35
        texture{ tx_grau2 }
    }

    object{ sub_membro(angulos) 
      rotate angulos[2]*y
      rotate angulos[3]*z
      translate <5, 0, 0>
    }
  }
#end

//--------------------------------------------------------------

#macro robo(angulos_perna1, angulos_perna2, angulos_braco1, angulos_braco2, angulos_cabeca)

    #local centro_ROBO = <0, 0, 0>;
    #local raio_corpo  = 2;

    #local centro_corpo_inferior = centro_ROBO - <0, 0, raio_corpo>;
    #local centro_corpo_superior = centro_ROBO + <0, 0, raio_corpo>;

    #local perna1 = centro_corpo_inferior + <0, raio_corpo, 0>;
    #local perna2 = centro_corpo_inferior - <0, raio_corpo, 0>;

    #local braco1 = centro_corpo_superior + <0, raio_corpo, 0>;
    #local braco2 = centro_corpo_superior - <0, raio_corpo, 0>;

    #local cabeca1 = centro_corpo_superior + <0, 0, raio_corpo>;

    union{
      corpo(centro_corpo_inferior, raio_corpo)
      corpo(centro_corpo_superior, raio_corpo)
      object{ membro(angulos_perna1) 
        rotate angulos_perna1[0]*y
        rotate angulos_perna1[1]*z
        translate perna1
      }
      object{ membro(angulos_perna2) 
        rotate angulos_perna2[0]*y
        rotate angulos_perna2[1]*z
        translate perna2
      }
      object{ membro(angulos_braco1) 
        rotate angulos_braco1[0]*y
        rotate angulos_braco1[1]*z
        translate braco1
      }
      object{ membro(angulos_braco2) 
        rotate angulos_braco2[0]*y
        rotate angulos_braco2[1]*z
        translate braco2
      }
      object{ pescoco1(angulos_cabeca) 
        rotate angulos_cabeca[0]*y
        rotate angulos_cabeca[1]*z
        translate cabeca1
      }
    
    }

#end

#macro cena(tt)

  #local c = tt*2*radians(180);
  #local angulos_perna1 = array[6] {45*cos(c), cos(c),  30*cos(c), 30*cos(c),  180, 90}
  #local angulos_perna2 = array[6] {45*cos(c), 32*cos(c), 60*cos(c), 90*cos(c),  145*cos(c), 130}
  #local angulos_braco1 = array[6] {-23*cos(c), 32, 90*cos(c), 90*cos(c),  145*cos(c), 130*cos(c)}
  #local angulos_braco2 = array[6] {-65*cos(c), 0,  86*cos(c), 15*cos(c),  180*cos(c), 90}

  #local ang = 2*max(0.5,tt)*(min(-60*cos(c),0) + min(60*cos(c), 0));
  #local angulos_cabeca = array[6] {ang, 30*cos(c), -30*cos(c), 30*cos(c),  15*cos(c), -65*cos(c)}

  robo(angulos_perna1, angulos_perna2, angulos_braco1, angulos_braco2, angulos_cabeca)

#end


union{
  
  cena(clock)

  light_source {
    <0, 10, -3>
    color rgb < 200/255, 42/255, 222/255 >
    spotlight
    radius 100
    falloff 30
    tightness 10
    point_at <0, 0, 0>
  }

}

#include "eixos.inc"
// object{ eixos(10) }

#include "camlight.inc"
#declare centro_cena = < 0.00, 0.00, 1.00 >;
#declare raio_cena = 17;
#declare dir_camera = < 7, 5, 3 >;
#declare dist_camera = 7*raio_cena;
#declare intens_luz = 0.80;
camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)