#include #include #include #include #include "varios.hpp" #include "objeto.hpp" #include "material.hpp" #include "camara.hpp" #include "cenario.hpp" #include "luz.hpp" #include "io.hpp" bool SalvaPPM( int linhas, int colunas, int cores, Cor_rgb pix[], char arquivo[255]) { FILE * arqppm; int i,j, indice; strcat(arquivo,".ppm"); if ((arqppm = fopen(arquivo, "wb")) == NULL) { printf("\nNão foi possivel abrir o arquivo %s\n",arquivo); return false; } //cabeçalho de um arquivo .ppm fprintf(arqppm,"P6\n%d %d\n%d\n", colunas, linhas, cores); //gravando invertendo as linhas: for ( i=linhas-1; i>=0; i-- ) for ( j=0; jRecebeFundo(cor1); return; case tok_SURFACE: cor1.Copia(LeCor(linha)); //Cor da iluminação cor_ambiente v = Dispensa(linha,3); cor2.Copia(LeCor(&linha[v])); //Cor da difusa v += Dispensa(&linha[v],3); cor3.Copia(LeCor(&linha[v])); //Cor da especular v += Dispensa(&linha[v],3); sscanf(&linha[v],"%d. %f %f %f",&a,&e,&f,&g); mat1 = new Material( cor1, cor2, cor3, a, e, f, g ); hcenario->InsereMaterial( mat1 ); return; case tok_LIGHT: vet1.Copia(LeVetor(linha)); //Posição v = Dispensa(linha,3); sscanf(&linha[v],"%d %d %d",&a,&b,&c); //Esta cor não pode ser lida como as demais por não ter '.' cor1.Atribui(a, b, c); //Cor luz1 = new Luz( vet1, cor1 ); hcenario->InsereLuz( luz1 ); return; case tok_SPHERE: sscanf(linha,"%d",&a); v = Dispensa(linha,1); sscanf(&linha[v],"%f",&e); //Raio v += Dispensa(&linha[v],1); vet1.Copia(LeVetor(&linha[v])); //Centro esf1 = new Esfera( a, e, vet1 ); hcenario->InsereObjeto( esf1 ); return; case tok_BOX: sscanf(linha,"%d",&a); v = Dispensa(linha,1); vet1.Copia(LeVetor(&linha[v])); //canto inferior esquerdo v += Dispensa(&linha[v],3); vet2.Copia(LeVetor(&linha[v])); //canto superior direito cxp1 = new CaixaParalela( a, vet1, vet2 ); hcenario->InsereObjeto( cxp1 ); return; case tok_TRIANGLE: sscanf(linha,"%d",&a); v = Dispensa(linha,1); vets[0].Copia(LeVetor(&linha[v]));//primeiro vértice v += Dispensa(&linha[v],3); vets[1].Copia(LeVetor(&linha[v]));//segundo vértice v += Dispensa(&linha[v],3); vets[2].Copia(LeVetor(&linha[v]));//terceiro vértice tri1 = new Triangulo( a, vets ); hcenario->InsereObjeto( tri1 ); return; case tok_POSITION: vet1.Copia(LeVetor(linha)); //eye v = Dispensa(linha,3); vet2.Copia(LeVetor(&linha[v])); //ref v += Dispensa(&linha[v],3); vet3.Copia(LeVetor(&linha[v])); //up hcamara->Atribui( vet1, vet2, vet3, *hlinhas, *hcolunas ); return; case tok_DESCONHECIDO: return; } } //quantos = quantos números serão dispensados int Dispensa(char *linha, int quantos) { int i=0; while (quantos>0) { i++; if (linha[i]==' ') { quantos--; while (linha[++i]==' '); } } return i; } //As duas funções abaixo são apenas facilitadoras na leitura Cor_rgb LeCor(char *linha) { Cor_rgb cor; int a,b,c; sscanf(linha,"%d. %d. %d.",&a,&b,&c); cor.Atribui(a,b,c); return cor; } Vetor_3D LeVetor(char *linha) { Vetor_3D vet; float a,b,c; sscanf(linha,"%f %f %f",&a,&b,&c); vet.Atribui(a,b,c); return vet; }