// Exemplo de arquivo de descricao de cena para POV-ray
// Last edited on 2021-12-09 10:42:54 by stolfi

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

background{ color rgb < 0.2, 0.2, 0.4 > }

#declare tx_dirt =
  texture{
    pigment{ color rgb < 0.2, 0.2, 0.2 > }
    finish{ diffuse 0.8 reflection 0.25 ambient 0.0 specular 0.5 roughness 0.1}
  }
#declare tx_trunk =
  texture{
    pigment{ color rgb < 0.5, 0.2, 0.1 > }
    finish{ diffuse 0.8 ambient 0.0 specular 0.5 roughness 0.8}
    normal { bumps 1 scale .05  }
  }
#declare tx_leaf =
  texture{
    pigment{ color rgb < 0.4, 1, 0.2 > }
    finish{ diffuse 0.8 ambient 0.0 specular 0.5 roughness 0.5}
  }


#declare tx_ground =
  texture{
    pigment{ color rgb < 0.7, 0.6, 0.2 > }
    finish{ diffuse 0.8 specular 0.9 roughness 0.1}
    normal { bumps 0.1 scale 1  } 
  }

#declare tx_clank_dark_gray =
  texture{
    pigment{ color rgb < 0.1, 0.1, 0.1 > }
    finish{ diffuse 0.8 specular 0.5 roughness 0.1}
  }
#declare tx_clank_light_gray =
  texture{
    pigment{ color rgb < 0.5, 0.5, 0.5 > }
    finish{ diffuse 0.8 specular 0.5 roughness 0.1}
  }
#declare tx_clank_mid_gray =
  texture{
    pigment{ color rgb < 0.2, 0.2, 0.2 > }
    finish{ diffuse 0.8 specular 0.5 roughness 0.1}
  }

#declare tx_eye = 
  texture{
    pigment{ color rgb < 1, 0.2, 0.2 > }
    finish{ diffuse 1 ambient 0.5 specular 0.5 roughness 0.1}
  }

#declare tx_fire = 
  texture{
    pigment{ color rgb < 1.000, 0.650, 0.200 > }
    finish{ diffuse 0.1 ambient 0.9 }
}

#declare tx_fire_red= 
  texture{
    pigment{ color rgb < 1.000, 0.450, 0.200 > }
    finish{ diffuse 0.1 ambient 0.9 }
}


#declare tx_vidro = 
  texture{
    pigment{ color rgb < 0.85, 0.95, 1.00 > filter 0.70 }
    finish{ diffuse 0.03 reflection 0.25 ambient 1 specular 0.25 roughness 0.005 }
  }

// ======================================================================
// DESCRICAO DA CENA
#declare ground = 
  box{ 
    <-400,-400,-1>, <+400,+400,0> 
    texture{ tx_ground }
  }

#macro clank_chin(head_angle)
  object{
    union{
      difference {
        sphere {
          <0, 0, 0>, 0.05 // <x, y, z>, radius
          texture{ tx_clank_light_gray}
          scale <1,1,1.2>
        }
        box {
          <2, 2, 2>, <-1,-1, 0.0> // <x, y, z> near lower left corner, <x, y, z> far upper right corner
          texture{ tx_clank_dark_gray}
        }
      }
      // neck
      cylinder {
        <0, 0, -0.04>, <0, 0, -0.09>, 0.01 // center of one end, center of other end, radius
        texture{ tx_clank_dark_gray}
      }

      object {
        clank_forehead()
        rotate <0, -head_angle, 0>
        translate <-0.05,0, 0>
      }
    }
    translate <0, 0, 0.05*1.2> // <x, y, z>
  }
#end

#macro clank_forehead()
  object {
    union {
      difference {
        sphere {
          <0, 0, 0>, 0.05 // <x, y, z>, radius
          texture{ tx_clank_light_gray}
          scale <1,1,1.2>
        }
        box {
          <-2, -2, -2>, <2,2, 0.0> // <x, y, z> near lower left corner, <x, y, z> far upper right corner
          texture{ tx_clank_dark_gray}
        }
      }
      // Eye Right 
      cylinder {
        <0, 0.025, 0.025>, <0.05, 0.025, 0.025>, 0.015 // center of one end, center of other end, radius
        texture{ tx_clank_mid_gray}
      }
      sphere {
        <0.05, 0.025, 0.025>, 0.013 // <x, y, z>, radius
        texture{ tx_eye}
      }
      // Eye Left
      cylinder {
        <0, -0.025, 0.025>, <0.05, -0.025, 0.025>, 0.015 // center of one end, center of other end, radius
        texture{ tx_clank_mid_gray}
      }
      sphere {
        <0.05, -0.025, 0.025>, 0.013 // <x, y, z>, radius
        texture{ tx_eye}
      }
    }
    translate <0.05, 0, 0>
  }
#end

#macro clank_top_falange()
  object{
    union {
      box {
        <-0.0095, 0, -0.005>, <0.0095, 0.01, 0.005> // <x, y, z> near lower left corner, <x, y, z> far upper right corner
        texture{ tx_clank_dark_gray}
      }
      box {
        <-0.01, 0.01, -0.005>, <0.01, 0.02, 0.005> // <x, y, z> near lower left corner, <x, y, z> far upper right corner
        texture{ tx_clank_mid_gray}
      }
    }
  }
#end

#macro clank_bot_falange(top_falange_angle)
  object{

    // create finger middle
    union {
      box {
        <-0.0095, 0, -0.005>, <0.0095, 0.01, 0.005> // <x, y, z> near lower left corner, <x, y, z> far upper right corner
        texture{ tx_clank_dark_gray}
      }
      box {
        <-0.01, 0.01, -0.005>, <0.01, 0.02, 0.005> // <x, y, z> near lower left corner, <x, y, z> far upper right corner
        texture{ tx_clank_mid_gray}
      }

      // append top falange
      object {
        clank_top_falange()
        rotate <top_falange_angle, 0, 0> // <x°, y°, z°>
        translate <0, 0.02, 0> // <x, y, z>
      }
    }
  }
#end


#macro clank_hand(thumb_bot_falange_angle, thumb_top_falange_angle,
                  f1_bot_falange_angle, f1_top_falange_angle,
                  f2_bot_falange_angle, f2_top_falange_angle)
  object{
    union {
      // create hand
      object {
        box {
          <-0.02, 0, -0.005>, <0.02, 0.04, 0.005> // <x, y, z> near lower left corner, <x, y, z> far upper right corner
          texture{ tx_clank_light_gray}
        }
      }

      // append fingers
      object{
        union {
          // Finger 1
          object {
            clank_bot_falange(f1_top_falange_angle)
            rotate <f1_bot_falange_angle, 0, 0> // <x°, y°, z°>
            translate <-0.01, 0.04, 0> // <x, y, z>
          }

          // Finger 2
          object {
            clank_bot_falange(f2_top_falange_angle)
            rotate <f2_bot_falange_angle, 0, 0> // <x°, y°, z°>
            translate <0.01, 0.04, 0> // <x, y, z>
          }

          // Thumb
          object {
            clank_bot_falange(thumb_top_falange_angle)
            scale <1.1, 0.5, 1>
            rotate <thumb_bot_falange_angle, 0, -90> // <x°, y°, z°>
            translate <0.02, 0.01, 0> // <x, y, z>
          }
        }
      }
    }
  }
#end
 
#macro clank_forearm(hand_angle,
                  thumb_bot_falange_angle, thumb_top_falange_angle,
                  f1_bot_falange_angle, f1_top_falange_angle,
                  f2_bot_falange_angle, f2_top_falange_angle)
  object{
    union {
      // create forearm
      object {
        union{
          cylinder {
            <0, 0, -0.0045>, <0, 0, 0.0045>, 0.006 // center of one end, center of other end, radius
            texture{ tx_clank_light_gray}
          }
          cylinder {
            <0, 0, -0.0055>, <0, 0, 0.0055>, 0.005 // center of one end, center of other end, radius
            texture{ tx_clank_dark_gray}
          }
          cylinder {
            <0, 0, 0>, <0, 0.03, 0>, 0.004 // center of one end, center of other end, radius
            texture{ tx_clank_dark_gray}
          }
        }
      }

      // append fingers
      object{
          // hand
          object {
            clank_hand(
              thumb_bot_falange_angle, thumb_top_falange_angle,
              f1_bot_falange_angle, f1_top_falange_angle,
              f2_bot_falange_angle, f2_top_falange_angle
            )
            rotate <hand_angle, 0, 0> // <x°, y°, z°>
            translate <0, 0.028, 0> // <x, y, z>
          }
      }
    }
  }
#end

#macro clank_arm(forearm_angle, hand_angle,
                  thumb_bot_falange_angle, thumb_top_falange_angle,
                  f1_bot_falange_angle, f1_top_falange_angle,
                  f2_bot_falange_angle, f2_top_falange_angle)
  object{
    union {
      // create arm
      object {
        union{
          // ombrera
          cylinder {
            <0, 0, -0.005>, <0, 0, 0.005>, 0.015 // center of one end, center of other end, radius
            texture{ tx_clank_light_gray}
          }
          cylinder {
            <0, 0, 0.005>, <0, 0, 0.02>, 0.004 // center of one end, center of other end, radius
            texture{ tx_clank_dark_gray}
          }
          cylinder {
            <0, 0, 0>, <0, 0.03, 0>, 0.004 // center of  one end, center of other end, radius
            translate <0, 0.015, 0> // <x, y, z>
            texture{ tx_clank_dark_gray}
          }
        }
      }

      // append fingers
      object{
        union {
          // hand
          object {
            clank_forearm(
              hand_angle,
              thumb_bot_falange_angle, thumb_top_falange_angle,
              f1_bot_falange_angle, f1_top_falange_angle,
              f2_bot_falange_angle, f2_top_falange_angle
            )
            rotate <0, 0, -forearm_angle> // <x°, y°, z°>
            translate <0, 0.045, 0> // <x, y, z>
          }
        }
      }
    }
  }
#end

#macro clank_propulsor()
  object {
    union {
        cone {
          <0, 0, 0>, 0.03 // <x, y, z>, center & radius of one end
          <0, 0.01, -0.09>, 0 // <x, y, z>, center & radius of the other end
          texture{ tx_fire}
        }
        cone {
          <0, 0, 0>, 0.03 // <x, y, z>, center & radius of one end
          <0.01, 0, -0.09>, 0 // <x, y, z>, center & radius of the other end
          texture{ tx_fire}
        }
        cone {
          <0, 0, 0>, 0.03 // <x, y, z>, center & radius of one end
          <0, -0.01, -0.09>, 0 // <x, y, z>, center & radius of the other end
          texture{ tx_fire}
        }
        cone {
          <0, 0, 0>, 0.03 // <x, y, z>, center & radius of one end
          <-0.01, 0, -0.09>, 0 // <x, y, z>, center & radius of the other end
          texture{ tx_fire}
        }
        cone {
          <0, 0, 0>, 0.038 // <x, y, z>, center & radius of one end
          <0, 0, -0.1>, 0 // <x, y, z>, center & radius of the other end
          texture{ tx_fire_red}
        }
      
    }
  }
#end

#macro clank_body(prop_rot, prop_trans,
                  mouth_angle, head_angle,
                  arm_angle1_right, arm_angle_2_right, forearm_angle_right, hand_angle_right,
                  thumb_bot_falange_angle_right, thumb_top_falange_angle_right,
                  f1_bot_falange_angle_right, f1_top_falange_angle_right,
                  f2_bot_falange_angle_right, f2_top_falange_angle_right,
                  arm_angle1_left, arm_angle_2_left, forearm_angle_left, hand_angle_left,
                  thumb_bot_falange_angle_left, thumb_top_falange_angle_left,
                  f1_bot_falange_angle_left, f1_top_falange_angle_left,
                  f2_bot_falange_angle_left, f2_top_falange_angle_left)
  object{
    union {
      // create arm
      object {
        union {
          box {
            <-0.07, -0.05, 0>, <0.07, 0.05, 0.12> // <x, y, z> near lower left corner, <x, y, z> far upper right corner
            texture{ tx_clank_light_gray}
          }
          box {
            <-0.075, -0.04, 0.03>, <0.075, 0.04, 0.1> // <x, y, z> near lower left corner, <x, y, z> far upper right corner
            texture{ tx_clank_dark_gray}
          }
        }
      }

      // append arms
      object{
          // hand
          union {
            object {
              clank_arm(
                forearm_angle_left,hand_angle_left,
                thumb_bot_falange_angle_left, thumb_top_falange_angle_left,
                f1_bot_falange_angle_left, f1_top_falange_angle_left,
                f2_bot_falange_angle_left, f2_top_falange_angle_left
              )
              rotate <-90, 0, -forearm_angle_left> // <x°, y°, z°>
              translate <0, -0.07, 0.08> // <x, y, z>
            }
            object {
              clank_arm(
                forearm_angle_right,hand_angle_right,
                thumb_bot_falange_angle_right, thumb_top_falange_angle_right,
                f1_bot_falange_angle_right, f1_top_falange_angle_right,
                f2_bot_falange_angle_right, f2_top_falange_angle_right
              )
              scale <1,-1,1>
              rotate <90, 0, -forearm_angle_right> // <x°, y°, z°>
              translate <0, 0.07, 0.08> // <x, y, z>
            }
          }
        }
      // append head
      object {
        clank_chin(mouth_angle)
        rotate <0,0,head_angle>
        translate <0, 0, 0.13> // <x, y, z>
      }

      // Propulsor
      cylinder {
        <0, 0, -0.02>, <0, 0, 0.010>, 0.04 // center of one end, center of other end, radius
        open // remove end caps
        texture{ tx_clank_dark_gray}
      }
      object {
        clank_propulsor()
        rotate <0,0,prop_rot>
        translate <0, 0, prop_trans> // <x, y, z>
      }
      
    }
  }
#end

#include "eixos.inc"

// Aqui est� a cena, finalmente:

union{
  object{ground}
  // object{ eixos(0.1) }
  object{ 
    clank_body(12, 0.01, 30, 10, -30, 20, 10, -40, 60, 40, -30, 50, -20, -60, 40, -20, 60, 50, -30, -80, 50, 40, -30, 30)
    translate <00.00, -0.30, +0.20>
  }
  object{ 
    clank_body(12, 0.01, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
    translate <00.00, 00.00, +0.20>
  }
  object{ 
    clank_body(12, 0.01, 40, -76, 88, -85,  17, 43, 39, -67, 1, 77, 65, -43, 17, -88, -72, 83, -40, 54, -19, 77, 4, 11 )
    translate <00.00, +0.30, +0.20>
  }
  
}

#include "camlight.inc"
#declare centro_cena = < 0.00, 0, 0.3 >;
#declare raio_cena = 0.55;
#declare dir_camera = < 20.00, 8.00, 3.00 >;
#declare dist_camera = 5*raio_cena;
#declare intens_luz = 1; 
camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)