Jump to content
  • Advertisement

Archived

This topic is now archived and is closed to further replies.

vanunes

PROBLEMS with TEXTURE and .plg files !!!!

This topic is 5781 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Here is the problem.. I call a .plg file and a .bmp file to make a texture. The problem is that when i put the texture, it doesnt write the little details of the image... Like a car for example.. it doesnt write the windows, or the the door.. Can somebody see what is going wrong with my code.. I dont what else to do!!!! The problem i think is in the DrawScene function. #################################################### #################################################### #include <gl\glut.h> #include <stdlib.h> #include <windows.h> #include <stdio.h> #include <math.h> #include <dir.h> #define BUFFERSIZE 100 #define BLACK 0.0, 0.0, 0.0 #define WHITE 1.0, 1.0, 1.0 // ********* Tipos ********* typedef struct _worldPoint { double x, y, z; } WorldPoint; typedef double WorldType; typedef struct _TPolyDesc { int offset; BYTE vertexes; } TPolyDesc; // ********* Globais ********* GLfloat Branca[] = {1.0, 1.0, 1.0, 1.0}; // Cores e Posicao das Luzes GLfloat Cinza[] = {0.8, 0.8, 0.8, 1.0}; GLfloat PosLuz[] = {0.0, 1.0, 10.0, 1.0}; int VMODE = 0; // grid = 1, textura = 0 int NPOINTS, NPOLY; // numero de pontos, nro de polígonos WorldPoint V_POINTS[30000]; TPolyDesc V_POLYDESCS[50000]; // offset -> local no array POLYCOORDS onde o polígono inicia, int V_POLYCOORDS[200000]; // coordenadas dos polígonos static WorldType FOV = 89, ZN = 1.0, ZF = 1000; // Define a perspectiva int xsize = 600; // Dimensões da janela do programa int ysize = 600; float xMin, yMin, zMin, xMax, yMax, zMax, // da cena Zoom = -10.0; // Fator de zoom inicial int ROTX = 270, /* rotacao em x */ ROTZ = 270, /* rotacao em z */ ROTY = 0, /* rotacao em y */ pos_x =0, /* guarda posicao do mouse */ pos_y =0; /* guarda posicao do mouse */ GLuint texture[1]; // ID que o OpenGL da para a textura struct Image { // Imagem - contem altura, largura, e dado unsigned long sizeX; unsigned long sizeY; char *data; }; typedef struct Image Image; static int rotate = 0, saved_x, saved_y; GLuint filter; // Which Filter To Use /***********Salva a posição do ponteiro do mouse quando este é clicado********/ //Código baseado no código disponibilizado no site "nehe.gamedev.net" void salvaposicao(int button, int state, int x, int y) { switch(button){ case GLUT_LEFT_BUTTON: if (state == GLUT_DOWN) { saved_x = x; saved_y = y; rotate = 1; } else { rotate = 0; } break; } } /********** Calcula o angulo que o objeto rodou desde o ultimo update ************/ //Código baseado no código disponibilizado no site "nehe.gamedev.net" void rotacao(int x, int y) { if(rotate){ ROTY = (ROTY + (x - saved_x))%360; ROTX = (ROTX + (y - saved_y))%360; saved_x = x; saved_y = y; } glutPostRedisplay(); } // Carrega bitmap de 24 bits somente //Código baseado no código disponibilizado no site "nehe.gamedev.net" int CarregaBmp(char *filename, Image *image) { //LOAD THE BMP FILE FILE *file; unsigned long size; // size of the image in bytes. unsigned long i; // standard counter. unsigned short int planes; // number of planes in image (must be 1) unsigned short int bpp; // number of bits per pixel (must be 24) char temp; // temporary color storage for bgr-rgb conversion. // Verifica se o arquivo existe if ((file = fopen(filename, "rb"))==NULL) { printf("File Not Found : %s\n",filename); return 0; } fseek(file, 18, SEEK_CUR); // lendo a largura if ((i = fread(&image->sizeX, 4, 1, file)) != 1) { printf("Ocorreu erro lendo a largura do arquivo %s.\n", filename); return 0; } printf("Largura do arquivo %s: %lu\n", filename, image->sizeX); // lendo a altura if ((i = fread(&image->sizeY, 4, 1, file)) != 1) { printf("Ocorreu erro lendo a altura do arquivo %s.\n", filename); return 0; } printf("Altura do arquivo %s: %lu\n", filename, image->sizeY); // Claculando o tamanho (Assumindo 24 bits ou 3 bytes por pixel). size = image->sizeX * image->sizeY * 3; // Lendo os planos if ((fread(&planes, 2, 1, file)) != 1) { printf("Ocorreu erro lendo os,planos do arquivo %s.\n", filename); return 0; } if (planes != 1) { printf("Plano do arquivo %s não é 1: %u\n", filename, planes); return 0; } // Leando o bpp if ((i = fread(&bpp, 2, 1, file)) != 1) { printf("Ocorreu erro lendo o bpp do arquivo %s.\n", filename); return 0; } if (bpp != 24) { printf("Bpp do arquivo %s não é 24: %u\n", filename, bpp); return 0; } fseek(file, 24, SEEK_CUR); // Le os dados image->data = (char *) malloc(size); if (image->data == NULL) { printf("Ocorreu erro alcando memória para dados da imagem"); return 0; } if ((i = fread(image->data, size, 1, file)) != 1) { printf("Ocoreu erro lendo dados da imagem do arquivo %s.\n", filename); return 0; } for (i=0;i rgb) temp = image->data; image->data[i] = image->data[i+2]; image->data[i+2] = temp; } // FIM return 1; } // Load Bitmaps And Convert To Textures /Código baseado no código disponibilizado no site "nehe.gamedev.net" void CarregaTex() { /LOAD TEXTURE // Carrega Textura Image *image1; // Aloca espaço para textura image1 = (Image *) malloc(sizeof(Image)); if (image1 == NULL) { printf("Ocorreu erro alocando espaço para a imagem"); exit(0); } if (!CarregaBmp("coisa.BMP", image1)) { exit(1); } // Cria textura glGenTextures(1, &texture[0]); glBindTexture(GL_TEXTURE_2D, texture[0]); // 2d textura glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // escala linearmante quando a imagem é maior que a textura glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); // escala linearmante quando a imagem é menor que a textura glTexImage2D(GL_TEXTURE_2D, 0, 3, image1->sizeX, image1->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, image1->data); }; /*========================= DrawScene =====================================*/ void DrawScene (int n, WorldPoint * pts) { int i; int state = 0; //I THINK THE PROBLEM IS HERE glBegin(GL_POLYGON); for(i = 0; i < n; i++) { if (i == 0) { glTexCoord2f (0.0, 0.0); } else if (i == 1) { glTexCoord2f (0.0, 1.0); } else if (i == 2) { glTexCoord2f (1.0, 0.0); } else { glTexCoord2f (1.0, 1.0); } glVertex3f(pts[i].x, pts[i].y, pts[i].z); } glEnd(); } /*========================= displayStuff ================================*/ void displayStuff() { int i, j; WorldPoint v_coords[60]; // Pode desenhar polígonos com até 60 vértices // *********** FIGURA COM GRID *************** if (VMODE == 1) { glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glDisable(GL_LIGHTING); } // ************ FIGURA COM TEXTURA ************ else { //ILUMINAÇÃO glLightfv(GL_LIGHT0, GL_POSITION, PosLuz); glLightfv(GL_LIGHT0, GL_AMBIENT, Branca); glLightfv(GL_LIGHT0, GL_DIFFUSE, Cinza); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glEnable(GL_NORMALIZE); glEnable(GL_CULL_FACE); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable( GL_DEPTH_TEST ); } for (i = 0; i < NPOLY; i++) { for (j = 0; j < V_POLYDESCS[i].vertexes; j ++) { v_coords[j] = V_POINTS[V_POLYCOORDS[V_POLYDESCS[i].offset + j]]; } glBindTexture(GL_TEXTURE_2D, texture[0]); // Escolhe a textura a ser utilizada DrawScene(V_POLYDESCS[i].vertexes, v_coords); } } /*========================= init ========================================*/ void init (void) { CarregaTex(); //load texture glEnable(GL_TEXTURE_2D); // Permite mapeamento de textura // Fundo cinza glClearColor(0.4, 0.4, 0.4, 0.0); glClearDepth(1.0); glDepthFunc(GL_LESS); glEnable(GL_DEPTH_TEST); glShadeModel(GL_SMOOTH); xsize = 512; ysize = 512; glColor3f(WHITE); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(FOV, 1.0, ZN, ZF); glutMouseFunc(salvaposicao); glutMotionFunc(rotacao); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Bons cálculos de perspectiva glEnable(GL_LIGHT1); // Habilita a luz 1 glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } /*========================= redraw ======================================*/ void redraw () { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f(1, 1, 1); glLoadIdentity(); glPushMatrix(); glTranslatef(0.0, 0.0, Zoom); // Aplica o zoom determinado glRotatef(ROTX, 1.0, 0.0, 0.0); // Realizam a rotacao da cena glRotatef(ROTY, 0.0, 1.0, 0.0); glRotatef(ROTZ, 0.0, 0.0, 1.0); displayStuff(); glPopMatrix(); glutSwapBuffers(); } /*========================= reshape =====================================*/ void reshape (int w, int h) { xsize = w; ysize = h; glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(FOV, 1.0, ZN, ZF); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } /*========================= Exit =============================*/ void Exit (void) { exit(0); } /*==================================== LeArquivo ===================================*/ // Le os dados do aqruivo *.plg, que deve estar no mesmo diretorio do programa void LeArquivo(int argc, char *argv[]) //Read plg file { FILE *fin; char buffer [256]; int i; int pcindex = 0; int flagMode = 0; // 0 -> Lendo coordenadas, 1 -> Lendo poligonos int first = 1; // Erro : arquivo não especificado if (argc != 2) { MessageBox( 0, "Especifique na linha de comando\no nome do arquivo .plg a ser lido!", "Erro", MB_ICONERROR | MB_OK ); exit(1); } fin = fopen(argv[1], "r"); // Erro : arquivo não encontrado, provavelmente (pode ser erro de compartilhamento tb) if (!fin) { MessageBox(0, "Erro ao ler arquivo .plg.\nVerifique se o mesmo existe.", "Erro", MB_ICONERROR | MB_OK); exit(1); } NPOINTS = 0; NPOLY = 0; // Ler linhas até o fim do arquivo, ignorando linhas que comecem por letras (comentários) // Primeiramente lê linhas de vértices, ignorando os índices, pois eles são sequenciais, // até encontrar uma linha em branco, quando entra no "modo" de ler polígonos. Então, vai // guardando os polígonos lidos numa lista, tomando o cuidado de armazenar em uma outra // lista a posição de início e o tamanho do polígono, fazendo o programa não ficar limitado // a triângulos while (!feof(fin)) { buffer[0] = 0; fgets(&buffer[0], 256, fin); // Linha vazia: parar de ler coordenadas e começar a ler polígonos if (buffer[0] < 32) { flagMode = 1; continue; } // Ignorar comentários if (((buffer[0] >= ''a'') && (buffer[0] <= ''z'')) || ((buffer[0] >= ''A'') && (buffer[0] <= ''Z''))) { continue; } // leitura de polígonos if (flagMode == 1) { sscanf(&buffer[0], "%d", &V_POLYDESCS[NPOLY].vertexes); // Nro de vertices V_POLYDESCS[NPOLY].offset = pcindex; // Índice em que ele inicia for (i = 0; i < V_POLYDESCS[NPOLY].vertexes; i ++) { fscanf(fin, "%d", &V_POLYCOORDS[pcindex]); V_POLYCOORDS[pcindex] --; // O arquivo é "1 based" pcindex ++; } fgets(&buffer[0], 256, fin);; // Lendo newline e eventuais espaços no fim da linha NPOLY ++; } // leitura de pontos sequencialmente if (flagMode == 0) { // ignorando o índice, pois é sequencial if ( sscanf(&buffer[0], "%lf %lf %lf", &V_POINTS[NPOINTS].x, &V_POINTS[NPOINTS].y, &V_POINTS[NPOINTS].z ) == 3 ) { if (first) { xMax = V_POINTS[NPOINTS].x; yMax = V_POINTS[NPOINTS].y; zMax = V_POINTS[NPOINTS].z; xMin = V_POINTS[NPOINTS].x; yMin = V_POINTS[NPOINTS].y; zMin = V_POINTS[NPOINTS].z; first = 0; } else { // Redefinicao dos limites espaciais da cena if (V_POINTS[NPOINTS].x > xMax) xMax = V_POINTS[NPOINTS].x; else if (V_POINTS[NPOINTS].x < xMin) xMin = V_POINTS[NPOINTS].x; if (V_POINTS[NPOINTS].y > yMax) yMax = V_POINTS[NPOINTS].y; else if (V_POINTS[NPOINTS].y < yMin) yMin = V_POINTS[NPOINTS].y; if (V_POINTS[NPOINTS].z > zMax) zMax = V_POINTS[NPOINTS].z; else if (V_POINTS[NPOINTS].z < zMin) zMin = V_POINTS[NPOINTS].z; } NPOINTS ++; } } } fclose(fin); } /*========================= InOut =============================*/ void InOut (int D) { if (D) { if (Zoom < -1) Zoom += 3; } else if (Zoom > -49) Zoom -= 3; glutPostRedisplay(); } /*========================= keyboardHandler =============================*/ void keyboardHandler (unsigned char key, int x, int y) { int dif = 5; switch(key) { case ''q'' : Exit(); break; case ''X'' : ROTX = (ROTX + 18) % 360; break; case ''x'' : ROTX = (ROTX - 18) % 360; break; case ''Y'' : ROTY = (ROTY + 18) % 360; break; case ''y'' : ROTY = (ROTY - 18) % 360; break; case ''Z'' : ROTZ = (ROTZ + 18) % 360; break; case ''z'' : ROTZ = (ROTZ - 18) % 360; break; case ''I'' : case ''i'' : InOut(1); break; case ''O'' : case ''o'' : InOut(0); break; case ''w'' : case ''W'' : VMODE = (VMODE)? 0 : 1; break; case ''p'' : PosLuz[0] += 1; break; case ''u'' : PosLuz[0] -= 1; break; case ''l'' : PosLuz[1] += 1; break; case ''k'' : PosLuz[1] -= 1; break; case ''m'' : PosLuz[2] += 1; break; case ''n'' : PosLuz[2] -= 1; break; case ''1'' : ROTX += dif; break; //SPIN case ''4'' : ROTX -= dif; break; //SPIN case ''2'' : ROTY += dif; break; //TILT case ''5'' : ROTY -= dif; break; //TILT case ''3'' : ROTZ += dif; break; //BACK case ''6'' : ROTZ -= dif; break; //BACK } redraw(); } /*========================= main ========================================*/ int main (int argc, char *argv[]) { LeArquivo(argc, argv); glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA); glutInitWindowPosition(0, 0); glutInitWindowSize(xsize, ysize); glutCreateWindow("Trabalho III de CompGraf"); init(); glutKeyboardFunc(keyboardHandler); glutDisplayFunc(redraw); glutReshapeFunc(reshape); glutMainLoop(); return (1); } #################################################### ####################################################

Share this post


Link to post
Share on other sites
Advertisement

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!