// Last edited on 2023-12-27 04:20:26 by stolfi

background{ color rgb < 0.75, 0.80, 0.85 > }
 
#include "eixos.inc"

#declare tx_bicho =
  texture{
    pigment{ color rgb < 0.5, 0, 0 > }
    finish{ diffuse 0.9 ambient 0.1 }
  }

#declare tx_galho =
  texture{
    pigment{ color rgb < 0.120, 0.064, 0.008 > }
    finish{ diffuse 0.9 ambient 0.1 }
  }

#macro tronco()
  union{ 
    cylinder{
      < 0, 0, 0 >,
      < 0, 0, 5 >,
      2.3
      texture{ tx_bicho }
    }
  }
#end

#macro membro_ponta()
  #local mp =
    cylinder{
      < 0, 0, 0 >,
      < 0, 0.7, 0 >,
      0.7
      texture{ tx_bicho }
    }

  union {
    object { mp }
  }
#end

#macro sub_membro_pequeno(b9)
  #local smp =
    cylinder{
      < 0, 0, 0 >,
      < 0, 0, 3 >,
      0.3
      texture{ tx_bicho }
    }

  #local mp = membro_ponta();

  union {
    object { smp }
    object { mp rotate b9*x translate <0,-0.3,3>}
  }
#end

#macro membro(b8, b9)
  #local sub_membro_grande =
    cylinder{
      < 0, 0, 0 >,
      < 0, 0, 4 >,
      0.3
      texture{ tx_bicho }
    }

  #local smp = sub_membro_pequeno(b9);

  union {
    object { sub_membro_grande }
    object { smp rotate b8*y translate <0,0,4>}
  }
#end

#macro cabeca()
  #local cab =
    sphere{
      < 0, 0, 0>,
      1.5
      texture{ tx_bicho }
    }

  union {
    object { cab }
  }
#end

#macro sub_pescoco(b1)
  #local pescoco =
    cylinder{
      < 0, 0, 0 >,
      < 0, 0, 1.5 >,
      0.6
      texture{ tx_bicho }
    }

  #local cab = cabeca();

  union {
    object { pescoco }
    object { cab rotate b1*x translate <0,0,3>}
  }
#end

#macro cab_pes(b1, b2)
  #local pescoco =
    cylinder{
      < 0, 0, 0 >,
      < 0, 0, 2 >,
      0.6
      texture{ tx_bicho }
    }

  #local sp = sub_pescoco(b1);

  union {
    object { pescoco }
    object { sp rotate b2*x translate <0,0,2>}
  }
#end

#macro bicho_preguica(b1, b2, b3, b4, a4, b5, b6, b7, a7, b8, b9, b10, a10, b11, b12, b13, a13, b14, b15)
  #local perna_1 = membro(b8, b9)
  #local perna_2 = membro(b11, b12)

  #local braco_1 = membro(b5, b6)
  #local braco_2 = membro(b14, b15)

  #local pescoco_e_cabeca = cab_pes(b1, b2)

  union{
    object { tronco() }
    object { perna_1 rotate b7*y rotate a7*x translate <0,2,0.5>}
    object { perna_2 rotate b10*y rotate a10*x scale <-1, -1, 1> translate <0,-2,0.5> }

    object { braco_1 rotate b4*y rotate a4*x translate <0,2,4.5>}
    object { braco_2 rotate b13*y rotate a13*x scale <-1, -1, 1> translate <0,-2,4.5>}

    object { pescoco_e_cabeca rotate b3*y translate <0,0,5>}    
  }
#end

#macro empacota(b1, b2, b3, b4, a4, b5, b6, b7, a7, b8, b9, b10, a10, b11, b12, b13, a13, b14, b15)
  #local P = array[19];
  #local P[0] = b1;
  #local P[1] = b2;
  #local P[2] = b3;
  #local P[3] = b4;
  #local P[4] = a4;
  #local P[5] = b5;
  #local P[6] = b6;
  #local P[7] = b7;
  #local P[8] = a7;
  #local P[9] = b8;
  #local P[10] = b9;
  #local P[11] = b10;
  #local P[12] = a10;
  #local P[13] = b11;
  #local P[14] = b12;
  #local P[15] = b13;
  #local P[16] = a13;
  #local P[17] = b14;
  #local P[18] = b15;

  P
#end

#macro acha_quadro(tt, NQ, TQ)
  #local k = 0;
  #for (i, 1, NQ-1)
    #if (TQ[i] >= tt)
      #break
    #end
    #local k=k+1;
  #end

  k
#end

#macro interpola_quadros(tt, ta, Pa, tb, Pb, b1, b2, b3, b4, a4, b5, b6, b7, a7, b8, b9, b10, a10, b11, b12, b13, a13, b14, b15)
  #local s = (tt - ta)/(tb - ta);
  #declare b1 = (1-s)*Pa[0] + s*Pb[0];
  #declare b2 = (1-s)*Pa[1] + s*Pb[1];
  #declare b3 = (1-s)*Pa[2] + s*Pb[2];
  #declare b4 = (1-s)*Pa[3] + s*Pb[3];
  #declare a4 = (1-s)*Pa[4] + s*Pb[4];
  #declare b5 = (1-s)*Pa[5] + s*Pb[5];
  #declare b6 = (1-s)*Pa[6] + s*Pb[6];
  #declare b7 = (1-s)*Pa[7] + s*Pb[7];
  #declare a7 = (1-s)*Pa[8] + s*Pb[8];
  #declare b8 = (1-s)*Pa[9] + s*Pb[9];
  #declare b9 = (1-s)*Pa[10] + s*Pb[10];
  #declare b10 = (1-s)*Pa[11] + s*Pb[11];
  #declare a10 = (1-s)*Pa[12] + s*Pb[12];
  #declare b11 = (1-s)*Pa[13] + s*Pb[13];
  #declare b12 = (1-s)*Pa[14] + s*Pb[14];
  #declare b13 = (1-s)*Pa[15] + s*Pb[15];
  #declare a13 = (1-s)*Pa[16] + s*Pb[16];
  #declare b14 = (1-s)*Pa[17] + s*Pb[17];
  #declare b15 = (1-s)*Pa[18] + s*Pb[18];
#end

#macro def_tempos()
  #local TQ = array[7];
  #local TQ[0] = 0.000;
  #local TQ[1] = 0.166;
  #local TQ[2] = 0.333;
  #local TQ[3] = 0.500;
  #local TQ[4] = 0.666;
  #local TQ[5] = 0.833;
  #local TQ[6] = 1.000;

  TQ
#end

#macro def_quadros()
  #local PQ = array[7];

  #local b1 = -90;   #local b2 = -25;   #local b3 = 10;   #local b4 = 45;   #local a4 = -100;   #local b5 = 90;   #local b6 = 90;   #local b7 = 45;   #local a7 = -100;   #local b8 = 90;   #local b9 = 90;   #local b10 = -45;   #local a10 = -100;   #local b11 = -90;   #local b12 = 90;   #local b13 = -45;   #local a13 = -90;   #local b14 = -90;   #local b15 = 90;
  #local PQ[0] = empacota(b1, b2, b3, b4, a4, b5, b6, b7, a7, b8, b9, b10, a10, b11, b12, b13, a13, b14, b15);
  
  #local b1 = -90;   #local b2 = -25;   #local b3 = 10;   #local b4 = 0;   #local a4 = -45;   #local b5 = 90;   #local b6 = 90;   #local b7 = 45;   #local a7 = -100;   #local b8 = 90;   #local b9 = 90;   #local b10 = -45;   #local a10 = -100;   #local b11 = -90;   #local b12 = 90;   #local b13 = -45;   #local a13 = -90;   #local b14 = -90;   #local b15 = 90; 
  #local PQ[1] = empacota(b1, b2, b3, b4, a4, b5, b6, b7, a7, b8, b9, b10, a10, b11, b12, b13, a13, b14, b15);
  
  #local b1 = -90;   #local b2 = -25;   #local b3 = 10;   #local b4 = 0;   #local a4 = -45;   #local b5 = 90;   #local b6 = 90;   #local b7 = 45;   #local a7 = -100;   #local b8 = 90;   #local b9 = 90;   #local b10 = -45;   #local a10 = -100;   #local b11 = -90;   #local b12 = 90;   #local b13 = -0;   #local a13 = -45;   #local b14 = -90;   #local b15 = 90; 
  #local PQ[2] = empacota(b1, b2, b3, b4, a4, b5, b6, b7, a7, b8, b9, b10, a10, b11, b12, b13, a13, b14, b15);
  
  #local b1 = -90;   #local b2 = -25;   #local b3 = 10;   #local b4 = 45;   #local a4 = -100;   #local b5 = 90;   #local b6 = 90;   #local b7 = 45;   #local a7 = -150;   #local b8 = 90;   #local b9 = 90;   #local b10 = -45;   #local a10 = -150;   #local b11 = -90;   #local b12 = 90;   #local b13 = -45;   #local a13 = -90;   #local b14 = -90;   #local b15 = 90; 
  #local PQ[3] = empacota(b1, b2, b3, b4, a4, b5, b6, b7, a7, b8, b9, b10, a10, b11, b12, b13, a13, b14, b15);
  
  #local b1 = -90;   #local b2 = -25;   #local b3 = 10;   #local b4 = 45;   #local a4 = -100;   #local b5 = 90;   #local b6 = 90;   #local b7 = 45;   #local a7 = -150;   #local b8 = 90;   #local b9 = 90;   #local b10 = -45;   #local a10 = -100;   #local b11 = -90;   #local b12 = 90;   #local b13 = -45;   #local a13 = -90;   #local b14 = -90;   #local b15 = 90; 
  #local PQ[4] = empacota(b1, b2, b3, b4, a4, b5, b6, b7, a7, b8, b9, b10, a10, b11, b12, b13, a13, b14, b15);
  
  #local b1 = -90;   #local b2 = -25;   #local b3 = 10;   #local b4 = 45;   #local a4 = -100;   #local b5 = 90;   #local b6 = 90;   #local b7 = 45;   #local a7 = -100;   #local b8 = 90;   #local b9 = 90;   #local b10 = -45;   #local a10 = -100;   #local b11 = -90;   #local b12 = 90;   #local b13 = -45;   #local a13 = -90;   #local b14 = -90;   #local b15 = 90;
  #local PQ[5] = empacota(b1, b2, b3, b4, a4, b5, b6, b7, a7, b8, b9, b10, a10, b11, b12, b13, a13, b14, b15);
  
  #local b1 = -90;   #local b2 = -25;   #local b3 = 10;   #local b4 = 45;   #local a4 = -100;   #local b5 = 90;   #local b6 = 90;   #local b7 = 45;   #local a7 = -100;   #local b8 = 90;   #local b9 = 90;   #local b10 = -45;   #local a10 = -100;   #local b11 = -90;   #local b12 = 90;   #local b13 = -45;   #local a13 = -90;   #local b14 = -90;   #local b15 = 90;
  #local PQ[6] = empacota(b1, b2, b3, b4, a4, b5, b6, b7, a7, b8, b9, b10, a10, b11, b12, b13, a13, b14, b15);

  PQ
#end

#include "galho.inc"
#local Lg = 4; // Deslocamento por ciclo -- Prof

#macro cena(tt)
  #local NQ = 6;
  #local TQ = def_tempos();
  #local PQ = def_quadros();

  #local b1 = 0; #local b2 = 0; #local b3 = 0; #local b4 = 0; #local a4 = 0; #local b5 = 0; #local b6 = 0; #local b7 = 0; #local a7 = 0; #local b8 = 0; #local b9 = 0; #local b10 = 0; #local a10 = 0; #local b11 = 0; #local b12 = 0; #local b13 = 0; #local a13 = 0; #local b14 = 0; #local b15 = 0;  #local k = acha_quadro(tt, NQ, TQ);
  interpola_quadros(tt, TQ[k], PQ[k], TQ[k+1], PQ[k+1], b1, b2, b3, b4, a4, b5, b6, b7, a7, b8, b9, b10, a10, b11, b12, b13, a13, b14, b15);
  union{
    object { bicho_preguica(b1, b2, b3, b4, a4, b5, b6, b7, a7, b8, b9, b10, a10, b11, b12, b13, a13, b14, b15) }
    object { galho( < 0, 0, -Lg/2 >, < 0, 0, +Lg/2>, 1.7, 0) translate 4.5*x }
  }
  
#end

// object { eixos(10) }
object { cena(clock) }

#include "camlight.inc"
#declare centro_cena = < 2.00, 0.00, 4.50 >;
#declare raio_cena = 11.0;
#declare dir_camera = < 4, 7, 3 >;
#declare dist_camera = 5*raio_cena;
#declare intens_luz = 1.20;
camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)