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