// 2023-09-13 - 244899


#include "eixos.inc"

// --------------------------- Texturas --------------------------- //

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

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

#declare TxCorda = texture {
    pigment{ color rgb < 0.9, 0.9, 0.9 > }
    finish{ diffuse 0.8 ambient 0.1 specular 0.5 roughness 0.005 }
}

#declare TxDebug = texture {
    pigment{ color rgb < 0.00, 1.00, 0.00 > filter 0.70 }
    finish{ diffuse 0.03 reflection 0.25 ambient 0.02 specular 0.25 roughness 0.005 }
}


// --------------------------- Variaveis --------------------------- //

#declare raio = 0.2;
#declare tamanho_terminal = raio*2;
#declare raio_terminal = raio / 2;

// --------------------------- Macros --------------------------- //
 
#macro interpola1 (tx, t0, v0, t1, v1)
    #local ss = (tx - t0) / (t1 - t0);
    #local vv = (1 - ss) * v0 + ss * v1;
    vv
#end

#macro teste_interpola_1 (p0, p1, n, raio)
    union {
        #declare k = 0;
        #while (k <= n)
            #local canto = interpola1(k, 0, p0, n-1, p1);
            sphere { canto, raio texture { TxCorda } }
            #declare k = k + 1;
        #end
    }
#end

#macro interpola3 (tx, ta, tb, v0, v1, v2, v3)
    #local v01 = interpola1(tx, ta, v0, tb, v1);
    #local v12 = interpola1(tx, ta, v1, tb, v2);
    #local v23 = interpola1(tx, ta, v2, tb, v3);
    #local v012 = interpola1(tx, ta, v01, tb, v12);
    #local v123 = interpola1(tx, ta, v12, tb, v23);
    #local v0123 = interpola1(tx, ta, v012, tb, v123);
    v0123
#end

#macro teste_interpola_3 (p0, p1, p2, p3, n, raio)
    union {
       #declare k = 0;
        #declare ta = 0;
        #declare tb = n - 1;
        #while (k <= n)
            #local canto = interpola3(k, ta, tb, p0, p1, p2, p3);
            sphere { canto, raio texture {TxCorda} }
            #declare k = k + 1;
        #end
    }
#end

#macro interpola3_multi(tx, pin, n, p1, p2, pfn)
  union {
    #declare
  }
#end

#include "bezpoly.inc"

#macro teste_interpola3_multi(pin, n, p1, p2, pfn)
  union {
    #declare k = 0;
    #while (k <= n)
      // #local canto = interpola3_multi(k, pin, n, p1, p2, pfn)
      // sphere { canto, raio texture {TxCorda} }
      #declare k = k + 1;
    #end
  }
#end


#macro vertice_2 (p)
    union {
        #declare raio_cilindro = raio / 2;
        #declare tamanho_cilindro = raio * 4;
        cylinder { p, p + < tamanho_terminal, 0, 0> , raio_cilindro }
        sphere { p, raio }
        cylinder { p, p + < 0, tamanho_cilindro, 0> , raio_terminal }
        sphere { p + <0, tamanho_cilindro, 0>, raio }
        cylinder { p + <0, tamanho_cilindro, 0>, p + <0, tamanho_cilindro, 0> + <0, 0, tamanho_terminal> , raio_terminal }
        texture { TxVertice2 }
    }
#end

#macro vertice_3 (p)
    union {
        #declare raio_cilindro = raio * 3/2;
        #declare altura_cilindro = raio * 2;
        #declare altura_cone = raio * 3;
        cone { p, raio_cilindro  p + <0, 0, altura_cone>, 0.01 }
        cylinder { p, p - < 0, 0, altura_cilindro> , raio_cilindro }
        sphere { p - <0, raio_cilindro / 2 + raio / 2, 0>, raio }
        sphere { p + <0, raio_cilindro / 2 + raio / 2, 0>, raio }
        sphere { p + <0, 0, altura_cone>, raio }
        cylinder { p + <0, 0, altura_cone>, p + <0, 0, altura_cone> + <0, 0, tamanho_terminal> , raio_terminal }
        cylinder { p + <0, raio_cilindro / 2 + raio / 2, 0>, p + <0, raio_cilindro / 2 + raio / 2, 0> + <0, tamanho_terminal, 0> , raio_terminal }
        cylinder { p - <0, raio_cilindro / 2 + raio / 2, 0>, p - <0, raio_cilindro / 2 + raio / 2, 0> - <0, tamanho_terminal, 0> , raio_terminal }
        texture { TxVertice3 }
    }
#end


// --------------------------- Cena --------------------------- //

object {
  teste_interpola3_multi(
    <1,3,2> + <tamanho_terminal, 0, 0>,
    600,
    1,
    2,
    <0,-3,-2.5> + <0, raio * 3/4 + raio / 2, 0> + <0, tamanho_terminal, 0>,
  )
}

object { vertice_2(<1,3,2>) }
object { vertice_3(<0,-3,-2.5>) }

// --------------------------- Camera --------------------------- //
#include "eixos.inc"
// object{ eixos(5) }

#declare cmin = < -2,-5,-3.5 >;
#declare cmax = < +3,+5,+2.5 >;

box{ cmin-0.1*z, <cmax.x,cmax.y,cmin.z>  texture{ pigment{ color rgb <0.80,0.70,0.60> } finish {diffuse 0.7 ambient 0.3 } } }

#include "camlight.inc"
#declare centro_cena = (cmin + cmax)/2;
#declare raio_cena = 0.5*vlength(cmin - cmax);
#declare dir_camera = < 14.00, 7.00, 4.00 >;
#declare dist_camera = 5*raio_cena;
#declare intens_luz = 1.20;
camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)