// Exemplo de arquivo de descricao de cena para POV-ray
// Last edited on 2010-03-04 15:44:01 by stolfi

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

background { color rgb <0.80, 0.80, 0.80> }

// ======================================================================
// DESCRIÇÃO DA CENA 
// Partes da cena:
#include "eixos.inc"
#include "colors.inc"

#declare espaco = 2;
#declare alturaIni = 6;
#declare alturaDesvio = 2;

#macro escreve(a)
    text {
        ttf "latinwd.ttf" a 0.01, 0
    }
#end

// Escreve as primeiras qtd letras
#macro primeiras_letras(texto, qtd)
    #local i = 1;

    union {
        #while (i <= qtd)
            object {
                escreve(substr(texto, i, 1))
                translate <i * espaco, 0, 0>
            }

            #local i = i + 1;
        #end
    }
#end

// Desenha uma letra chegando por cima
#macro letra_chegando(palavra, posletra, posini, desvio, frac, orientacao)
    #local fracBase = 0.4;
    #local fracDesvio = 0.7;
    object {
        escreve(substr(palavra, posletra, 1))
        pigment { color rgb <1 - frac, 1 - frac, 1 - frac> }

        #if (frac < fracBase)
            translate <espaco * posletra, orientacao * (posini - (posini * (frac + (1 - fracBase)))), 0>
        #else
            #if (frac < fracDesvio)
                translate <espaco * posletra, -1 * orientacao * desvio * ((frac - fracBase) / (fracDesvio - fracBase)), 0>
            #else
                translate <espaco * posletra, -1 * orientacao * (desvio - desvio * ((frac - fracBase) / (fracDesvio - fracBase))), 0> 
            #end
        #end
    }
#end

// Escreve o logotipo animado
#macro logotipo(texto, fase)
    #local n = strlen(texto);
    #local etapa = int(fase * n);
    #local frac = fase * n - etapa;
    #local letra = etapa + 1;
    #local orientacao = 1;

    union {
        // Escreve as letras que ja foram animadas
        primeiras_letras(texto, etapa)

        // Escreve a letra que esta chegando
        #if (mod(etapa, 2) = 0)
            #local orientacao = 1;
        #else
            #local orientacao = -1;
        #end

        letra_chegando(texto, letra, alturaIni, alturaDesvio, frac, orientacao)
    }

#end



// Aqui está a cena, finalmente:
union {
    object {
        logotipo("logotipo", clock)
    }

    rotate <0, 0, 180>
}

#include "camlight.inc"
#declare centro_cena = < -10.00, 0.00, 0.00 >;
#declare raio_cena = 30;
#declare dir_camera = < 0, 0.01, 5 >;
#declare dist_camera = 10.0;
#declare intens_luz = 1.00;
camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)