#include #include #include #include #include "varios.hpp" #include "objetos.hpp" #include "materiais.hpp" #include "camara.hpp" #include "cenario.hpp" #include "luzes.hpp" #include "leitura.hpp" const int MAX_LINHA = 255; //-------------------- //* enumerados #Enumerados# //* O _tok_ enumera as opções de token do arquivo de entrada. typedef enum { tok_DESCONHECIDO = 0, tok_SCENE, tok_MATERIAL, tok_LIGHT, tok_SPHERE, tok_BOX, tok_TRIANGLE, tok_CAMERA }tok; //Reconhece o token static tok Token(char *buffer) { if(!strncmp(buffer,"SCENE", 5)) return tok_SCENE; if(!strncmp(buffer,"CAMERA", 6)) return tok_CAMERA; if(!strncmp(buffer,"TRIANGLE", 8)) return tok_TRIANGLE; if(!strncmp(buffer,"MATERIAL", 7)) return tok_MATERIAL; if(!strncmp(buffer,"SPHERE", 6)) return tok_SPHERE; if(!strncmp(buffer,"LIGHT", 5)) return tok_LIGHT; if(!strncmp(buffer,"BOX", 3)) return tok_BOX; return tok_DESCONHECIDO; } static void LeInfo( tok tag, Cenario **cenario, Camara **camera, FILE *fp ) { char buffer[MAX_LINHA+1]; switch(tag) { case tok_CAMERA: *camera = new Camara( fp ); return; case tok_SCENE: *cenario = new Cenario( fp ); return; case tok_MATERIAL: (*cenario)->InsereMaterial( new Material( fp ) ); return; case tok_LIGHT: (*cenario)->InsereLuz( new Luz( fp ) ); return; case tok_SPHERE: (*cenario)->InsereObjeto( new Esfera( fp ) ); return; case tok_BOX: (*cenario)->InsereObjeto( new CaixaParalela( fp ) ); return; case tok_TRIANGLE: (*cenario)->InsereObjeto( new Triangulo( fp ) ); return; case tok_DESCONHECIDO: fgets( buffer, MAX_LINHA, fp ); return; } } bool LeArquivo( Cenario ** cenario, Camara ** camera, char *arquivo) { FILE * arqdat, * arqtmp; tok tag; char buffer[MAX_LINHA+1],arqname[MAX_LINHA]; Vetor_3D vets[6]; bool grava=false; printf("\nNome do arquivo de entrada (sem a extensao .rt2):"); scanf("%s",arqname); strcpy(arquivo, arqname); // preserva "arquivo" para gravação strcat(arqname,".rt2"); // arquivo de dados if ((arqdat = fopen(arqname, "rt")) == NULL) { printf("\nNao foi possivel abrir o arquivo de entrada %s\n", arqname); return false; } // copia o arquivo de dados para um temporario eliminando comentarios e linhas em branco strcpy(arqname,arquivo); // restaura o nome do arquivo com o path strcat(arqname,"tmp.txt"); if ((arqtmp = fopen(arqname, "w+t")) == NULL) { printf("\nNão foi possivel abrir o arquivo %s\n",arqname); return false; } while ( !feof( arqdat ) ) { unsigned int i; fgets( buffer, MAX_LINHA, arqdat ); grava=false; for (i = 0; (buffer[i]!='!' && buffer[i]!=';' && i < strlen(buffer)); i++) { if (buffer[i]!=' ' && buffer[i]!='\n') grava=true; } if (buffer[i]=='!'||buffer[i]==';') { buffer[i]='\n'; buffer[i+1]='\0'; } if (grava) fputs( buffer, arqtmp ); buffer[0] = '\0'; } fclose(arqdat); rewind( arqtmp ); fgets( buffer, MAX_LINHA, arqtmp ); if(strncmp(buffer,"RT 2.0",6)) { printf("\nO arquivo de entrada nao tem o formato RT 2.0\n"); return false; } //Loop para leitura das linhas do arquivo tag = tok_DESCONHECIDO; while ( !feof( arqtmp ) ) { char prox_char; fscanf( arqtmp, "%1s", &prox_char ); if (prox_char == '#') { fgets( buffer, MAX_LINHA, arqtmp ); tag = Token(buffer); } else { ungetc( prox_char, arqtmp ); LeInfo( tag, cenario, camera, arqtmp ); } } fclose(arqtmp); printf("\nArquivo %s lido.\n", arquivo); return true; }