Código:
#include <windows.h> #include <C:\GLUT\include\GL\glut.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <math.h> int alto=256,ancho=256;//dim imagen GLfloat angle = 0; GLfloat angle2 = 0; int moving, startx, starty; unsigned char * textura1; unsigned char * textura2; unsigned char * textura3; unsigned char * textura4; unsigned char * textura5; unsigned char * textura6; int leerImagen1(){ FILE *imagen; imagen = fopen("C:/Users/migue/Dropbox/8vo Semestre/Graficación/3D/MapCubeFig/cMap1.raw","r"); textura1 = (unsigned char*)malloc( ancho*alto*3 ); if( imagen == NULL ){ printf("Error: No imagen"); return 0; } fread( textura1, ancho*alto*3, 1, imagen); fclose(imagen); return 1; } int leerImagen2(){ FILE *imagen; imagen = fopen("C:/Users/migue/Dropbox/8vo Semestre/Graficación/3D/MapCubeFig/cMap2.raw","r"); textura2 = (unsigned char*)malloc( ancho*alto*3 ); if( imagen == NULL ){ printf("Error: No imagen"); return 0; } fread( textura2, ancho*alto*3, 1, imagen); fclose(imagen); return 1; } int leerImagen3(){ FILE *imagen; imagen = fopen("C:/Users/migue/Dropbox/8vo Semestre/Graficación/3D/MapCubeFig/cMap3.raw","r"); textura3 = (unsigned char*)malloc( ancho*alto*3 ); if( imagen == NULL ){ printf("Error: No imagen"); return 0; } fread( textura3, ancho*alto*3, 1, imagen); fclose(imagen); return 1; } int leerImagen4(){ FILE *imagen; imagen = fopen("C:/Users/migue/Dropbox/8vo Semestre/Graficación/3D/MapCubeFig/cMap4.raw","r"); textura4 = (unsigned char*)malloc( ancho*alto*3 ); if( imagen == NULL ){ printf("Error: No imagen"); return 0; } fread( textura4, ancho*alto*3, 1, imagen); fclose(imagen); return 1; } int leerImagen5(){ FILE *imagen; imagen = fopen("C:/Users/migue/Dropbox/8vo Semestre/Graficación/3D/MapCubeFig/cMap5.raw","r"); textura5 = (unsigned char*)malloc( ancho*alto*3 ); if( imagen == NULL ){ printf("Error: No imagen"); return 0; } fread( textura5, ancho*alto*3, 1, imagen); fclose(imagen); return 1; } int leerImagen6(){ FILE *imagen; imagen = fopen("C:/Users/migue/Dropbox/8vo Semestre/Graficación/3D/MapCubeFig/cMap6.raw","r"); textura6 = (unsigned char*)malloc( ancho*alto*3 ); if( imagen == NULL ){ printf("Error: No imagen"); return 0; } fread( textura6, ancho*alto*3, 1, imagen); fclose(imagen); return 1; } void usarTextura1(void) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, ancho, alto, 0, GL_RGB, GL_UNSIGNED_BYTE, textura1); } void usarTextura2(void) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, ancho, alto, 0, GL_RGB, GL_UNSIGNED_BYTE, textura2); } void usarTextura3(void) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, ancho, alto, 0, GL_RGB, GL_UNSIGNED_BYTE, textura3); } void usarTextura4(void) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, ancho, alto, 0, GL_RGB, GL_UNSIGNED_BYTE, textura4); } void usarTexturaBase(void) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, ancho, alto, 0, GL_RGB, GL_UNSIGNED_BYTE, textura5); } void usarTexturaTapa(void) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, ancho, alto, 0, GL_RGB, GL_UNSIGNED_BYTE, textura6); } // cubemap variables int d1 = 10; int d2 = 20; static GLint verticesPiso[4][3] = { { -d1, 0, -d1 }, { d1, 0, -d1 }, { d1, 0, d1 }, { -d1, 0, d1 }, }; static GLint pared1Vertices[4][3] = { { -d1,d2, d1}, { -d1,0, d1}, { d1,0, d1}, { d1,d2, d1}, }; static GLint pared2Vertices[4][3] = { { d1,d2, d1}, { d1,0, d1}, { d1,0, -d1}, { d1,d2,-d1}, }; static GLint pared3Vertices[4][3] = { { d1,d2,-d1 }, { d1,0,-d1 }, { -d1,0,-d1 }, { -d1,d2,-d1}, }; static GLint pared4Vertices[4][3] = { { -d1,d2,-d1}, { -d1,0,-d1 }, { -d1,0,d1 }, { -d1,d2,d1}, }; static GLint techoVertices[4][3] = { { d1,d2,-d1}, { -d1,d2,-d1 }, { -d1,d2,d1 }, { d1,d2,d1}, }; void dibujaBase(void) { usarTexturaBase(); glBegin(GL_QUADS); glTexCoord2f( 0.0, 0.0); // esta dibuja la textura sobre lo siguiente glVertex3iv(verticesPiso[0]); glTexCoord2f(0.0, 1); glVertex3iv(verticesPiso[1]); glTexCoord2f(1, 1); glVertex3iv(verticesPiso[2]); glTexCoord2f(1, 0.0); glVertex3iv(verticesPiso[3]); glEnd(); } void dibujaPared1c(void) { usarTextura1(); glBegin(GL_QUADS); glTexCoord2f(0.0, 0.0); glVertex3iv(pared1Vertices[0]); glTexCoord2f(0.0, 1.0); glVertex3iv(pared1Vertices[1]); glTexCoord2f(1.0, 1.0); glVertex3iv(pared1Vertices[2]); glTexCoord2f(1.0, 0.0); glVertex3iv(pared1Vertices[3]); glEnd(); } void dibujaPared2c(void) { usarTextura2(); glBegin(GL_QUADS); glTexCoord2f(0.0, 0.0); glVertex3iv(pared2Vertices[0]); glTexCoord2f(0.0, 1.0); glVertex3iv(pared2Vertices[1]); glTexCoord2f(1.0, 1.0); glVertex3iv(pared2Vertices[2]); glTexCoord2f(1.0, 0.0); glVertex3iv(pared2Vertices[3]); glEnd(); } void dibujaPared3c(void) { usarTextura3(); glBegin(GL_QUADS); glTexCoord2f(0.0, 0.0); glVertex3iv(pared3Vertices[0]); glTexCoord2f(0.0, 1.0); glVertex3iv(pared3Vertices[1]); glTexCoord2f(1.0, 1.0); glVertex3iv(pared3Vertices[2]); glTexCoord2f(1.0, 0.0); glVertex3iv(pared3Vertices[3]); glEnd(); } void dibujaPared4c(void) { usarTextura4(); glBegin(GL_QUADS); glTexCoord2f(0.0, 0.0); glVertex3iv(pared4Vertices[0]); glTexCoord2f(0.0, 1.0); glVertex3iv(pared4Vertices[1]); glTexCoord2f(1.0, 1.0); glVertex3iv(pared4Vertices[2]); glTexCoord2f(1.0, 0.0); glVertex3iv(pared4Vertices[3]); glEnd(); } void dibujaTapac(void) { usarTexturaTapa(); glBegin(GL_QUADS); glTexCoord2f(0.0, 0.0); glVertex3iv(techoVertices[0]); glTexCoord2f(0.0, 1.0); glVertex3iv(techoVertices[1]); glTexCoord2f(1.0, 1.0); glVertex3iv(techoVertices[2]); glTexCoord2f(1.0, 0.0); glVertex3iv(techoVertices[3]); glEnd(); } ////////////////////////////////////////////////// void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); // El ultimo del buffer STENCIL glPushMatrix(); glRotatef(angle2, 1.0, 0.0, 0.0); //move mouse glRotatef(angle, 0.0, 1.0, 0.0); glPushMatrix(); glTranslatef(0,-10, 0); // El -10 es porque el cubo se hizo a patir desde la base dibujaBase(); dibujaPared1c(); dibujaPared2c(); dibujaPared3c(); dibujaPared4c(); dibujaTapac(); glPopMatrix(); glPopMatrix(); glutSwapBuffers(); } void mouse(int button, int state, int x, int y) { if (button == GLUT_LEFT_BUTTON) { if (state == GLUT_DOWN) { moving = 1; startx = x; starty = y; } if (state == GLUT_UP) { moving = 0; } } } void mover(int x, int y) { if (moving) { angle = angle + (x - startx); angle2 = angle2 + (y - starty); startx = x; starty = y; glutPostRedisplay(); } } int main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH | GLUT_STENCIL | GLUT_MULTISAMPLE); glutInitWindowSize( 480, 360); glutCreateWindow("CAJA TEXTURAS"); leerImagen1(); leerImagen2(); leerImagen3(); leerImagen4(); leerImagen5(); leerImagen6(); glutDisplayFunc(display); glutMouseFunc(mouse); glutMotionFunc(mover); glEnable(GL_DEPTH_TEST);//////////HABILITAR glEnable(GL_TEXTURE_2D); gluPerspective(40.0,1.333,0.1,200.0); //16/10=1.6 5/4=1.25 1.333 porque la resolucion es de 640x480 glMatrixMode(GL_MODELVIEW); /* El primero para posicionar la camara, el siguiente es para decir hacia donde ve la camara, el ultimo es para cambiar la posicion u orientacion de la camara */ gluLookAt(0.0, 0.0, 10.0, /* camara en (0,20,60) */ 0,0,0, /* mira a (x,y,z) */ 0, 1, 0); /* altura en Y (0,1,0) o en x Y (1,0,0) */ glutMainLoop(); return 0; }
No hay comentarios.:
Publicar un comentario